mergeFromCodedBufferReader method

  1. @override
void mergeFromCodedBufferReader(
  1. CodedBufferReader input, [
  2. ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY
])
inherited

Same as mergeFromBuffer, but takes a CodedBufferReader input.

Implementation

@override
void mergeFromCodedBufferReader(
  CodedBufferReader input, [
  ExtensionRegistry extensionRegistry = ExtensionRegistry.EMPTY,
]) {
  // Parse items. The field for the items looks like:
  //
  //   repeated group Item items = 1;
  //
  // Since message sets are compatible with proto1 items can't be packed.
  while (true) {
    final tag = input.readTag();
    final tagNumber = getTagFieldNumber(tag);

    if (tag == 0) {
      break; // End of input.
    }

    if (tagNumber != _messageSetItemsTag) {
      if (!input.skipField(tag)) {
        break; // End of group.
      } else {
        continue;
      }
    }

    // Parse an item. An item is a message with two fields:
    //
    //   message Item {
    //     int32 type_id = 2;
    //     Message message = 3;
    //   }
    //
    // We can see the fields in any order, so loop until parsing both fields.
    int? typeId;
    Uint8List? message;
    while (true) {
      final tag = input.readTag();
      final tagNumber = getTagFieldNumber(tag);

      if (tag == 0) {
        break; // End of input.
      }

      if (tagNumber == _messageSetItemTypeIdTag) {
        typeId = input.readInt32();
        if (message != null) {
          _parseExtension(typeId, message, extensionRegistry);
          typeId = null;
          message = null;
        }
      } else if (tagNumber == _messageSetItemMessageTag) {
        message = input.readBytesAsView();
        if (typeId != null) {
          _parseExtension(typeId, message, extensionRegistry);
          typeId = null;
          message = null;
        }
      } else {
        // Skip unknown tags. If we're at the end of the group consume the
        // EGROUP tag.
        if (!input.skipField(tag)) {
          break; // End of group.
        }
      }
    }
  }
}