| Index: lib/protobuf/runtime/CodedBufferReader.dart
|
| diff --git a/lib/protobuf/runtime/CodedBufferReader.dart b/lib/protobuf/runtime/CodedBufferReader.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..937511ac01fbd75e8005ec78d25756b5523568d6
|
| --- /dev/null
|
| +++ b/lib/protobuf/runtime/CodedBufferReader.dart
|
| @@ -0,0 +1,153 @@
|
| +// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +class CodedBufferReader extends CodedReader {
|
| + PbByteBuffer _input;
|
| +
|
| + CodedBufferReader.fromBuffer(List<int> _buffer, [
|
| + int recursionLimit = CodedReader.DEFAULT_RECURSION_LIMIT,
|
| + int sizeLimit = CodedReader.DEFAULT_SIZE_LIMIT]) :
|
| + super(recursionLimit, sizeLimit),
|
| + _input = new PbByteBuffer.fromList(_buffer);
|
| +
|
| + bool isAtEnd() =>
|
| + (_currentLimit != -1 && _bufferPos >= _currentLimit) || _input.isEmpty;
|
| +
|
| + void readGroup(int fieldNumber, Builder builder,
|
| + ExtensionRegistry extensionRegistry) {
|
| + if (_recursionDepth >= _recursionLimit) {
|
| + throw InvalidProtocolBufferException.recursionLimitExceeded();
|
| + }
|
| + ++_recursionDepth;
|
| + builder.mergeFromCodedBufferReader(this);
|
| + checkLastTagWas(WireFormat.makeTag(fieldNumber,
|
| + WireFormat.WIRETYPE_END_GROUP));
|
| + --_recursionDepth;
|
| + }
|
| +
|
| + void readUnknownFieldSetGroup(int fieldNumber, UnknownFieldSet_Builder builder) {
|
| + if (_recursionDepth >= _recursionLimit) {
|
| + throw InvalidProtocolBufferException.recursionLimitExceeded();
|
| + }
|
| + ++_recursionDepth;
|
| + builder.mergeFromCodedBufferReader(this);
|
| + checkLastTagWas(WireFormat.makeTag(fieldNumber,
|
| + WireFormat.WIRETYPE_END_GROUP));
|
| + --_recursionDepth;
|
| + }
|
| +
|
| + void readMessage(Builder builder, ExtensionRegistry extensionRegistry) {
|
| + int length = readInt32();
|
| + if (_recursionDepth >= _recursionLimit) {
|
| + throw InvalidProtocolBufferException.recursionLimitExceeded();
|
| + }
|
| + int oldLimit = _pushLimit(length);
|
| + ++_recursionDepth;
|
| + builder.mergeFromCodedBufferReader(this);
|
| + checkLastTagWas(0);
|
| + --_recursionDepth;
|
| + _popLimit(oldLimit);
|
| + }
|
| +
|
| + int readEnum() => readInt32();
|
| + int readInt32() => PbCodec.toInt32(readRawVarint());
|
| + Dynamic readInt64() => PbCodec.toInt64(readRawVarint());
|
| + int readUint32() => PbCodec.toUint32(readRawVarint());
|
| + int readUint64() => PbCodec.toUint64(readRawVarint());
|
| + int readSint32() => PbCodec.toSint32(readRawVarint());
|
| + Dynamic readSint64() => PbCodec.toSint64(readRawVarint());
|
| + int readFixed32() => PbCodec.toFixed32(readRaw32());
|
| + Dynamic readFixed64() => PbCodec.toFixed64(readRaw64());
|
| + int readSfixed32() => PbCodec.toSfixed32(readRaw32());
|
| + Dynamic readSfixed64() => PbCodec.toSfixed64(readRaw64());
|
| + bool readBool() => PbCodec.toBool(readRawVarint());
|
| + List<int> readBytes() => readRawLengthDelimited();
|
| + String readString() => decodeUtf8(readRawLengthDelimited());
|
| + double readFloat() => PbCodec.toFloat(readRaw32());
|
| + double readDouble() => PbCodec.toDouble(readRaw64());
|
| +
|
| + int readTag() {
|
| + if (isAtEnd()) {
|
| + _lastTag = 0;
|
| + return 0;
|
| + }
|
| +
|
| + _lastTag = readInt32();
|
| + if (WireFormat.getTagFieldNumber(_lastTag) == 0) {
|
| + throw InvalidProtocolBufferException.invalidTag();
|
| + }
|
| + return _lastTag;
|
| + }
|
| +
|
| + List<int> readRawVarint() {
|
| + List<int> rawBytes = [];
|
| + rawBytes.add(_readRawByte());
|
| + while (rawBytes.length < 10 && (rawBytes.last() & 0x80) != 0) {
|
| + int byte = _readRawByte();
|
| + if (byte == null) {
|
| + throw InvalidProtocolBufferException.truncatedMessage();
|
| + }
|
| + rawBytes.add(byte);
|
| + }
|
| + if ((rawBytes.last() & 0x80) != 0) {
|
| + throw InvalidProtocolBufferException.malformedVarint();
|
| + }
|
| + return rawBytes;
|
| + }
|
| +
|
| + List<int> readRaw32() => readRawFixed(4);
|
| + List<int> readRaw64() => readRawFixed(8);
|
| + List<int> readRawFixed(int length) => _readRawBytes(length);
|
| +
|
| + List<int> readRawLengthDelimited() {
|
| + int length = readInt32();
|
| + return _readRawBytes(length);
|
| + }
|
| +
|
| + int _readRawByte() {
|
| + _bufferPos++;
|
| + _checkLimit();
|
| + int byte = _input.readByte();
|
| + if (byte == null) {
|
| + throw InvalidProtocolBufferException.truncatedMessage();
|
| + }
|
| + return byte;
|
| + }
|
| +
|
| + List<int> _readRawBytes(int size) {
|
| + _bufferPos += size;
|
| + _checkLimit();
|
| + List<int> bytes = _input.readBytes(size);
|
| + return bytes;
|
| + }
|
| +
|
| + void skipField(int tag) {
|
| + int number = tag >> 3;
|
| + int wireType = tag & 0x7;
|
| + switch (wireType) {
|
| + case WireFormat.WIRETYPE_VARINT:
|
| + readRawVarint();
|
| + return;
|
| + case WireFormat.WIRETYPE_FIXED64:
|
| + readRaw64();
|
| + return;
|
| + case WireFormat.WIRETYPE_LENGTH_DELIMITED:
|
| + readRawLengthDelimited();
|
| + return;
|
| + case WireFormat.WIRETYPE_START_GROUP:
|
| + UnknownFieldSet_Builder subBuilder = new UnknownFieldSet_Builder();
|
| + readUnknownFieldSetGroup(number, subBuilder);
|
| + return;
|
| + case WireFormat.WIRETYPE_END_GROUP: // should not happen, but ignore?
|
| + return;
|
| + case WireFormat.WIRETYPE_FIXED32:
|
| + readRaw32();
|
| + return;
|
| + }
|
| + }
|
| +
|
| + void skipRawBytes(int number) {
|
| + _readRawBytes(number);
|
| + }
|
| +}
|
|
|