| Index: lib/protobuf/runtime/GeneratedMessage.dart
|
| diff --git a/lib/protobuf/runtime/GeneratedMessage.dart b/lib/protobuf/runtime/GeneratedMessage.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..483cb1a8118bfe73f089f61ae2a9f65e65164d3b
|
| --- /dev/null
|
| +++ b/lib/protobuf/runtime/GeneratedMessage.dart
|
| @@ -0,0 +1,776 @@
|
| +// 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 GeneratedMessage implements Message, Hashable {
|
| +
|
| + BuilderInfo _builderInfo;
|
| + Map<int, Dynamic> _fieldValues;
|
| + int _memoizedHashCode = -1;
|
| + int _memoizedIsInitialized = -1;
|
| + int _memoizedSerializedSize = -1;
|
| + Map<int, int> _serializedSize;
|
| + Map<int, Extension> _extensions;
|
| + UnknownFieldSet _unknownFields;
|
| +
|
| + static GeneratedMessage parseBuffer(Builder builder, List<int> input,
|
| + [ExtensionRegistry extensionRegistry]) {
|
| + extensionRegistry = extensionRegistry == null ?
|
| + ExtensionRegistry.EMPTY_REGISTRY : extensionRegistry;
|
| + return builder.mergeFromBuffer(input, extensionRegistry).buildParsed();
|
| + }
|
| +
|
| + static Future<GeneratedMessage> parseStream(Builder builder,
|
| + InputStream input, [ExtensionRegistry extensionRegistry]) {
|
| + extensionRegistry = extensionRegistry == null ?
|
| + ExtensionRegistry.EMPTY_REGISTRY : extensionRegistry;
|
| + return builder.mergeFromStream(input, extensionRegistry)
|
| + .transform((var _) => builder.buildParsed());
|
| + }
|
| +
|
| + GeneratedMessage(Builder builder)
|
| + : _builderInfo = builder.info_,
|
| + _fieldValues = new Map<int, Dynamic>(),
|
| + _serializedSize = new Map<int, int>(),
|
| + _unknownFields = builder.unknownFields;
|
| +
|
| + bool operator ==(Object o) {
|
| + if (!(o is GeneratedMessage)){
|
| + return false;
|
| + }
|
| + GeneratedMessage om = o;
|
| + if (om._builderInfo != _builderInfo) {
|
| + return false;
|
| + }
|
| +
|
| + if (_fieldValues.length != om._fieldValues.length) {
|
| + return false;
|
| + }
|
| +
|
| + // because lengths are equal, sufficient to test inclusion in 1 direction.
|
| + for (int key in _fieldValues.getKeys()) {
|
| + if (!om._fieldValues.containsKey(key) ||
|
| + _fieldValues[key] != om._fieldValues[key]) {
|
| + return false;
|
| + }
|
| + }
|
| + if (om._unknownFields != _unknownFields) return false;
|
| + return true;
|
| + }
|
| +
|
| + bool extensionsAreInitialized() {
|
| + return true; // fixme
|
| + }
|
| +
|
| + Dynamic getField(int tagNumber) {
|
| + var value = _fieldValues[tagNumber];
|
| + // Initialize the field
|
| + if (value === null) {
|
| + var defaultFunc = _builderInfo.makeDefault(tagNumber);
|
| + if (defaultFunc != null) {
|
| + value = defaultFunc();
|
| + }
|
| + }
|
| + return value;
|
| + }
|
| +
|
| + int _getFieldType(int tagNumber) {
|
| + int fieldType = _builderInfo.fieldType(tagNumber);
|
| + if (fieldType == null) {
|
| + fieldType = _extensions[tagNumber].type;
|
| + }
|
| + return fieldType;
|
| + }
|
| +
|
| + // Shorthand for getField
|
| + Dynamic g_(int tagNumber) => getField(tagNumber);
|
| +
|
| + int getSerializedSize() {
|
| + if (_memoizedSerializedSize != -1) return _memoizedSerializedSize;
|
| + int size = 0;
|
| +
|
| + for (int tagNumber in _fieldValues.getKeys()) {
|
| + var fieldValue = _fieldValues[tagNumber];
|
| + int fieldType = _getFieldType(tagNumber) & ~Builder._REQUIRED_BIT;
|
| + size += _computeSize(tagNumber, fieldType, fieldValue);
|
| + }
|
| +
|
| + size += unknownFields.getSerializedSize();
|
| + _memoizedSerializedSize = size;
|
| + return size;
|
| + }
|
| +
|
| + int _computeSize(int tagNumber, int fieldType, var fieldValue) {
|
| + int size = 0;
|
| + switch (fieldType) {
|
| + case Builder._OPTIONAL_BOOL:
|
| + return CodedBufferWriter.computeBoolSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_BYTES:
|
| + return CodedBufferWriter.computeBytesSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_STRING:
|
| + return CodedBufferWriter.computeStringSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_FLOAT:
|
| + return CodedBufferWriter.computeFloatSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_DOUBLE:
|
| + return CodedBufferWriter.computeDoubleSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_ENUM:
|
| + return CodedBufferWriter.computeEnumSize(tagNumber, fieldValue.value);
|
| + case Builder._OPTIONAL_GROUP:
|
| + return CodedBufferWriter.computeGroupSize(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_INT32:
|
| + return CodedBufferWriter.computeInt32Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_INT64:
|
| + return CodedBufferWriter.computeInt64Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_SINT32:
|
| + return CodedBufferWriter.computeSint32Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_SINT64:
|
| + return CodedBufferWriter.computeSint64Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_UINT32:
|
| + return CodedBufferWriter.computeUint32Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_UINT64:
|
| + return CodedBufferWriter.computeUint64Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_FIXED32:
|
| + return CodedBufferWriter.computeFixed32Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_FIXED64:
|
| + return CodedBufferWriter.computeFixed64Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_SFIXED32:
|
| + return CodedBufferWriter.computeSfixed32Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_SFIXED64:
|
| + return CodedBufferWriter.computeSfixed64Size(tagNumber, fieldValue);
|
| + case Builder._OPTIONAL_MESSAGE:
|
| + return CodedBufferWriter.computeMessageSize(tagNumber, fieldValue);
|
| + case Builder._REPEATED_BOOL:
|
| + for (bool val in fieldValue) {
|
| + size += CodedBufferWriter.computeBoolSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_BYTES:
|
| + List<List<int>> list = fieldValue;
|
| + for (List<int> val in list) {
|
| + size += CodedBufferWriter.computeBytesSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_STRING:
|
| + List<String> list = fieldValue;
|
| + for (String val in list) {
|
| + size += CodedBufferWriter.computeStringSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_FLOAT:
|
| + List<double> list = fieldValue;
|
| + for (double val in list) {
|
| + size += CodedBufferWriter.computeFloatSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_DOUBLE:
|
| + List<double> list = fieldValue;
|
| + for (double val in list) {
|
| + size += CodedBufferWriter.computeDoubleSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_ENUM:
|
| + for (var val in fieldValue) {
|
| + size += CodedBufferWriter.computeEnumSize(tagNumber, val.value);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_GROUP:
|
| + for (var val in fieldValue) {
|
| + size += CodedBufferWriter.computeGroupSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_INT32:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeInt32Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_INT64:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeInt64Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_SINT32:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeSint32Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_SINT64:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeSint64Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_UINT32:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeUint32Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_UINT64:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeUint64Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_FIXED32:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeFixed32Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_FIXED64:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeFixed64Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_SFIXED32:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeSfixed32Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_SFIXED64:
|
| + List<int> list = fieldValue;
|
| + for (int val in list) {
|
| + size += CodedBufferWriter.computeSfixed64Size(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._REPEATED_MESSAGE:
|
| + for (Message val in fieldValue) {
|
| + size += CodedBufferWriter.computeMessageSize(tagNumber, val);
|
| + }
|
| + return size;
|
| + case Builder._PACKED_BOOL:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeBoolSizeNoTag);
|
| + case Builder._PACKED_FLOAT:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeFloatSizeNoTag);
|
| + case Builder._PACKED_DOUBLE:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeDoubleSizeNoTag);
|
| + case Builder._PACKED_ENUM:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeEnumSizeNoTag);
|
| + case Builder._PACKED_INT32:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeInt32SizeNoTag);
|
| + case Builder._PACKED_INT64:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeInt64SizeNoTag);
|
| + case Builder._PACKED_UINT32:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeUint32SizeNoTag);
|
| + case Builder._PACKED_UINT64:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeUint64SizeNoTag);
|
| + case Builder._PACKED_SINT32:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeSint32SizeNoTag);
|
| + case Builder._PACKED_SINT64:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeSint64SizeNoTag);
|
| + case Builder._PACKED_FIXED32:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeFixed32SizeNoTag);
|
| + case Builder._PACKED_FIXED64:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeFixed64SizeNoTag);
|
| + case Builder._PACKED_SFIXED32:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeSfixed32SizeNoTag);
|
| + case Builder._PACKED_SFIXED64:
|
| + return _computePackedSize(tagNumber, fieldValue,
|
| + CodedBufferWriter.computeSfixed64SizeNoTag);
|
| + default:
|
| + throw "Unknown type $fieldType";
|
| + }
|
| + }
|
| +
|
| + int _computePackedSize(int tagNumber, List values, var sizeFunc) {
|
| + int dataSize = 0;
|
| + for (var val in values) {
|
| + dataSize += sizeFunc(val);
|
| + }
|
| + _serializedSize[tagNumber] = dataSize;
|
| + if (!values.isEmpty()) {
|
| + dataSize += CodedBufferWriter.computeInt32Size(tagNumber, dataSize);
|
| + }
|
| + return dataSize;
|
| + }
|
| +
|
| + int getTagNumber(String fieldName) => _builderInfo.tagNumber(fieldName);
|
| +
|
| + UnknownFieldSet get unknownFields() => _unknownFields;
|
| +
|
| + bool hasField(int tagNumber) => _fieldValues.containsKey(tagNumber);
|
| +
|
| + // Shorthand for hasField
|
| + bool h_(int tagNumber) => hasField(tagNumber);
|
| +
|
| + bool hasRequiredFields() => _builderInfo.hasRequiredFields;
|
| +
|
| + int hashCode() {
|
| + if (_memoizedHashCode == -1) {
|
| + _memoizedHashCode = 0;
|
| + for (int tagNumber in _fieldValues.getKeys()) {
|
| + _memoizedHashCode = (17 * _memoizedHashCode) + tagNumber;
|
| + var value = _fieldValues[tagNumber];
|
| + if (value is Hashable) {
|
| + _memoizedHashCode = (31 * _memoizedHashCode) + value.hashCode();
|
| + }
|
| + }
|
| + if (_unknownFields != null) {
|
| + _memoizedHashCode =
|
| + (23 * _memoizedHashCode) + _unknownFields.hashCode();
|
| + }
|
| + }
|
| + return _memoizedHashCode;
|
| + }
|
| +
|
| + void _findInvalidFields(List<String> invalidFields, String prefix) {
|
| + _builderInfo._findInvalidFields(_fieldValues, invalidFields, prefix);
|
| + }
|
| +
|
| + bool isInitialized() {
|
| + if (!hasRequiredFields()) {
|
| + return true;
|
| + }
|
| + if (_memoizedIsInitialized != -1) {
|
| + return _memoizedIsInitialized == 1;
|
| + }
|
| +
|
| + bool initialized = _builderInfo.isInitialized(_fieldValues);
|
| + _memoizedIsInitialized = initialized ? 1 : 0;
|
| + return initialized;
|
| + }
|
| +
|
| + String toString() {
|
| + return _toString();
|
| + }
|
| +
|
| + String _toString([String indent = ""]) {
|
| + StringBuffer s = new StringBuffer();
|
| + void renderValue(key, value) {
|
| + if (value is Message) {
|
| + s.add("${indent}${key}: {\n");
|
| + s.add(value._toString("$indent "));
|
| + s.add("${indent}}\n");
|
| + } else {
|
| + s.add("${indent}${key}: ${value}\n");
|
| + }
|
| + }
|
| +
|
| + // Sort output by tag number
|
| + List<FieldInfo> fields = new List<FieldInfo>.from(_builderInfo.fieldInfo.getValues());
|
| + fields.sort((a, b) => a.tagNumber.compareTo(b.tagNumber));
|
| + List<String> keys = fields.map((FieldInfo field) => field.name);
|
| +
|
| + for (FieldInfo field in fields) {
|
| + if (hasField(field.tagNumber)) {
|
| + var fieldValue = _fieldValues[field.tagNumber];
|
| + if (fieldValue is List) {
|
| + // work around http://code.google.com/p/dart/issues/detail?id=3817
|
| + for (int i = 0; i < fieldValue.length; i++) {
|
| + renderValue(field.name, fieldValue[i]);
|
| + }
|
| + } else {
|
| + renderValue(field.name, fieldValue);
|
| + }
|
| + }
|
| + }
|
| + if (_unknownFields != null) {
|
| + s.add(_unknownFields.toString());
|
| + }
|
| + return s.toString();
|
| + }
|
| +
|
| + List<int> writeToBuffer() {
|
| + CodedBufferWriter out = new CodedBufferWriter(getSerializedSize());
|
| + writeToCodedBufferWriter(out);
|
| + return out.buffer;
|
| + }
|
| +
|
| + void writeToCodedBufferWriter(CodedBufferWriter output) {
|
| + getSerializedSize();
|
| +
|
| + List<int> keys = new List<int>.from(_fieldValues.getKeys());
|
| + keys.sort((a, b) => a.compareTo(b));
|
| + for (int tagNumber in keys) {
|
| + var fieldValue = _fieldValues[tagNumber];
|
| + int fieldType = _getFieldType(tagNumber) & ~Builder._REQUIRED_BIT;
|
| + _writeField(output, tagNumber, fieldType, fieldValue);
|
| + }
|
| + unknownFields.writeToCodedBufferWriter(output);
|
| + }
|
| +
|
| + void _writeField(CodedBufferWriter output, int tagNumber, int fieldType,
|
| + var fieldValue) {
|
| + switch (fieldType) {
|
| + case Builder._OPTIONAL_BOOL:
|
| + output.writeBool(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_BYTES:
|
| + output.writeBytes(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_STRING:
|
| + output.writeString(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_FLOAT:
|
| + output.writeFloat(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_DOUBLE:
|
| + output.writeDouble(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_ENUM:
|
| + output.writeEnum(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_GROUP:
|
| + output.writeGroup(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_INT32:
|
| + output.writeInt32(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_INT64:
|
| + output.writeInt64(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_SINT32:
|
| + output.writeSint32(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_SINT64:
|
| + output.writeSint64(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_UINT32:
|
| + output.writeUint32(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_UINT64:
|
| + output.writeUint64(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_FIXED32:
|
| + output.writeFixed32(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_FIXED64:
|
| + output.writeFixed64(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_SFIXED32:
|
| + output.writeSfixed32(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_SFIXED64:
|
| + output.writeSfixed64(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._OPTIONAL_MESSAGE:
|
| + output.writeMessage(tagNumber, fieldValue);
|
| + break;
|
| + case Builder._REPEATED_BOOL:
|
| + for (bool val in fieldValue) {
|
| + output.writeBool(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_BYTES:
|
| + for (List<int> val in fieldValue) {
|
| + output.writeBytes(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_STRING:
|
| + for (String val in fieldValue) {
|
| + output.writeString(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_FLOAT:
|
| + for (double val in fieldValue) {
|
| + output.writeFloat(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_DOUBLE:
|
| + for (double val in fieldValue) {
|
| + output.writeDouble(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_ENUM:
|
| + for (var val in fieldValue) {
|
| + output.writeEnum(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_GROUP:
|
| + for (var val in fieldValue) {
|
| + output.writeGroup(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_INT32:
|
| + for (int val in fieldValue) {
|
| + output.writeInt32(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_INT64:
|
| + for (int val in fieldValue) {
|
| + output.writeInt64(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_SINT32:
|
| + for (int val in fieldValue) {
|
| + output.writeSint32(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_SINT64:
|
| + for (int val in fieldValue) {
|
| + output.writeSint64(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_UINT32:
|
| + for (int val in fieldValue) {
|
| + output.writeUint32(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_UINT64:
|
| + for (int val in fieldValue) {
|
| + output.writeUint64(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_FIXED32:
|
| + for (int val in fieldValue) {
|
| + output.writeFixed32(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_FIXED64:
|
| + for (int val in fieldValue) {
|
| + output.writeFixed64(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_SFIXED32:
|
| + for (int val in fieldValue) {
|
| + output.writeSfixed32(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_SFIXED64:
|
| + for (int val in fieldValue) {
|
| + output.writeSfixed64(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._REPEATED_MESSAGE:
|
| + for (Message val in fieldValue) {
|
| + output.writeMessage(tagNumber, val);
|
| + }
|
| + break;
|
| + case Builder._PACKED_BOOL:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeBoolNoTag);
|
| + break;
|
| + case Builder._PACKED_FLOAT:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeFloatNoTag);
|
| + break;
|
| + case Builder._PACKED_DOUBLE:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeDoubleNoTag);
|
| + break;
|
| + case Builder._PACKED_ENUM:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeEnumNoTag);
|
| + break;
|
| + case Builder._PACKED_INT32:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeInt32NoTag);
|
| + break;
|
| + case Builder._PACKED_INT64:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeInt64NoTag);
|
| + break;
|
| + case Builder._PACKED_UINT32:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeUint32NoTag);
|
| + break;
|
| + case Builder._PACKED_UINT64:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeUint64NoTag);
|
| + break;
|
| + case Builder._PACKED_SINT32:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeSint32NoTag);
|
| + break;
|
| + case Builder._PACKED_SINT64:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeSint64NoTag);
|
| + break;
|
| + case Builder._PACKED_FIXED32:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeFixed32NoTag);
|
| + break;
|
| + case Builder._PACKED_FIXED64:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeFixed64NoTag);
|
| + break;
|
| + case Builder._PACKED_SFIXED32:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeSfixed32NoTag);
|
| + break;
|
| + case Builder._PACKED_SFIXED64:
|
| + _writePacked(output, tagNumber, fieldValue,
|
| + output.writeSfixed64NoTag);
|
| + break;
|
| + default:
|
| + throw "Unknown type $fieldType";
|
| + }
|
| + }
|
| +
|
| + void _writePacked(CodedBufferWriter output, int tagNumber, List values,
|
| + var writeFunc) {
|
| + if (values.length > 0) {
|
| + output.writeTag(tagNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
|
| + output.writeInt32NoTag(_serializedSize[tagNumber]);
|
| + }
|
| + for (var val in values) {
|
| + writeFunc(val);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Return [:true:] if the given extension field contains data. Returns
|
| + * [:false:] for a repeated field with no elements.
|
| + */
|
| + bool hasExtension(Extension extension) {
|
| + return hasField(extension.tagNumber);
|
| + }
|
| +
|
| + /**
|
| + * Returns the value of the given extension. For repeated fields that have
|
| + * not been set previously, [:null:] is returned.
|
| + */
|
| + Dynamic getExtension(Extension extension) {
|
| + var value = _fieldValues[extension.tagNumber];
|
| + // Initialize the field
|
| + if (value === null) {
|
| + var defaultFunc = extension.makeDefault;
|
| + if (defaultFunc != null) {
|
| + value = defaultFunc();
|
| + }
|
| + if (value != null) {
|
| + _fieldValues[extension.tagNumber] = value;
|
| + }
|
| + }
|
| + return value;
|
| + }
|
| +
|
| + int getExtensionCount(Extension extension) {
|
| + List list = _fieldValues[extension.tagNumber];
|
| + return list === null ? 0 : list.length;
|
| + }
|
| +
|
| + // JSON support
|
| +
|
| + // Append a JSON value to a StringBuffer
|
| + void _writeJsonValue(var fieldValue, int fieldType, StringBuffer sb) {
|
| + fieldType &= ~(Builder._REPEATED_BIT | Builder._PACKED_BIT);
|
| + switch (fieldType) {
|
| + case Builder._BOOL_BIT:
|
| + sb.add(fieldValue == true ? "true" : "false");
|
| + break;
|
| + case Builder._BYTES_BIT:
|
| + // Encode 'bytes' as a base64-encoded string
|
| + sb.add('"');
|
| + sb.add(Base64Codec.defaultInstance.encodeList(fieldValue));
|
| + sb.add('"');
|
| + break;
|
| + case Builder._STRING_BIT:
|
| + // Perform string escaping
|
| + sb.add('"');
|
| + sb.add(PbCodec.escapeString(fieldValue));
|
| + sb.add('"');
|
| + break;
|
| + case Builder._FLOAT_BIT:
|
| + case Builder._DOUBLE_BIT:
|
| + // Force 'xxx.0' output for integral values
|
| + if (fieldValue.floor() == fieldValue) {
|
| + sb.add(fieldValue.floor().toInt());
|
| + sb.add('.0');
|
| + } else {
|
| + sb.add(fieldValue);
|
| + }
|
| + break;
|
| + case Builder._ENUM_BIT:
|
| + ProtobufEnum enum = fieldValue;
|
| + sb.add(enum.value); // assume |value| < 2^52
|
| + break;
|
| + case Builder._INT32_BIT:
|
| + case Builder._SINT32_BIT:
|
| + case Builder._UINT32_BIT:
|
| + case Builder._FIXED32_BIT:
|
| + case Builder._SFIXED32_BIT:
|
| + sb.add(fieldValue);
|
| + break;
|
| + case Builder._INT64_BIT:
|
| + case Builder._SINT64_BIT:
|
| + case Builder._UINT64_BIT:
|
| + case Builder._FIXED64_BIT:
|
| + case Builder._SFIXED64_BIT:
|
| + sb.add('"$fieldValue"');
|
| + break;
|
| + case Builder._GROUP_BIT:
|
| + case Builder._MESSAGE_BIT:
|
| + fieldValue._toJson(sb);
|
| + break;
|
| + default:
|
| + throw "Unknown type $fieldType";
|
| + }
|
| + }
|
| +
|
| + // Convert this message to JSON, appending it to a StringBuffer
|
| + String _toJson(StringBuffer sb) {
|
| + List<int> keys = new List<int>.from(_fieldValues.getKeys());
|
| + keys.sort((a, b) => a.compareTo(b));
|
| + sb.add("{");
|
| + bool firstTime = true;
|
| + for (int tagNumber in keys) {
|
| + if (!firstTime) {
|
| + sb.add(",");
|
| + }
|
| + firstTime = false;
|
| + String tagName = _builderInfo.fieldName(tagNumber);
|
| + sb.add('\"$tagNumber\":');
|
| + var fieldValue = _fieldValues[tagNumber];
|
| + int fieldType = _getFieldType(tagNumber) & ~Builder._REQUIRED_BIT;
|
| + if ((fieldType & Builder._REPEATED_BIT) != 0) {
|
| + // Encoded repeated values as an array
|
| + sb.add("[");
|
| + bool ft = true;
|
| + for (var value in fieldValue) {
|
| + if (!ft) {
|
| + sb.add(",");
|
| + }
|
| + ft = false;
|
| + _writeJsonValue(value, fieldType, sb);
|
| + }
|
| + sb.add("]");
|
| + } else {
|
| + _writeJsonValue(fieldValue, fieldType, sb);
|
| + }
|
| + }
|
| + sb.add("}");
|
| + }
|
| +
|
| + /**
|
| + * Return a JSON string that encodes this message. Each message (top level
|
| + * or nested) is represented as an object delimited by curly braces. Within
|
| + * a message, elements are indexed by tag number (surrounded by quotes).
|
| + * Repeated elements are represented as arrays.
|
| + *
|
| + * Boolean values, strings, and floating-point values are represented as
|
| + * literals. Values with a 32-bit integer datatype are represented as integer
|
| + * literals; values with a 64-bit integer datatype (regardless of their
|
| + * actual runtime value) are represented as strings. Enumerated values are
|
| + * represented as their integer value.
|
| + */
|
| + String writeToJson() {
|
| + StringBuffer sb = new StringBuffer();
|
| + _toJson(sb);
|
| + return sb.toString();
|
| + }
|
| +
|
| + // Called from generated code
|
| + static GeneratedMessage parseJson(Builder builder, String input,
|
| + [ExtensionRegistry extensionRegistry]) {
|
| + return builder.mergeFromJson(input, extensionRegistry).buildParsed();
|
| + }
|
| +}
|
|
|