xref: /aosp_15_r20/external/cronet/third_party/protobuf/objectivec/GPBCodedInputStream.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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