12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /**
- * @fileoverview Utilities to index a binary proto by fieldnumbers without
- * relying on strutural proto information.
- */
- goog.module('protobuf.binary.indexer');
- const BinaryStorage = goog.require('protobuf.runtime.BinaryStorage');
- const BufferDecoder = goog.require('protobuf.binary.BufferDecoder');
- const WireType = goog.require('protobuf.binary.WireType');
- const {Field} = goog.require('protobuf.binary.field');
- const {checkCriticalState} = goog.require('protobuf.internal.checks');
- const {skipField, tagToFieldNumber, tagToWireType} = goog.require('protobuf.binary.tag');
- /**
- * Appends a new entry in the index array for the given field number.
- * @param {!BinaryStorage<!Field>} storage
- * @param {number} fieldNumber
- * @param {!WireType} wireType
- * @param {number} startIndex
- */
- function addIndexEntry(storage, fieldNumber, wireType, startIndex) {
- const field = storage.get(fieldNumber);
- if (field !== undefined) {
- field.addIndexEntry(wireType, startIndex);
- } else {
- storage.set(fieldNumber, Field.fromFirstIndexEntry(wireType, startIndex));
- }
- }
- /**
- * Creates an index of field locations in a given binary protobuf.
- * @param {!BufferDecoder} bufferDecoder
- * @param {number|undefined} pivot
- * @return {!BinaryStorage<!Field>}
- * @package
- */
- function buildIndex(bufferDecoder, pivot) {
- bufferDecoder.setCursor(bufferDecoder.startIndex());
- const storage = new BinaryStorage(pivot);
- while (bufferDecoder.hasNext()) {
- const tag = bufferDecoder.getUnsignedVarint32();
- const wireType = tagToWireType(tag);
- const fieldNumber = tagToFieldNumber(tag);
- checkCriticalState(fieldNumber > 0, `Invalid field number ${fieldNumber}`);
- addIndexEntry(storage, fieldNumber, wireType, bufferDecoder.cursor());
- skipField(bufferDecoder, wireType, fieldNumber);
- }
- return storage;
- }
- exports = {
- buildIndex,
- tagToWireType,
- };
|