Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(806)

Unified Diff: lib/protobuf/runtime/GeneratedMessage.dart

Issue 10595002: Protocol Buffer runtime library and 'protoc' plugin (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Work around http://code.google.com/p/dart/issues/detail?id=3806 Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/protobuf/runtime/FieldInfo.dart ('k') | lib/protobuf/runtime/ImmutableList.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
+ }
+}
« no previous file with comments | « lib/protobuf/runtime/FieldInfo.dart ('k') | lib/protobuf/runtime/ImmutableList.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698