1// Protocol Buffers - Google's data interchange format 2// Copyright 2008 Google Inc. All rights reserved. 3// https://developers.google.com/protocol-buffers/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31// This header is private to the ProtobolBuffers library and must NOT be 32// included by any sources outside this library. The contents of this file are 33// subject to change at any time without notice. 34 35#import "GPBMessage.h" 36 37// TODO: Remove this import. Older generated code use the OSAtomic* apis, 38// so anyone that hasn't regenerated says building by having this. After 39// enough time has passed, this likely can be removed as folks should have 40// regenerated. 41#import <libkern/OSAtomic.h> 42 43#import "GPBBootstrap.h" 44 45typedef struct GPBMessage_Storage { 46 uint32_t _has_storage_[0]; 47} GPBMessage_Storage; 48 49typedef struct GPBMessage_Storage *GPBMessage_StoragePtr; 50 51@interface GPBMessage () { 52 @package 53 // NOTE: Because of the +allocWithZone code using NSAllocateObject(), 54 // this structure should ideally always be kept pointer aligned where the 55 // real storage starts is also pointer aligned. The compiler/runtime already 56 // do this, but it may not be documented. 57 58 // A pointer to the actual fields of the subclasses. The actual structure 59 // pointed to by this pointer will depend on the subclass. 60 // All of the actual structures will start the same as 61 // GPBMessage_Storage with _has_storage__ as the first field. 62 // Kept public because static functions need to access it. 63 GPBMessage_StoragePtr messageStorage_; 64} 65 66// Gets an extension value without autocreating the result if not found. (i.e. 67// returns nil if the extension is not set) 68- (id)getExistingExtension:(GPBExtensionDescriptor *)extension; 69 70// Parses a message of this type from the input and merges it with this 71// message. 72// 73// Warning: This does not verify that all required fields are present in 74// the input message. 75// Note: The caller should call 76// -[CodedInputStream checkLastTagWas:] after calling this to 77// verify that the last tag seen was the appropriate end-group tag, 78// or zero for EOF. 79// NOTE: This will throw if there is an error while parsing. 80- (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input 81 extensionRegistry:(GPBExtensionRegistry *)extensionRegistry; 82 83// Parses the next delimited message of this type from the input and merges it 84// with this message. 85- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input 86 extensionRegistry: 87 (GPBExtensionRegistry *)extensionRegistry; 88 89- (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data; 90 91@end 92 93CF_EXTERN_C_BEGIN 94 95 96// Call this before using the readOnlySemaphore_. This ensures it is created only once. 97void GPBPrepareReadOnlySemaphore(GPBMessage *self); 98 99// Returns a new instance that was automatically created by |autocreator| for 100// its field |field|. 101GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass, 102 GPBMessage *autocreator, 103 GPBFieldDescriptor *field) 104 __attribute__((ns_returns_retained)); 105 106// Returns whether |message| autocreated this message. This is NO if the message 107// was not autocreated by |message| or if it has been mutated since 108// autocreation. 109BOOL GPBWasMessageAutocreatedBy(GPBMessage *message, GPBMessage *parent); 110 111// Call this when you mutate a message. It will cause the message to become 112// visible to its autocreator. 113void GPBBecomeVisibleToAutocreator(GPBMessage *self); 114 115// Call this when an array/dictionary is mutated so the parent message that 116// autocreated it can react. 117void GPBAutocreatedArrayModified(GPBMessage *self, id array); 118void GPBAutocreatedDictionaryModified(GPBMessage *self, id dictionary); 119 120// Clear the autocreator, if any. Asserts if the autocreator still has an 121// autocreated reference to this message. 122void GPBClearMessageAutocreator(GPBMessage *self); 123 124CF_EXTERN_C_END 125