| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 | /** * @fileoverview Helper methods for reading data from the binary wire format. */goog.module('protobuf.binary.reader');const BufferDecoder = goog.require('protobuf.binary.BufferDecoder');const ByteString = goog.require('protobuf.ByteString');const Int64 = goog.require('protobuf.Int64');const {checkState} = goog.require('protobuf.internal.checks');/****************************************************************************** *                        OPTIONAL FUNCTIONS ******************************************************************************//** * Reads a boolean value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {boolean} * @package */function readBool(bufferDecoder, start) {  const {lowBits, highBits} = bufferDecoder.getVarint(start);  return lowBits !== 0 || highBits !== 0;}/** * Reads a ByteString value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!ByteString} * @package */function readBytes(bufferDecoder, start) {  return readDelimited(bufferDecoder, start).asByteString();}/** * Reads a int32 value from the binary bytes encoded as varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readInt32(bufferDecoder, start) {  // Negative 32 bit integers are encoded with 64 bit values.  // Clients are expected to truncate back to 32 bits.  // This is why we are dropping the upper bytes here.  return bufferDecoder.getUnsignedVarint32At(start) | 0;}/** * Reads a int32 value from the binary bytes encoded as varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Int64} * @package */function readInt64(bufferDecoder, start) {  const {lowBits, highBits} = bufferDecoder.getVarint(start);  return Int64.fromBits(lowBits, highBits);}/** * Reads a fixed int32 value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readFixed32(bufferDecoder, start) {  return bufferDecoder.getUint32(start);}/** * Reads a float value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readFloat(bufferDecoder, start) {  return bufferDecoder.getFloat32(start);}/** * Reads a fixed int64 value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Int64} * @package */function readSfixed64(bufferDecoder, start) {  const lowBits = bufferDecoder.getInt32(start);  const highBits = bufferDecoder.getInt32(start + 4);  return Int64.fromBits(lowBits, highBits);}/** * Reads a sint32 value from the binary bytes encoded as varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readSint32(bufferDecoder, start) {  const bits = bufferDecoder.getUnsignedVarint32At(start);  // Truncate upper bits and convert from zig zag to signd int  return (bits >>> 1) ^ -(bits & 0x01);}/** * Reads a sint64 value from the binary bytes encoded as varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Int64} * @package */function readSint64(bufferDecoder, start) {  const {lowBits, highBits} = bufferDecoder.getVarint(start);  const sign = -(lowBits & 0x01);  const decodedLowerBits = ((lowBits >>> 1) | (highBits & 0x01) << 31) ^ sign;  const decodedUpperBits = (highBits >>> 1) ^ sign;  return Int64.fromBits(decodedLowerBits, decodedUpperBits);}/** * Read a subarray of bytes representing a length delimited field. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!BufferDecoder} * @package */function readDelimited(bufferDecoder, start) {  const unsignedLength = bufferDecoder.getUnsignedVarint32At(start);  return bufferDecoder.subBufferDecoder(bufferDecoder.cursor(), unsignedLength);}/** * Reads a string value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {string} * @package */function readString(bufferDecoder, start) {  return readDelimited(bufferDecoder, start).asString();}/** * Reads a uint32 value from the binary bytes encoded as varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readUint32(bufferDecoder, start) {  return bufferDecoder.getUnsignedVarint32At(start);}/** * Reads a double value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readDouble(bufferDecoder, start) {  return bufferDecoder.getFloat64(start);}/** * Reads a fixed int32 value from the binary bytes. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {number} * @package */function readSfixed32(bufferDecoder, start) {  return bufferDecoder.getInt32(start);}/****************************************************************************** *                        REPEATED FUNCTIONS ******************************************************************************//** * Reads a packed bool field, which consists of a length header and a list of * unsigned varints. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<boolean>} * @package */function readPackedBool(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readBool);}/** * Reads a packed double field, which consists of a length header and a list of * fixed64. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedDouble(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readDouble);}/** * Reads a packed fixed32 field, which consists of a length header and a list of * fixed32. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedFixed32(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readFixed32);}/** * Reads a packed float field, which consists of a length header and a list of * fixed64. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedFloat(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readFloat);}/** * Reads a packed int32 field, which consists of a length header and a list of * varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedInt32(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readInt32);}/** * Reads a packed int64 field, which consists of a length header and a list * of int64. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<!Int64>} * @package */function readPackedInt64(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readInt64);}/** * Reads a packed sfixed32 field, which consists of a length header and a list * of sfixed32. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedSfixed32(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readSfixed32);}/** * Reads a packed sfixed64 field, which consists of a length header and a list * of sfixed64. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<!Int64>} * @package */function readPackedSfixed64(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readSfixed64);}/** * Reads a packed sint32 field, which consists of a length header and a list of * varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedSint32(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readSint32);}/** * Reads a packed sint64 field, which consists of a length header and a list * of sint64. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<!Int64>} * @package */function readPackedSint64(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readSint64);}/** * Reads a packed uint32 field, which consists of a length header and a list of * varint. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @return {!Array<number>} * @package */function readPackedUint32(bufferDecoder, start) {  return readPacked(bufferDecoder, start, readUint32);}/** * Read packed values. * @param {!BufferDecoder} bufferDecoder Binary format encoded bytes. * @param {number} start Start of the data. * @param {function(!BufferDecoder, number):T} valueFunction * @return {!Array<T>} * @package * @template T */function readPacked(bufferDecoder, start, valueFunction) {  const /** !Array<T> */ result = [];  const unsignedLength = bufferDecoder.getUnsignedVarint32At(start);  const dataStart = bufferDecoder.cursor();  while (bufferDecoder.cursor() < dataStart + unsignedLength) {    checkState(bufferDecoder.cursor() > 0);    result.push(valueFunction(bufferDecoder, bufferDecoder.cursor()));  }  return result;}exports = {  readBool,  readBytes,  readDelimited,  readDouble,  readFixed32,  readFloat,  readInt32,  readInt64,  readSint32,  readSint64,  readSfixed32,  readSfixed64,  readString,  readUint32,  readPackedBool,  readPackedDouble,  readPackedFixed32,  readPackedFloat,  readPackedInt32,  readPackedInt64,  readPackedSfixed32,  readPackedSfixed64,  readPackedSint32,  readPackedSint64,  readPackedUint32,};
 |