mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
544 lines
20 KiB
Objective-C
544 lines
20 KiB
Objective-C
// Copyright 2008 Cyrus Najmabadi
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#import "ConcreteExtensionField.h"
|
|
#import "CodedOutputStream.h"
|
|
#import "CodedInputStream.h"
|
|
#import "Message_Builder.h"
|
|
#import "Message.h"
|
|
#import "ExtendableMessage_Builder.h"
|
|
|
|
@interface PBConcreteExtensionField()
|
|
@property PBExtensionType type;
|
|
@property Class extendedClass;
|
|
@property int32_t fieldNumber;
|
|
@property (retain) id defaultValue;
|
|
@property Class messageOrGroupClass;
|
|
@property BOOL isRepeated;
|
|
@property BOOL isPacked;
|
|
@property BOOL isMessageSetWireFormat;
|
|
@end
|
|
|
|
@implementation PBConcreteExtensionField
|
|
|
|
@synthesize type;
|
|
@synthesize extendedClass;
|
|
@synthesize fieldNumber;
|
|
@synthesize defaultValue;
|
|
@synthesize messageOrGroupClass;
|
|
@synthesize isRepeated;
|
|
@synthesize isPacked;
|
|
@synthesize isMessageSetWireFormat;
|
|
|
|
- (void) dealloc {
|
|
self.type = 0;
|
|
self.extendedClass = nil;
|
|
self.fieldNumber = 0;
|
|
self.defaultValue = nil;
|
|
self.messageOrGroupClass = nil;
|
|
self.isRepeated = NO;
|
|
self.isPacked = NO;
|
|
self.isMessageSetWireFormat = NO;
|
|
}
|
|
|
|
|
|
- (id) initWithType:(PBExtensionType) type_
|
|
extendedClass:(Class) extendedClass_
|
|
fieldNumber:(int32_t) fieldNumber_
|
|
defaultValue:(id) defaultValue_
|
|
messageOrGroupClass:(Class) messageOrGroupClass_
|
|
isRepeated:(BOOL) isRepeated_
|
|
isPacked:(BOOL) isPacked_
|
|
isMessageSetWireFormat:(BOOL) isMessageSetWireFormat_ {
|
|
if ((self = [super init])) {
|
|
self.type = type_;
|
|
self.extendedClass = extendedClass_;
|
|
self.fieldNumber = fieldNumber_;
|
|
self.defaultValue = defaultValue_;
|
|
self.messageOrGroupClass = messageOrGroupClass_;
|
|
self.isRepeated = isRepeated_;
|
|
self.isPacked = isPacked_;
|
|
self.isMessageSetWireFormat = isMessageSetWireFormat_;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
|
|
+ (PBConcreteExtensionField*) extensionWithType:(PBExtensionType) type
|
|
extendedClass:(Class) extendedClass
|
|
fieldNumber:(int32_t) fieldNumber
|
|
defaultValue:(id) defaultValue
|
|
messageOrGroupClass:(Class) messageOrGroupClass
|
|
isRepeated:(BOOL) isRepeated
|
|
isPacked:(BOOL) isPacked
|
|
isMessageSetWireFormat:(BOOL) isMessageSetWireFormat {
|
|
return [[PBConcreteExtensionField alloc] initWithType:type
|
|
extendedClass:extendedClass
|
|
fieldNumber:fieldNumber
|
|
defaultValue:defaultValue
|
|
messageOrGroupClass:messageOrGroupClass
|
|
isRepeated:isRepeated
|
|
isPacked:isPacked
|
|
isMessageSetWireFormat:isMessageSetWireFormat];
|
|
}
|
|
|
|
|
|
- (PBWireFormat) wireType {
|
|
if (isPacked) {
|
|
return PBWireFormatLengthDelimited;
|
|
}
|
|
|
|
switch (type) {
|
|
case PBExtensionTypeBool: return PBWireFormatVarint;
|
|
case PBExtensionTypeFixed32: return PBWireFormatFixed32;
|
|
case PBExtensionTypeSFixed32: return PBWireFormatFixed32;
|
|
case PBExtensionTypeFloat: return PBWireFormatFixed32;
|
|
case PBExtensionTypeFixed64: return PBWireFormatFixed64;
|
|
case PBExtensionTypeSFixed64: return PBWireFormatFixed64;
|
|
case PBExtensionTypeDouble: return PBWireFormatFixed64;
|
|
case PBExtensionTypeInt32: return PBWireFormatVarint;
|
|
case PBExtensionTypeInt64: return PBWireFormatVarint;
|
|
case PBExtensionTypeSInt32: return PBWireFormatVarint;
|
|
case PBExtensionTypeSInt64: return PBWireFormatVarint;
|
|
case PBExtensionTypeUInt32: return PBWireFormatVarint;
|
|
case PBExtensionTypeUInt64: return PBWireFormatVarint;
|
|
case PBExtensionTypeBytes: return PBWireFormatLengthDelimited;
|
|
case PBExtensionTypeString: return PBWireFormatLengthDelimited;
|
|
case PBExtensionTypeMessage: return PBWireFormatLengthDelimited;
|
|
case PBExtensionTypeGroup: return PBWireFormatStartGroup;
|
|
case PBExtensionTypeEnum: return PBWireFormatVarint;
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
BOOL typeIsFixedSize(PBExtensionType type);
|
|
BOOL typeIsFixedSize(PBExtensionType type) {
|
|
switch (type) {
|
|
case PBExtensionTypeBool:
|
|
case PBExtensionTypeFixed32:
|
|
case PBExtensionTypeSFixed32:
|
|
case PBExtensionTypeFloat:
|
|
case PBExtensionTypeFixed64:
|
|
case PBExtensionTypeSFixed64:
|
|
case PBExtensionTypeDouble:
|
|
return YES;
|
|
default:
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
|
|
int32_t typeSize(PBExtensionType type);
|
|
int32_t typeSize(PBExtensionType type) {
|
|
switch (type) {
|
|
case PBExtensionTypeBool:
|
|
return 1;
|
|
case PBExtensionTypeFixed32:
|
|
case PBExtensionTypeSFixed32:
|
|
case PBExtensionTypeFloat:
|
|
return 4;
|
|
case PBExtensionTypeFixed64:
|
|
case PBExtensionTypeSFixed64:
|
|
case PBExtensionTypeDouble:
|
|
return 8;
|
|
default:
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
}
|
|
|
|
|
|
- (void) writeSingleValue:(id) value
|
|
includingTagToCodedOutputStream:(PBCodedOutputStream*) output {
|
|
switch (type) {
|
|
case PBExtensionTypeBool:
|
|
[output writeBool:fieldNumber value:[value boolValue]];
|
|
return;
|
|
case PBExtensionTypeFixed32:
|
|
[output writeFixed32:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeSFixed32:
|
|
[output writeSFixed32:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeFloat:
|
|
[output writeFloat:fieldNumber value:[value floatValue]];
|
|
return;
|
|
case PBExtensionTypeFixed64:
|
|
[output writeFixed64:fieldNumber value:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeSFixed64:
|
|
[output writeSFixed64:fieldNumber value:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeDouble:
|
|
[output writeDouble:fieldNumber value:[value doubleValue]];
|
|
return;
|
|
case PBExtensionTypeInt32:
|
|
[output writeInt32:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeInt64:
|
|
[output writeInt64:fieldNumber value:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeSInt32:
|
|
[output writeSInt32:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeSInt64:
|
|
[output writeSInt64:fieldNumber value:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeUInt32:
|
|
[output writeUInt32:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeUInt64:
|
|
[output writeUInt64:fieldNumber value:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeBytes:
|
|
[output writeData:fieldNumber value:value];
|
|
return;
|
|
case PBExtensionTypeString:
|
|
[output writeString:fieldNumber value:value];
|
|
return;
|
|
case PBExtensionTypeGroup:
|
|
[output writeGroup:fieldNumber value:value];
|
|
return;
|
|
case PBExtensionTypeEnum:
|
|
[output writeEnum:fieldNumber value:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeMessage:
|
|
if (isMessageSetWireFormat) {
|
|
[output writeMessageSetExtension:fieldNumber value:value];
|
|
} else {
|
|
[output writeMessage:fieldNumber value:value];
|
|
}
|
|
return;
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
- (void) writeSingleValue:(id) value
|
|
noTagToCodedOutputStream:(PBCodedOutputStream*) output {
|
|
switch (type) {
|
|
case PBExtensionTypeBool:
|
|
[output writeBoolNoTag:[value boolValue]];
|
|
return;
|
|
case PBExtensionTypeFixed32:
|
|
[output writeFixed32NoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeSFixed32:
|
|
[output writeSFixed32NoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeFloat:
|
|
[output writeFloatNoTag:[value floatValue]];
|
|
return;
|
|
case PBExtensionTypeFixed64:
|
|
[output writeFixed64NoTag:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeSFixed64:
|
|
[output writeSFixed64NoTag:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeDouble:
|
|
[output writeDoubleNoTag:[value doubleValue]];
|
|
return;
|
|
case PBExtensionTypeInt32:
|
|
[output writeInt32NoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeInt64:
|
|
[output writeInt64NoTag:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeSInt32:
|
|
[output writeSInt32NoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeSInt64:
|
|
[output writeSInt64NoTag:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeUInt32:
|
|
[output writeUInt32NoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeUInt64:
|
|
[output writeUInt64NoTag:[value longLongValue]];
|
|
return;
|
|
case PBExtensionTypeBytes:
|
|
[output writeDataNoTag:value];
|
|
return;
|
|
case PBExtensionTypeString:
|
|
[output writeStringNoTag:value];
|
|
return;
|
|
case PBExtensionTypeGroup:
|
|
[output writeGroupNoTag:fieldNumber value:value];
|
|
return;
|
|
case PBExtensionTypeEnum:
|
|
[output writeEnumNoTag:[value intValue]];
|
|
return;
|
|
case PBExtensionTypeMessage:
|
|
[output writeMessageNoTag:value];
|
|
return;
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
- (int32_t) computeSingleSerializedSizeNoTag:(id) value {
|
|
switch (type) {
|
|
case PBExtensionTypeBool: return computeBoolSizeNoTag([value boolValue]);
|
|
case PBExtensionTypeFixed32: return computeFixed32SizeNoTag([value intValue]);
|
|
case PBExtensionTypeSFixed32: return computeSFixed32SizeNoTag([value intValue]);
|
|
case PBExtensionTypeFloat: return computeFloatSizeNoTag([value floatValue]);
|
|
case PBExtensionTypeFixed64: return computeFixed64SizeNoTag([value longLongValue]);
|
|
case PBExtensionTypeSFixed64: return computeSFixed64SizeNoTag([value longLongValue]);
|
|
case PBExtensionTypeDouble: return computeDoubleSizeNoTag([value doubleValue]);
|
|
case PBExtensionTypeInt32: return computeInt32SizeNoTag([value intValue]);
|
|
case PBExtensionTypeInt64: return computeInt64SizeNoTag([value longLongValue]);
|
|
case PBExtensionTypeSInt32: return computeSInt32SizeNoTag([value intValue]);
|
|
case PBExtensionTypeSInt64: return computeSInt64SizeNoTag([value longLongValue]);
|
|
case PBExtensionTypeUInt32: return computeUInt32SizeNoTag([value intValue]);
|
|
case PBExtensionTypeUInt64: return computeUInt64SizeNoTag([value longLongValue]);
|
|
case PBExtensionTypeBytes: return computeDataSizeNoTag(value);
|
|
case PBExtensionTypeString: return computeStringSizeNoTag(value);
|
|
case PBExtensionTypeGroup: return computeGroupSizeNoTag(value);
|
|
case PBExtensionTypeEnum: return computeEnumSizeNoTag([value intValue]);
|
|
case PBExtensionTypeMessage: return computeMessageSizeNoTag(value);
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
- (int32_t) computeSingleSerializedSizeIncludingTag:(id) value {
|
|
switch (type) {
|
|
case PBExtensionTypeBool: return computeBoolSize(fieldNumber, [value boolValue]);
|
|
case PBExtensionTypeFixed32: return computeFixed32Size(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeSFixed32: return computeSFixed32Size(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeFloat: return computeFloatSize(fieldNumber, [value floatValue]);
|
|
case PBExtensionTypeFixed64: return computeFixed64Size(fieldNumber, [value longLongValue]);
|
|
case PBExtensionTypeSFixed64: return computeSFixed64Size(fieldNumber, [value longLongValue]);
|
|
case PBExtensionTypeDouble: return computeDoubleSize(fieldNumber, [value doubleValue]);
|
|
case PBExtensionTypeInt32: return computeInt32Size(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeInt64: return computeInt64Size(fieldNumber, [value longLongValue]);
|
|
case PBExtensionTypeSInt32: return computeSInt32Size(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeSInt64: return computeSInt64Size(fieldNumber, [value longLongValue]);
|
|
case PBExtensionTypeUInt32: return computeUInt32Size(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeUInt64: return computeUInt64Size(fieldNumber, [value longLongValue]);
|
|
case PBExtensionTypeBytes: return computeDataSize(fieldNumber, value);
|
|
case PBExtensionTypeString: return computeStringSize(fieldNumber, value);
|
|
case PBExtensionTypeGroup: return computeGroupSize(fieldNumber, value);
|
|
case PBExtensionTypeEnum: return computeEnumSize(fieldNumber, [value intValue]);
|
|
case PBExtensionTypeMessage:
|
|
if (isMessageSetWireFormat) {
|
|
return computeMessageSetExtensionSize(fieldNumber, value);
|
|
} else {
|
|
return computeMessageSize(fieldNumber, value);
|
|
}
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
- (void) writeRepeatedValues:(NSArray*) values
|
|
includingTagsToCodedOutputStream:(PBCodedOutputStream*) output {
|
|
if (isPacked) {
|
|
[output writeTag:fieldNumber format:PBWireFormatLengthDelimited];
|
|
int32_t dataSize = 0;
|
|
if (typeIsFixedSize(type)) {
|
|
dataSize = (int32_t)values.count * typeSize(type);
|
|
} else {
|
|
for (id value in values) {
|
|
dataSize += [self computeSingleSerializedSizeNoTag:value];
|
|
}
|
|
}
|
|
[output writeRawVarint32:dataSize];
|
|
for (id value in values) {
|
|
[self writeSingleValue:value noTagToCodedOutputStream:output];
|
|
}
|
|
} else {
|
|
for (id value in values) {
|
|
[self writeSingleValue:value includingTagToCodedOutputStream:output];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- (void) writeValue:(id) value includingTagToCodedOutputStream:(PBCodedOutputStream*) output {
|
|
if (isRepeated) {
|
|
[self writeRepeatedValues:value includingTagsToCodedOutputStream:output];
|
|
} else {
|
|
[self writeSingleValue:value includingTagToCodedOutputStream:output];
|
|
}
|
|
}
|
|
|
|
|
|
- (int32_t) computeRepeatedSerializedSizeIncludingTags:(NSArray*) values {
|
|
if (isPacked) {
|
|
int32_t size = 0;
|
|
if (typeIsFixedSize(type)) {
|
|
size = (int32_t)values.count * typeSize(type);
|
|
} else {
|
|
for (id value in values) {
|
|
size += [self computeSingleSerializedSizeNoTag:value];
|
|
}
|
|
}
|
|
return size + computeTagSize(fieldNumber) + computeRawVarint32Size(size);
|
|
} else {
|
|
int32_t size = 0;
|
|
for (id value in values) {
|
|
size += [self computeSingleSerializedSizeIncludingTag:value];
|
|
}
|
|
return size;
|
|
}
|
|
}
|
|
|
|
|
|
- (int32_t) computeSerializedSizeIncludingTag:(id) value {
|
|
if (isRepeated) {
|
|
return [self computeRepeatedSerializedSizeIncludingTags:value];
|
|
} else {
|
|
return [self computeSingleSerializedSizeIncludingTag:value];
|
|
}
|
|
}
|
|
|
|
|
|
- (void) mergeMessageSetExtentionFromCodedInputStream:(PBCodedInputStream*) input
|
|
unknownFields:(PBUnknownFieldSet_Builder*) unknownFields {
|
|
@throw [NSException exceptionWithName:@"NYI" reason:@"" userInfo:nil];
|
|
|
|
// The wire format for MessageSet is:
|
|
// message MessageSet {
|
|
// repeated group Item = 1 {
|
|
// required int32 typeId = 2;
|
|
// required bytes message = 3;
|
|
// }
|
|
// }
|
|
// "typeId" is the extension's field number. The extension can only be
|
|
// a message type, where "message" contains the encoded bytes of that
|
|
// message.
|
|
//
|
|
// In practice, we will probably never see a MessageSet item in which
|
|
// the message appears before the type ID, or where either field does not
|
|
// appear exactly once. However, in theory such cases are valid, so we
|
|
// should be prepared to accept them.
|
|
|
|
//int typeId = 0;
|
|
// ByteString rawBytes = null;
|
|
//
|
|
// while (true) {
|
|
// final int tag = input.readTag();
|
|
// if (tag == 0) {
|
|
// break;
|
|
// }
|
|
//
|
|
// if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
|
|
// typeId = input.readUInt32();
|
|
// // Zero is not a valid type ID.
|
|
// if (typeId != 0) {
|
|
// if (rawBytes != null) {
|
|
// unknownFields.mergeField(typeId,
|
|
// UnknownFieldSet.Field.newBuilder()
|
|
// .addLengthDelimited(rawBytes)
|
|
// .build());
|
|
// rawBytes = null;
|
|
// }
|
|
// }
|
|
// } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
|
|
// if (typeId == 0) {
|
|
// // We haven't seen a type ID yet, so we have to store the raw bytes
|
|
// // for now.
|
|
// rawBytes = input.readBytes();
|
|
// } else {
|
|
// unknownFields.mergeField(typeId,
|
|
// UnknownFieldSet.Field.newBuilder()
|
|
// .addLengthDelimited(input.readBytes())
|
|
// .build());
|
|
// }
|
|
// } else {
|
|
// // Unknown fieldNumber. Skip it.
|
|
// if (!input.skipField(tag)) {
|
|
// break; // end of group
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
|
|
}
|
|
|
|
|
|
- (id) readSingleValueFromCodedInputStream:(PBCodedInputStream*) input
|
|
extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
|
|
switch (type) {
|
|
case PBExtensionTypeBool: return [NSNumber numberWithBool:[input readBool]];
|
|
case PBExtensionTypeFixed32: return [NSNumber numberWithInt:[input readFixed32]];
|
|
case PBExtensionTypeSFixed32: return [NSNumber numberWithInt:[input readSFixed32]];
|
|
case PBExtensionTypeFloat: return [NSNumber numberWithFloat:[input readFloat]];
|
|
case PBExtensionTypeFixed64: return [NSNumber numberWithLongLong:[input readFixed64]];
|
|
case PBExtensionTypeSFixed64: return [NSNumber numberWithLongLong:[input readSFixed64]];
|
|
case PBExtensionTypeDouble: return [NSNumber numberWithDouble:[input readDouble]];
|
|
case PBExtensionTypeInt32: return [NSNumber numberWithInt:[input readInt32]];
|
|
case PBExtensionTypeInt64: return [NSNumber numberWithLongLong:[input readInt64]];
|
|
case PBExtensionTypeSInt32: return [NSNumber numberWithInt:[input readSInt32]];
|
|
case PBExtensionTypeSInt64: return [NSNumber numberWithLongLong:[input readSInt64]];
|
|
case PBExtensionTypeUInt32: return [NSNumber numberWithInt:[input readUInt32]];
|
|
case PBExtensionTypeUInt64: return [NSNumber numberWithLongLong:[input readUInt64]];
|
|
case PBExtensionTypeBytes: return [input readData];
|
|
case PBExtensionTypeString: return [input readString];
|
|
case PBExtensionTypeEnum: return [NSNumber numberWithInt:[input readEnum]];
|
|
case PBExtensionTypeGroup:
|
|
{
|
|
id<PBMessage_Builder> builder = [messageOrGroupClass builder];
|
|
[input readGroup:fieldNumber builder:builder extensionRegistry:extensionRegistry];
|
|
return [builder build];
|
|
}
|
|
|
|
case PBExtensionTypeMessage:
|
|
{
|
|
id<PBMessage_Builder> builder = [messageOrGroupClass builder];
|
|
[input readMessage:builder extensionRegistry:extensionRegistry];
|
|
return [builder build];
|
|
}
|
|
}
|
|
|
|
@throw [NSException exceptionWithName:@"InternalError" reason:@"" userInfo:nil];
|
|
}
|
|
|
|
|
|
- (void) mergeFromCodedInputStream:(PBCodedInputStream*) input
|
|
unknownFields:(PBUnknownFieldSet_Builder*) unknownFields
|
|
extensionRegistry:(PBExtensionRegistry*) extensionRegistry
|
|
builder:(PBExtendableMessage_Builder*) builder
|
|
tag:(int32_t) tag {
|
|
if (isPacked) {
|
|
int32_t length = [input readRawVarint32];
|
|
int32_t limit = [input pushLimit:length];
|
|
while ([input bytesUntilLimit] > 0) {
|
|
id value = [self readSingleValueFromCodedInputStream:input extensionRegistry:extensionRegistry];
|
|
[builder addExtension:self value:value];
|
|
}
|
|
[input popLimit:limit];
|
|
} else if (isMessageSetWireFormat) {
|
|
[self mergeMessageSetExtentionFromCodedInputStream:input
|
|
unknownFields:unknownFields];
|
|
} else {
|
|
id value = [self readSingleValueFromCodedInputStream:input extensionRegistry:extensionRegistry];
|
|
if (isRepeated) {
|
|
[builder addExtension:self value:value];
|
|
} else {
|
|
[builder setExtension:self value:value];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@end
|