xref: /aosp_15_r20/external/protobuf/objectivec/GPBCodedInputStream.h (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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