1*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker // 5*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker // met: 8*1b3f573fSAndroid Build Coastguard Worker // 9*1b3f573fSAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker // distribution. 15*1b3f573fSAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker // 19*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker #import <Foundation/Foundation.h> 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard Worker @class GPBMessage; 34*1b3f573fSAndroid Build Coastguard Worker @class GPBExtensionRegistry; 35*1b3f573fSAndroid Build Coastguard Worker 36*1b3f573fSAndroid Build Coastguard Worker NS_ASSUME_NONNULL_BEGIN 37*1b3f573fSAndroid Build Coastguard Worker 38*1b3f573fSAndroid Build Coastguard Worker CF_EXTERN_C_BEGIN 39*1b3f573fSAndroid Build Coastguard Worker 40*1b3f573fSAndroid Build Coastguard Worker /** 41*1b3f573fSAndroid Build Coastguard Worker * @c GPBCodedInputStream exception name. Exceptions raised from 42*1b3f573fSAndroid Build Coastguard Worker * @c GPBCodedInputStream contain an underlying error in the userInfo dictionary 43*1b3f573fSAndroid Build Coastguard Worker * under the GPBCodedInputStreamUnderlyingErrorKey key. 44*1b3f573fSAndroid Build Coastguard Worker **/ 45*1b3f573fSAndroid Build Coastguard Worker extern NSString *const GPBCodedInputStreamException; 46*1b3f573fSAndroid Build Coastguard Worker 47*1b3f573fSAndroid Build Coastguard Worker /** The key under which the underlying NSError from the exception is stored. */ 48*1b3f573fSAndroid Build Coastguard Worker extern NSString *const GPBCodedInputStreamUnderlyingErrorKey; 49*1b3f573fSAndroid Build Coastguard Worker 50*1b3f573fSAndroid Build Coastguard Worker /** NSError domain used for @c GPBCodedInputStream errors. */ 51*1b3f573fSAndroid Build Coastguard Worker extern NSString *const GPBCodedInputStreamErrorDomain; 52*1b3f573fSAndroid Build Coastguard Worker 53*1b3f573fSAndroid Build Coastguard Worker /** 54*1b3f573fSAndroid Build Coastguard Worker * Error code for NSError with @c GPBCodedInputStreamErrorDomain. 55*1b3f573fSAndroid Build Coastguard Worker **/ 56*1b3f573fSAndroid Build Coastguard Worker typedef NS_ENUM(NSInteger, GPBCodedInputStreamErrorCode) { 57*1b3f573fSAndroid Build Coastguard Worker /** The size does not fit in the remaining bytes to be read. */ 58*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorInvalidSize = -100, 59*1b3f573fSAndroid Build Coastguard Worker /** Attempted to read beyond the subsection limit. */ 60*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorSubsectionLimitReached = -101, 61*1b3f573fSAndroid Build Coastguard Worker /** The requested subsection limit is invalid. */ 62*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorInvalidSubsectionLimit = -102, 63*1b3f573fSAndroid Build Coastguard Worker /** Invalid tag read. */ 64*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorInvalidTag = -103, 65*1b3f573fSAndroid Build Coastguard Worker /** Invalid UTF-8 character in a string. */ 66*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorInvalidUTF8 = -104, 67*1b3f573fSAndroid Build Coastguard Worker /** Invalid VarInt read. */ 68*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorInvalidVarInt = -105, 69*1b3f573fSAndroid Build Coastguard Worker /** The maximum recursion depth of messages was exceeded. */ 70*1b3f573fSAndroid Build Coastguard Worker GPBCodedInputStreamErrorRecursionDepthExceeded = -106, 71*1b3f573fSAndroid Build Coastguard Worker }; 72*1b3f573fSAndroid Build Coastguard Worker 73*1b3f573fSAndroid Build Coastguard Worker CF_EXTERN_C_END 74*1b3f573fSAndroid Build Coastguard Worker 75*1b3f573fSAndroid Build Coastguard Worker /** 76*1b3f573fSAndroid Build Coastguard Worker * Reads and decodes protocol message fields. 77*1b3f573fSAndroid Build Coastguard Worker * 78*1b3f573fSAndroid Build Coastguard Worker * The common uses of protocol buffers shouldn't need to use this class. 79*1b3f573fSAndroid Build Coastguard Worker * @c GPBMessage's provide a @c +parseFromData:error: and 80*1b3f573fSAndroid Build Coastguard Worker * @c +parseFromData:extensionRegistry:error: method that will decode a 81*1b3f573fSAndroid Build Coastguard Worker * message for you. 82*1b3f573fSAndroid Build Coastguard Worker * 83*1b3f573fSAndroid Build Coastguard Worker * @note Subclassing of @c GPBCodedInputStream is NOT supported. 84*1b3f573fSAndroid Build Coastguard Worker **/ 85*1b3f573fSAndroid Build Coastguard Worker @interface GPBCodedInputStream : NSObject 86*1b3f573fSAndroid Build Coastguard Worker 87*1b3f573fSAndroid Build Coastguard Worker /** 88*1b3f573fSAndroid Build Coastguard Worker * Creates a new stream wrapping some data. 89*1b3f573fSAndroid Build Coastguard Worker * 90*1b3f573fSAndroid Build Coastguard Worker * @param data The data to wrap inside the stream. 91*1b3f573fSAndroid Build Coastguard Worker * 92*1b3f573fSAndroid Build Coastguard Worker * @return A newly instanced GPBCodedInputStream. 93*1b3f573fSAndroid Build Coastguard Worker **/ 94*1b3f573fSAndroid Build Coastguard Worker + (instancetype)streamWithData:(NSData *)data; 95*1b3f573fSAndroid Build Coastguard Worker 96*1b3f573fSAndroid Build Coastguard Worker /** 97*1b3f573fSAndroid Build Coastguard Worker * Initializes a stream wrapping some data. 98*1b3f573fSAndroid Build Coastguard Worker * 99*1b3f573fSAndroid Build Coastguard Worker * @param data The data to wrap inside the stream. 100*1b3f573fSAndroid Build Coastguard Worker * 101*1b3f573fSAndroid Build Coastguard Worker * @return A newly initialized GPBCodedInputStream. 102*1b3f573fSAndroid Build Coastguard Worker **/ 103*1b3f573fSAndroid Build Coastguard Worker - (instancetype)initWithData:(NSData *)data; 104*1b3f573fSAndroid Build Coastguard Worker 105*1b3f573fSAndroid Build Coastguard Worker /** 106*1b3f573fSAndroid Build Coastguard Worker * Attempts to read a field tag, returning zero if we have reached EOF. 107*1b3f573fSAndroid Build Coastguard Worker * Protocol message parsers use this to read tags, since a protocol message 108*1b3f573fSAndroid Build Coastguard Worker * may legally end wherever a tag occurs, and zero is not a valid tag number. 109*1b3f573fSAndroid Build Coastguard Worker * 110*1b3f573fSAndroid Build Coastguard Worker * @return The field tag, or zero if EOF was reached. 111*1b3f573fSAndroid Build Coastguard Worker **/ 112*1b3f573fSAndroid Build Coastguard Worker - (int32_t)readTag; 113*1b3f573fSAndroid Build Coastguard Worker 114*1b3f573fSAndroid Build Coastguard Worker /** 115*1b3f573fSAndroid Build Coastguard Worker * @return A double read from the stream. 116*1b3f573fSAndroid Build Coastguard Worker **/ 117*1b3f573fSAndroid Build Coastguard Worker - (double)readDouble; 118*1b3f573fSAndroid Build Coastguard Worker /** 119*1b3f573fSAndroid Build Coastguard Worker * @return A float read from the stream. 120*1b3f573fSAndroid Build Coastguard Worker **/ 121*1b3f573fSAndroid Build Coastguard Worker - (float)readFloat; 122*1b3f573fSAndroid Build Coastguard Worker /** 123*1b3f573fSAndroid Build Coastguard Worker * @return A uint64 read from the stream. 124*1b3f573fSAndroid Build Coastguard Worker **/ 125*1b3f573fSAndroid Build Coastguard Worker - (uint64_t)readUInt64; 126*1b3f573fSAndroid Build Coastguard Worker /** 127*1b3f573fSAndroid Build Coastguard Worker * @return A uint32 read from the stream. 128*1b3f573fSAndroid Build Coastguard Worker **/ 129*1b3f573fSAndroid Build Coastguard Worker - (uint32_t)readUInt32; 130*1b3f573fSAndroid Build Coastguard Worker /** 131*1b3f573fSAndroid Build Coastguard Worker * @return An int64 read from the stream. 132*1b3f573fSAndroid Build Coastguard Worker **/ 133*1b3f573fSAndroid Build Coastguard Worker - (int64_t)readInt64; 134*1b3f573fSAndroid Build Coastguard Worker /** 135*1b3f573fSAndroid Build Coastguard Worker * @return An int32 read from the stream. 136*1b3f573fSAndroid Build Coastguard Worker **/ 137*1b3f573fSAndroid Build Coastguard Worker - (int32_t)readInt32; 138*1b3f573fSAndroid Build Coastguard Worker /** 139*1b3f573fSAndroid Build Coastguard Worker * @return A fixed64 read from the stream. 140*1b3f573fSAndroid Build Coastguard Worker **/ 141*1b3f573fSAndroid Build Coastguard Worker - (uint64_t)readFixed64; 142*1b3f573fSAndroid Build Coastguard Worker /** 143*1b3f573fSAndroid Build Coastguard Worker * @return A fixed32 read from the stream. 144*1b3f573fSAndroid Build Coastguard Worker **/ 145*1b3f573fSAndroid Build Coastguard Worker - (uint32_t)readFixed32; 146*1b3f573fSAndroid Build Coastguard Worker /** 147*1b3f573fSAndroid Build Coastguard Worker * @return An enum read from the stream. 148*1b3f573fSAndroid Build Coastguard Worker **/ 149*1b3f573fSAndroid Build Coastguard Worker - (int32_t)readEnum; 150*1b3f573fSAndroid Build Coastguard Worker /** 151*1b3f573fSAndroid Build Coastguard Worker * @return A sfixed32 read from the stream. 152*1b3f573fSAndroid Build Coastguard Worker **/ 153*1b3f573fSAndroid Build Coastguard Worker - (int32_t)readSFixed32; 154*1b3f573fSAndroid Build Coastguard Worker /** 155*1b3f573fSAndroid Build Coastguard Worker * @return A fixed64 read from the stream. 156*1b3f573fSAndroid Build Coastguard Worker **/ 157*1b3f573fSAndroid Build Coastguard Worker - (int64_t)readSFixed64; 158*1b3f573fSAndroid Build Coastguard Worker /** 159*1b3f573fSAndroid Build Coastguard Worker * @return A sint32 read from the stream. 160*1b3f573fSAndroid Build Coastguard Worker **/ 161*1b3f573fSAndroid Build Coastguard Worker - (int32_t)readSInt32; 162*1b3f573fSAndroid Build Coastguard Worker /** 163*1b3f573fSAndroid Build Coastguard Worker * @return A sint64 read from the stream. 164*1b3f573fSAndroid Build Coastguard Worker **/ 165*1b3f573fSAndroid Build Coastguard Worker - (int64_t)readSInt64; 166*1b3f573fSAndroid Build Coastguard Worker /** 167*1b3f573fSAndroid Build Coastguard Worker * @return A boolean read from the stream. 168*1b3f573fSAndroid Build Coastguard Worker **/ 169*1b3f573fSAndroid Build Coastguard Worker - (BOOL)readBool; 170*1b3f573fSAndroid Build Coastguard Worker /** 171*1b3f573fSAndroid Build Coastguard Worker * @return A string read from the stream. 172*1b3f573fSAndroid Build Coastguard Worker **/ 173*1b3f573fSAndroid Build Coastguard Worker - (NSString *)readString; 174*1b3f573fSAndroid Build Coastguard Worker /** 175*1b3f573fSAndroid Build Coastguard Worker * @return Data read from the stream. 176*1b3f573fSAndroid Build Coastguard Worker **/ 177*1b3f573fSAndroid Build Coastguard Worker - (NSData *)readBytes; 178*1b3f573fSAndroid Build Coastguard Worker 179*1b3f573fSAndroid Build Coastguard Worker /** 180*1b3f573fSAndroid Build Coastguard Worker * Read an embedded message field value from the stream. 181*1b3f573fSAndroid Build Coastguard Worker * 182*1b3f573fSAndroid Build Coastguard Worker * @param message The message to set fields on as they are read. 183*1b3f573fSAndroid Build Coastguard Worker * @param extensionRegistry An optional extension registry to use to lookup 184*1b3f573fSAndroid Build Coastguard Worker * extensions for message. 185*1b3f573fSAndroid Build Coastguard Worker **/ 186*1b3f573fSAndroid Build Coastguard Worker - (void)readMessage:(GPBMessage *)message 187*1b3f573fSAndroid Build Coastguard Worker extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry; 188*1b3f573fSAndroid Build Coastguard Worker 189*1b3f573fSAndroid Build Coastguard Worker /** 190*1b3f573fSAndroid Build Coastguard Worker * Reads and discards a single field, given its tag value. 191*1b3f573fSAndroid Build Coastguard Worker * 192*1b3f573fSAndroid Build Coastguard Worker * @param tag The tag number of the field to skip. 193*1b3f573fSAndroid Build Coastguard Worker * 194*1b3f573fSAndroid Build Coastguard Worker * @return NO if the tag is an endgroup tag (in which case nothing is skipped), 195*1b3f573fSAndroid Build Coastguard Worker * YES in all other cases. 196*1b3f573fSAndroid Build Coastguard Worker **/ 197*1b3f573fSAndroid Build Coastguard Worker - (BOOL)skipField:(int32_t)tag; 198*1b3f573fSAndroid Build Coastguard Worker 199*1b3f573fSAndroid Build Coastguard Worker /** 200*1b3f573fSAndroid Build Coastguard Worker * Reads and discards an entire message. This will read either until EOF or 201*1b3f573fSAndroid Build Coastguard Worker * until an endgroup tag, whichever comes first. 202*1b3f573fSAndroid Build Coastguard Worker **/ 203*1b3f573fSAndroid Build Coastguard Worker - (void)skipMessage; 204*1b3f573fSAndroid Build Coastguard Worker 205*1b3f573fSAndroid Build Coastguard Worker /** 206*1b3f573fSAndroid Build Coastguard Worker * Check to see if the logical end of the stream has been reached. 207*1b3f573fSAndroid Build Coastguard Worker * 208*1b3f573fSAndroid Build Coastguard Worker * @note This can return NO when there is no more data, but the current parsing 209*1b3f573fSAndroid Build Coastguard Worker * expected more data. 210*1b3f573fSAndroid Build Coastguard Worker * 211*1b3f573fSAndroid Build Coastguard Worker * @return YES if the logical end of the stream has been reached, NO otherwise. 212*1b3f573fSAndroid Build Coastguard Worker **/ 213*1b3f573fSAndroid Build Coastguard Worker - (BOOL)isAtEnd; 214*1b3f573fSAndroid Build Coastguard Worker 215*1b3f573fSAndroid Build Coastguard Worker /** 216*1b3f573fSAndroid Build Coastguard Worker * @return The offset into the stream. 217*1b3f573fSAndroid Build Coastguard Worker **/ 218*1b3f573fSAndroid Build Coastguard Worker - (size_t)position; 219*1b3f573fSAndroid Build Coastguard Worker 220*1b3f573fSAndroid Build Coastguard Worker /** 221*1b3f573fSAndroid Build Coastguard Worker * Moves the limit to the given byte offset starting at the current location. 222*1b3f573fSAndroid Build Coastguard Worker * 223*1b3f573fSAndroid Build Coastguard Worker * @exception GPBCodedInputStreamException If the requested bytes exceed the 224*1b3f573fSAndroid Build Coastguard Worker * current limit. 225*1b3f573fSAndroid Build Coastguard Worker * 226*1b3f573fSAndroid Build Coastguard Worker * @param byteLimit The number of bytes to move the limit, offset to the current 227*1b3f573fSAndroid Build Coastguard Worker * location. 228*1b3f573fSAndroid Build Coastguard Worker * 229*1b3f573fSAndroid Build Coastguard Worker * @return The limit offset before moving the new limit. 230*1b3f573fSAndroid Build Coastguard Worker */ 231*1b3f573fSAndroid Build Coastguard Worker - (size_t)pushLimit:(size_t)byteLimit; 232*1b3f573fSAndroid Build Coastguard Worker 233*1b3f573fSAndroid Build Coastguard Worker /** 234*1b3f573fSAndroid Build Coastguard Worker * Moves the limit back to the offset as it was before calling pushLimit:. 235*1b3f573fSAndroid Build Coastguard Worker * 236*1b3f573fSAndroid Build Coastguard Worker * @param oldLimit The number of bytes to move the current limit. Usually this 237*1b3f573fSAndroid Build Coastguard Worker * is the value returned by the pushLimit: method. 238*1b3f573fSAndroid Build Coastguard Worker */ 239*1b3f573fSAndroid Build Coastguard Worker - (void)popLimit:(size_t)oldLimit; 240*1b3f573fSAndroid Build Coastguard Worker 241*1b3f573fSAndroid Build Coastguard Worker /** 242*1b3f573fSAndroid Build Coastguard Worker * Verifies that the last call to -readTag returned the given tag value. This 243*1b3f573fSAndroid Build Coastguard Worker * is used to verify that a nested group ended with the correct end tag. 244*1b3f573fSAndroid Build Coastguard Worker * 245*1b3f573fSAndroid Build Coastguard Worker * @exception NSParseErrorException If the value does not match the last tag. 246*1b3f573fSAndroid Build Coastguard Worker * 247*1b3f573fSAndroid Build Coastguard Worker * @param expected The tag that was expected. 248*1b3f573fSAndroid Build Coastguard Worker **/ 249*1b3f573fSAndroid Build Coastguard Worker - (void)checkLastTagWas:(int32_t)expected; 250*1b3f573fSAndroid Build Coastguard Worker 251*1b3f573fSAndroid Build Coastguard Worker @end 252*1b3f573fSAndroid Build Coastguard Worker 253*1b3f573fSAndroid Build Coastguard Worker NS_ASSUME_NONNULL_END 254