1dcc329427
- Style fixups in the code. - map<> serialization fixes and more tests. - Autocreation of map<> fields (to match repeated fields). - @@protoc_insertion_point(global_scope|imports). - Fixup proto2 syntax extension support. - Move all startup code to +initialize so it happen on class usage and not app startup. - Have generated headers use forward declarations and move imports into generated code, reduces what is need at compile time to speed up compiled and avoid pointless rippling of rebuilds.
293 lines
11 KiB
Objective-C
293 lines
11 KiB
Objective-C
// Protocol Buffers - Google's data interchange format
|
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
// https://developers.google.com/protocol-buffers/
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// This header is private to the ProtobolBuffers library and must NOT be
|
|
// included by any sources outside this library. The contents of this file are
|
|
// subject to change at any time without notice.
|
|
|
|
#import "GPBDescriptor.h"
|
|
|
|
// Describes attributes of the field.
|
|
typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
|
|
// These map to standard protobuf concepts.
|
|
GPBFieldRequired = 1 << 0,
|
|
GPBFieldRepeated = 1 << 1,
|
|
GPBFieldPacked = 1 << 2,
|
|
GPBFieldOptional = 1 << 3,
|
|
GPBFieldHasDefaultValue = 1 << 4,
|
|
|
|
// These are not standard protobuf concepts, they are specific to the
|
|
// Objective C runtime.
|
|
|
|
// These bits are used to mark the field as a map and what the key
|
|
// type is.
|
|
GPBFieldMapKeyMask = 0xF << 8,
|
|
GPBFieldMapKeyInt32 = 1 << 8,
|
|
GPBFieldMapKeyInt64 = 2 << 8,
|
|
GPBFieldMapKeyUInt32 = 3 << 8,
|
|
GPBFieldMapKeyUInt64 = 4 << 8,
|
|
GPBFieldMapKeySInt32 = 5 << 8,
|
|
GPBFieldMapKeySInt64 = 6 << 8,
|
|
GPBFieldMapKeyFixed32 = 7 << 8,
|
|
GPBFieldMapKeyFixed64 = 8 << 8,
|
|
GPBFieldMapKeySFixed32 = 9 << 8,
|
|
GPBFieldMapKeySFixed64 = 10 << 8,
|
|
GPBFieldMapKeyBool = 11 << 8,
|
|
GPBFieldMapKeyString = 12 << 8,
|
|
|
|
// Indicates the field needs custom handling for the TextFormat name, if not
|
|
// set, the name can be derived from the ObjC name.
|
|
GPBFieldTextFormatNameCustom = 1 << 16,
|
|
// Indicates the field has an enum descriptor.
|
|
// TODO(thomasvl): Output the CPP check to use descFunc or validator based
|
|
// on final compile. This will then get added based on that.
|
|
GPBFieldHasEnumDescriptor = 1 << 17,
|
|
};
|
|
|
|
// Describes a single field in a protobuf as it is represented as an ivar.
|
|
typedef struct GPBMessageFieldDescription {
|
|
// Name of ivar.
|
|
const char *name;
|
|
// The field number for the ivar.
|
|
uint32_t number;
|
|
// The index (in bits) into _has_storage_.
|
|
// > 0: the bit to use for a value being set.
|
|
// = 0: no storage used.
|
|
// < 0: in a oneOf, use a full int32 to record the field active.
|
|
int32_t hasIndex;
|
|
// Field flags. Use accessor functions below.
|
|
GPBFieldFlags flags;
|
|
// Type of the ivar.
|
|
GPBType type;
|
|
// Offset of the variable into it's structure struct.
|
|
size_t offset;
|
|
// FieldOptions protobuf, serialized as string.
|
|
const char *fieldOptions;
|
|
|
|
GPBValue defaultValue; // Default value for the ivar.
|
|
union {
|
|
const char *className; // Name for message class.
|
|
// For enums only: If EnumDescriptors are compiled in, it will be that,
|
|
// otherwise it will be the verifier.
|
|
GPBEnumDescriptorFunc enumDescFunc;
|
|
GPBEnumValidationFunc enumVerifier;
|
|
} typeSpecific;
|
|
} GPBMessageFieldDescription;
|
|
|
|
// Describes a oneof.
|
|
typedef struct GPBMessageOneofDescription {
|
|
// Name of this enum oneof.
|
|
const char *name;
|
|
// The index of this oneof in the has_storage.
|
|
int32_t index;
|
|
} GPBMessageOneofDescription;
|
|
|
|
// Describes an enum type defined in a .proto file.
|
|
typedef struct GPBMessageEnumDescription {
|
|
GPBEnumDescriptorFunc enumDescriptorFunc;
|
|
} GPBMessageEnumDescription;
|
|
|
|
// Describes an individual enum constant of a particular type.
|
|
typedef struct GPBMessageEnumValueDescription {
|
|
// Name of this enum constant.
|
|
const char *name;
|
|
// Numeric value of this enum constant.
|
|
int32_t number;
|
|
} GPBMessageEnumValueDescription;
|
|
|
|
// Describes attributes of the extension.
|
|
typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
|
|
// These map to standard protobuf concepts.
|
|
GPBExtensionRepeated = 1 << 0,
|
|
GPBExtensionPacked = 1 << 1,
|
|
GPBExtensionSetWireFormat = 1 << 2,
|
|
};
|
|
|
|
// An extension
|
|
typedef struct GPBExtensionDescription {
|
|
const char *singletonName;
|
|
GPBType type;
|
|
const char *extendedClass;
|
|
int32_t fieldNumber;
|
|
GPBValue defaultValue;
|
|
const char *messageOrGroupClassName;
|
|
GPBExtensionOptions options;
|
|
GPBEnumDescriptorFunc enumDescriptorFunc;
|
|
} GPBExtensionDescription;
|
|
|
|
@interface GPBDescriptor () {
|
|
@package
|
|
NSArray *fields_;
|
|
NSArray *oneofs_;
|
|
size_t storageSize_;
|
|
}
|
|
|
|
// fieldDescriptions, enumDescriptions, rangeDescriptions, and
|
|
// extraTextFormatInfo have to be long lived, they are held as raw pointers.
|
|
+ (instancetype)
|
|
allocDescriptorForClass:(Class)messageClass
|
|
rootClass:(Class)rootClass
|
|
file:(GPBFileDescriptor *)file
|
|
fields:(GPBMessageFieldDescription *)fieldDescriptions
|
|
fieldCount:(NSUInteger)fieldCount
|
|
oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
|
oneofCount:(NSUInteger)oneofCount
|
|
enums:(GPBMessageEnumDescription *)enumDescriptions
|
|
enumCount:(NSUInteger)enumCount
|
|
ranges:(const GPBExtensionRange *)ranges
|
|
rangeCount:(NSUInteger)rangeCount
|
|
storageSize:(size_t)storageSize
|
|
wireFormat:(BOOL)wireFormat;
|
|
+ (instancetype)
|
|
allocDescriptorForClass:(Class)messageClass
|
|
rootClass:(Class)rootClass
|
|
file:(GPBFileDescriptor *)file
|
|
fields:(GPBMessageFieldDescription *)fieldDescriptions
|
|
fieldCount:(NSUInteger)fieldCount
|
|
oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
|
oneofCount:(NSUInteger)oneofCount
|
|
enums:(GPBMessageEnumDescription *)enumDescriptions
|
|
enumCount:(NSUInteger)enumCount
|
|
ranges:(const GPBExtensionRange *)ranges
|
|
rangeCount:(NSUInteger)rangeCount
|
|
storageSize:(size_t)storageSize
|
|
wireFormat:(BOOL)wireFormat
|
|
extraTextFormatInfo:(const char *)extraTextFormatInfo;
|
|
|
|
- (instancetype)initWithClass:(Class)messageClass
|
|
file:(GPBFileDescriptor *)file
|
|
fields:(NSArray *)fields
|
|
oneofs:(NSArray *)oneofs
|
|
enums:(NSArray *)enums
|
|
extensionRanges:(const GPBExtensionRange *)ranges
|
|
extensionRangesCount:(NSUInteger)rangeCount
|
|
storageSize:(size_t)storage
|
|
wireFormat:(BOOL)wireFormat;
|
|
|
|
@end
|
|
|
|
@interface GPBFileDescriptor ()
|
|
- (instancetype)initWithPackage:(NSString *)package
|
|
syntax:(GPBFileSyntax)syntax;
|
|
@end
|
|
|
|
@interface GPBOneofDescriptor () {
|
|
@package
|
|
GPBMessageOneofDescription *oneofDescription_;
|
|
NSArray *fields_;
|
|
|
|
SEL caseSel_;
|
|
}
|
|
- (instancetype)initWithOneofDescription:
|
|
(GPBMessageOneofDescription *)oneofDescription
|
|
fields:(NSArray *)fields;
|
|
@end
|
|
|
|
@interface GPBFieldDescriptor () {
|
|
@package
|
|
GPBMessageFieldDescription *description_;
|
|
GPB_UNSAFE_UNRETAINED GPBOneofDescriptor *containingOneof_;
|
|
|
|
SEL getSel_;
|
|
SEL setSel_;
|
|
SEL hasSel_;
|
|
SEL setHasSel_;
|
|
}
|
|
|
|
// Single initializer
|
|
// description has to be long lived, it is held as a raw pointer.
|
|
- (instancetype)initWithFieldDescription:
|
|
(GPBMessageFieldDescription *)description
|
|
rootClass:(Class)rootClass
|
|
syntax:(GPBFileSyntax)syntax;
|
|
@end
|
|
|
|
@interface GPBEnumDescriptor ()
|
|
// valueDescriptions and extraTextFormatInfo have to be long lived, they are
|
|
// held as raw pointers.
|
|
+ (instancetype)
|
|
allocDescriptorForName:(NSString *)name
|
|
values:(GPBMessageEnumValueDescription *)valueDescriptions
|
|
valueCount:(NSUInteger)valueCount
|
|
enumVerifier:(GPBEnumValidationFunc)enumVerifier;
|
|
+ (instancetype)
|
|
allocDescriptorForName:(NSString *)name
|
|
values:(GPBMessageEnumValueDescription *)valueDescriptions
|
|
valueCount:(NSUInteger)valueCount
|
|
enumVerifier:(GPBEnumValidationFunc)enumVerifier
|
|
extraTextFormatInfo:(const char *)extraTextFormatInfo;
|
|
|
|
- (instancetype)initWithName:(NSString *)name
|
|
values:(GPBMessageEnumValueDescription *)valueDescriptions
|
|
valueCount:(NSUInteger)valueCount
|
|
enumVerifier:(GPBEnumValidationFunc)enumVerifier;
|
|
@end
|
|
|
|
@interface GPBExtensionDescriptor () {
|
|
@package
|
|
GPBExtensionDescription *description_;
|
|
}
|
|
|
|
// description has to be long lived, it is held as a raw pointer.
|
|
- (instancetype)initWithExtensionDescription:
|
|
(GPBExtensionDescription *)description;
|
|
@end
|
|
|
|
CF_EXTERN_C_BEGIN
|
|
|
|
GPB_INLINE BOOL GPBFieldIsMapOrArray(GPBFieldDescriptor *field) {
|
|
return (field->description_->flags &
|
|
(GPBFieldRepeated | GPBFieldMapKeyMask)) != 0;
|
|
}
|
|
|
|
GPB_INLINE GPBType GPBGetFieldType(GPBFieldDescriptor *field) {
|
|
return field->description_->type;
|
|
}
|
|
|
|
GPB_INLINE int32_t GPBFieldHasIndex(GPBFieldDescriptor *field) {
|
|
return field->description_->hasIndex;
|
|
}
|
|
|
|
GPB_INLINE uint32_t GPBFieldNumber(GPBFieldDescriptor *field) {
|
|
return field->description_->number;
|
|
}
|
|
|
|
uint32_t GPBFieldTag(GPBFieldDescriptor *self);
|
|
|
|
GPB_INLINE BOOL GPBPreserveUnknownFields(GPBFileSyntax syntax) {
|
|
return syntax != GPBFileSyntaxProto3;
|
|
}
|
|
|
|
GPB_INLINE BOOL GPBHasPreservingUnknownEnumSemantics(GPBFileSyntax syntax) {
|
|
return syntax == GPBFileSyntaxProto3;
|
|
}
|
|
|
|
CF_EXTERN_C_END
|