mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.7 KiB
Objective-C
185 lines
5.7 KiB
Objective-C
// Copyright 2008 Cyrus Najmabadi
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
@class PBExtensionRegistry;
|
|
@class PBUnknownFieldSet_Builder;
|
|
@protocol PBMessage_Builder;
|
|
|
|
/**
|
|
* Reads and decodes protocol message fields.
|
|
*
|
|
* This class contains two kinds of methods: methods that read specific
|
|
* protocol message constructs and field types (e.g. {@link #readTag()} and
|
|
* {@link #readInt32()}) and methods that read low-level values (e.g.
|
|
* {@link #readRawVarint32()} and {@link #readRawBytes}). If you are reading
|
|
* encoded protocol messages, you should use the former methods, but if you are
|
|
* reading some other format of your own design, use the latter.
|
|
*
|
|
* @author Cyrus Najmabadi
|
|
*/
|
|
@interface PBCodedInputStream : NSObject {
|
|
@private
|
|
NSMutableData* buffer;
|
|
int32_t bufferSize;
|
|
int32_t bufferSizeAfterLimit;
|
|
int32_t bufferPos;
|
|
NSInputStream* input;
|
|
int32_t lastTag;
|
|
|
|
/**
|
|
* The total number of bytes read before the current buffer. The total
|
|
* bytes read up to the current position can be computed as
|
|
* {@code totalBytesRetired + bufferPos}.
|
|
*/
|
|
int32_t totalBytesRetired;
|
|
|
|
/** The absolute position of the end of the current message. */
|
|
int32_t currentLimit;
|
|
|
|
/** See setRecursionLimit() */
|
|
int32_t recursionDepth;
|
|
int32_t recursionLimit;
|
|
|
|
/** See setSizeLimit() */
|
|
int32_t sizeLimit;
|
|
}
|
|
|
|
+ (PBCodedInputStream*) streamWithData:(NSData*) data;
|
|
+ (PBCodedInputStream*) streamWithInputStream:(NSInputStream*) input;
|
|
|
|
/**
|
|
* Attempt to read a field tag, returning zero if we have reached EOF.
|
|
* Protocol message parsers use this to read tags, since a protocol message
|
|
* may legally end wherever a tag occurs, and zero is not a valid tag number.
|
|
*/
|
|
- (int32_t) readTag;
|
|
- (BOOL) refillBuffer:(BOOL) mustSucceed;
|
|
|
|
- (Float64) readDouble;
|
|
- (Float32) readFloat;
|
|
- (int64_t) readUInt64;
|
|
- (int32_t) readUInt32;
|
|
- (int64_t) readInt64;
|
|
- (int32_t) readInt32;
|
|
- (int64_t) readFixed64;
|
|
- (int32_t) readFixed32;
|
|
- (int32_t) readEnum;
|
|
- (int32_t) readSFixed32;
|
|
- (int64_t) readSFixed64;
|
|
- (int32_t) readSInt32;
|
|
- (int64_t) readSInt64;
|
|
|
|
/**
|
|
* Read one byte from the input.
|
|
*
|
|
* @throws InvalidProtocolBuffer The end of the stream or the current
|
|
* limit was reached.
|
|
*/
|
|
- (int8_t) readRawByte;
|
|
|
|
/**
|
|
* Read a raw Varint from the stream. If larger than 32 bits, discard the
|
|
* upper bits.
|
|
*/
|
|
- (int32_t) readRawVarint32;
|
|
- (int64_t) readRawVarint64;
|
|
- (int32_t) readRawLittleEndian32;
|
|
- (int64_t) readRawLittleEndian64;
|
|
|
|
/**
|
|
* Read a fixed size of bytes from the input.
|
|
*
|
|
* @throws InvalidProtocolBuffer The end of the stream or the current
|
|
* limit was reached.
|
|
*/
|
|
- (NSData*) readRawData:(int32_t) size;
|
|
|
|
/**
|
|
* Reads and discards a single field, given its tag value.
|
|
*
|
|
* @return {@code false} if the tag is an endgroup tag, in which case
|
|
* nothing is skipped. Otherwise, returns {@code true}.
|
|
*/
|
|
- (BOOL) skipField:(int32_t) tag;
|
|
|
|
|
|
/**
|
|
* Reads and discards {@code size} bytes.
|
|
*
|
|
* @throws InvalidProtocolBuffer The end of the stream or the current
|
|
* limit was reached.
|
|
*/
|
|
- (void) skipRawData:(int32_t) size;
|
|
|
|
/**
|
|
* Reads and discards an entire message. This will read either until EOF
|
|
* or until an endgroup tag, whichever comes first.
|
|
*/
|
|
- (void) skipMessage;
|
|
|
|
- (BOOL) isAtEnd;
|
|
- (int32_t) pushLimit:(int32_t) byteLimit;
|
|
- (void) recomputeBufferSizeAfterLimit;
|
|
- (void) popLimit:(int32_t) oldLimit;
|
|
- (int32_t) bytesUntilLimit;
|
|
|
|
/**
|
|
* Decode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers
|
|
* into values that can be efficiently encoded with varint. (Otherwise,
|
|
* negative values must be sign-extended to 64 bits to be varint encoded,
|
|
* thus always taking 10 bytes on the wire.)
|
|
*
|
|
* @param n An unsigned 32-bit integer, stored in a signed int.
|
|
* @return A signed 32-bit integer.
|
|
*/
|
|
int32_t decodeZigZag32(int32_t n);
|
|
|
|
/**
|
|
* Decode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers
|
|
* into values that can be efficiently encoded with varint. (Otherwise,
|
|
* negative values must be sign-extended to 64 bits to be varint encoded,
|
|
* thus always taking 10 bytes on the wire.)
|
|
*
|
|
* @param n An unsigned 64-bit integer, stored in a signed int.
|
|
* @return A signed 64-bit integer.
|
|
*/
|
|
int64_t decodeZigZag64(int64_t n);
|
|
|
|
/** Read an embedded message field value from the stream. */
|
|
- (void) readMessage:(id<PBMessage_Builder>) builder extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
|
|
|
- (BOOL) readBool;
|
|
- (NSString*) readString;
|
|
- (NSData*) readData;
|
|
|
|
- (void) readGroup:(int32_t) fieldNumber builder:(id<PBMessage_Builder>) builder extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
|
|
|
|
/**
|
|
* Reads a {@code group} field value from the stream and merges it into the
|
|
* given {@link UnknownFieldSet}.
|
|
*/
|
|
- (void) readUnknownGroup:(int32_t) fieldNumber builder:(PBUnknownFieldSet_Builder*) builder;
|
|
|
|
/**
|
|
* Verifies that the last call to readTag() returned the given tag value.
|
|
* This is used to verify that a nested group ended with the correct
|
|
* end tag.
|
|
*
|
|
* @throws InvalidProtocolBuffer {@code value} does not match the
|
|
* last tag.
|
|
*/
|
|
- (void) checkLastTagWas:(int32_t) value;
|
|
|
|
@end
|