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