| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of protobuf; | 5 part of protobuf; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Per-message type setup. | 8 * Per-message type setup. |
| 9 */ | 9 */ |
| 10 class BuilderInfo { | 10 class BuilderInfo { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 void e(int tagNumber, String name, int fieldType, | 36 void e(int tagNumber, String name, int fieldType, |
| 37 dynamic defaultOrMaker, ValueOfFunc valueOf) { | 37 dynamic defaultOrMaker, ValueOfFunc valueOf) { |
| 38 add(tagNumber, name, fieldType, | 38 add(tagNumber, name, fieldType, |
| 39 defaultOrMaker, null, valueOf); | 39 defaultOrMaker, null, valueOf); |
| 40 } | 40 } |
| 41 | 41 |
| 42 // Repeated message. | 42 // Repeated message. |
| 43 // TODO(antonm): change the order of CreateBuilderFunc and MakeDefaultFunc. | 43 // TODO(antonm): change the order of CreateBuilderFunc and MakeDefaultFunc. |
| 44 void m(int tagNumber, String name, | 44 void m(int tagNumber, String name, |
| 45 CreateBuilderFunc subBuilder, MakeDefaultFunc makeDefault) { | 45 CreateBuilderFunc subBuilder, MakeDefaultFunc makeDefault) { |
| 46 add(tagNumber, name, GeneratedMessage._REPEATED_MESSAGE, | 46 add(tagNumber, name, FieldType._REPEATED_MESSAGE, |
| 47 makeDefault, subBuilder, null); | 47 makeDefault, subBuilder, null); |
| 48 } | 48 } |
| 49 | 49 |
| 50 // Repeated non-message. | 50 // Repeated non-message. |
| 51 void p(int tagNumber, String name, int fieldType) { | 51 void p(int tagNumber, String name, int fieldType) { |
| 52 MakeDefaultFunc makeDefault; | 52 MakeDefaultFunc makeDefault; |
| 53 switch (fieldType & ~0x7) { | 53 switch (fieldType & ~0x7) { |
| 54 case GeneratedMessage._BOOL_BIT: | 54 case FieldType._BOOL_BIT: |
| 55 makeDefault = () => new PbList<bool>(); | 55 makeDefault = () => new PbList<bool>(); |
| 56 break; | 56 break; |
| 57 case GeneratedMessage._BYTES_BIT: | 57 case FieldType._BYTES_BIT: |
| 58 makeDefault = () => new PbList<List<int>>(); | 58 makeDefault = () => new PbList<List<int>>(); |
| 59 break; | 59 break; |
| 60 case GeneratedMessage._STRING_BIT: | 60 case FieldType._STRING_BIT: |
| 61 makeDefault = () => new PbList<String>(); | 61 makeDefault = () => new PbList<String>(); |
| 62 break; | 62 break; |
| 63 case GeneratedMessage._FLOAT_BIT: | 63 case FieldType._FLOAT_BIT: |
| 64 makeDefault = () => new PbFloatList(); | 64 makeDefault = () => new PbFloatList(); |
| 65 break; | 65 break; |
| 66 case GeneratedMessage._DOUBLE_BIT: | 66 case FieldType._DOUBLE_BIT: |
| 67 makeDefault = () => new PbList<double>(); | 67 makeDefault = () => new PbList<double>(); |
| 68 break; | 68 break; |
| 69 case GeneratedMessage._ENUM_BIT: | 69 case FieldType._ENUM_BIT: |
| 70 makeDefault = () => new PbList<ProtobufEnum>(); | 70 makeDefault = () => new PbList<ProtobufEnum>(); |
| 71 break; | 71 break; |
| 72 case GeneratedMessage._INT32_BIT: | 72 case FieldType._INT32_BIT: |
| 73 case GeneratedMessage._SINT32_BIT: | 73 case FieldType._SINT32_BIT: |
| 74 case GeneratedMessage._SFIXED32_BIT: | 74 case FieldType._SFIXED32_BIT: |
| 75 makeDefault = () => new PbSint32List(); | 75 makeDefault = () => new PbSint32List(); |
| 76 break; | 76 break; |
| 77 case GeneratedMessage._UINT32_BIT: | 77 case FieldType._UINT32_BIT: |
| 78 case GeneratedMessage._FIXED32_BIT: | 78 case FieldType._FIXED32_BIT: |
| 79 makeDefault = () => new PbUint32List(); | 79 makeDefault = () => new PbUint32List(); |
| 80 break; | 80 break; |
| 81 case GeneratedMessage._INT64_BIT: | 81 case FieldType._INT64_BIT: |
| 82 case GeneratedMessage._SINT64_BIT: | 82 case FieldType._SINT64_BIT: |
| 83 case GeneratedMessage._SFIXED64_BIT: | 83 case FieldType._SFIXED64_BIT: |
| 84 makeDefault = () => new PbSint64List(); | 84 makeDefault = () => new PbSint64List(); |
| 85 break; | 85 break; |
| 86 case GeneratedMessage._UINT64_BIT: | 86 case FieldType._UINT64_BIT: |
| 87 case GeneratedMessage._FIXED64_BIT: | 87 case FieldType._FIXED64_BIT: |
| 88 makeDefault = () => new PbUint64List(); | 88 makeDefault = () => new PbUint64List(); |
| 89 break; | 89 break; |
| 90 case GeneratedMessage._MESSAGE_BIT: | 90 case FieldType._MESSAGE_BIT: |
| 91 throw new ArgumentError('use BuilderInfo.m() for repeated messages'); | 91 throw new ArgumentError('use BuilderInfo.m() for repeated messages'); |
| 92 default: | 92 default: |
| 93 throw new ArgumentError('unknown type ${fieldType}'); | 93 throw new ArgumentError('unknown type ${fieldType}'); |
| 94 } | 94 } |
| 95 | 95 |
| 96 add(tagNumber, name, fieldType, makeDefault, null, null); | 96 add(tagNumber, name, fieldType, makeDefault, null, null); |
| 97 } | 97 } |
| 98 | 98 |
| 99 bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber); | 99 bool containsTagNumber(int tagNumber) => fieldInfo.containsKey(tagNumber); |
| 100 | 100 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 ValueOfFunc valueOfFunc(int tagNumber) { | 137 ValueOfFunc valueOfFunc(int tagNumber) { |
| 138 FieldInfo i = fieldInfo[tagNumber]; | 138 FieldInfo i = fieldInfo[tagNumber]; |
| 139 return i != null ? i.valueOf : null; | 139 return i != null ? i.valueOf : null; |
| 140 } | 140 } |
| 141 | 141 |
| 142 bool _isFieldInitialized(Map<int, dynamic> fieldValues, int tagNumber, | 142 bool _isFieldInitialized(Map<int, dynamic> fieldValues, int tagNumber, |
| 143 [int fieldType = null]) { | 143 [int fieldType = null]) { |
| 144 if (fieldType == null) { | 144 if (fieldType == null) { |
| 145 fieldType = fieldInfo[tagNumber].type; | 145 fieldType = fieldInfo[tagNumber].type; |
| 146 } | 146 } |
| 147 if ((fieldType & | 147 if (_isGroupOrMessage(fieldType)) { |
| 148 (GeneratedMessage._MESSAGE_BIT | GeneratedMessage._GROUP_BIT)) != 0) { | 148 if (_isRequired(fieldType)) { |
| 149 if ((fieldType & GeneratedMessage._REQUIRED_BIT) != 0) { | |
| 150 GeneratedMessage message = fieldValues[tagNumber]; | 149 GeneratedMessage message = fieldValues[tagNumber]; |
| 151 // Required message/group must be present and initialized. | 150 // Required message/group must be present and initialized. |
| 152 if (message == null || !message.isInitialized()) { | 151 if (message == null || !message.isInitialized()) { |
| 153 return false; | 152 return false; |
| 154 } | 153 } |
| 155 } else if ((fieldType & GeneratedMessage._REPEATED_BIT) != 0) { | 154 } else if (_isRepeated(fieldType)) { |
| 156 if (fieldValues.containsKey(tagNumber)) { | 155 if (fieldValues.containsKey(tagNumber)) { |
| 157 // Repeated message/group must have all its members initialized. | 156 // Repeated message/group must have all its members initialized. |
| 158 List list = fieldValues[tagNumber]; | 157 List list = fieldValues[tagNumber]; |
| 159 // For message types that (recursively) contain no required fields, | 158 // For message types that (recursively) contain no required fields, |
| 160 // short-circuit the loop. | 159 // short-circuit the loop. |
| 161 if (!list.isEmpty && list[0].hasRequiredFields()) { | 160 if (!list.isEmpty && list[0].hasRequiredFields()) { |
| 162 if (!list.every((message) => message.isInitialized())) { | 161 if (!list.every((message) => message.isInitialized())) { |
| 163 return false; | 162 return false; |
| 164 } | 163 } |
| 165 } | 164 } |
| 166 } | 165 } |
| 167 } else { | 166 } else { |
| 168 GeneratedMessage message = fieldValues[tagNumber]; | 167 GeneratedMessage message = fieldValues[tagNumber]; |
| 169 // Optional message/group must be initialized if it is present. | 168 // Optional message/group must be initialized if it is present. |
| 170 if (message != null && !message.isInitialized()) { | 169 if (message != null && !message.isInitialized()) { |
| 171 return false; | 170 return false; |
| 172 } | 171 } |
| 173 } | 172 } |
| 174 | 173 |
| 175 } else if ((fieldType & GeneratedMessage._REQUIRED_BIT) != 0) { | 174 } else if (_isRequired(fieldType)) { |
| 176 // Required 'primitive' must be present. | 175 // Required 'primitive' must be present. |
| 177 if (fieldValues[tagNumber] == null) { | 176 if (fieldValues[tagNumber] == null) { |
| 178 return false; | 177 return false; |
| 179 } | 178 } |
| 180 } | 179 } |
| 181 return true; | 180 return true; |
| 182 } | 181 } |
| 183 | 182 |
| 184 List<String> _findInvalidFields(Map<int, dynamic> fieldValues, | 183 List<String> _findInvalidFields(Map<int, dynamic> fieldValues, |
| 185 List<String> invalidFields, [String prefix = '']) { | 184 List<String> invalidFields, [String prefix = '']) { |
| 186 fieldInfo.forEach((int tagNumber, FieldInfo field) { | 185 fieldInfo.forEach((int tagNumber, FieldInfo field) { |
| 187 int fieldType = field.type; | 186 int fieldType = field.type; |
| 188 if ((fieldType & | 187 if (_isGroupOrMessage(fieldType)) { |
| 189 (GeneratedMessage._MESSAGE_BIT | GeneratedMessage._GROUP_BIT)) != 0) { | 188 if (_isRequired(fieldType)) { |
| 190 if ((fieldType & GeneratedMessage._REQUIRED_BIT) != 0) { | |
| 191 GeneratedMessage message = fieldValues[tagNumber]; | 189 GeneratedMessage message = fieldValues[tagNumber]; |
| 192 // Required message/group must be present. | 190 // Required message/group must be present. |
| 193 if (message == null) { | 191 if (message == null) { |
| 194 invalidFields.add('${prefix}${field.name}'); | 192 invalidFields.add('${prefix}${field.name}'); |
| 195 } else { | 193 } else { |
| 196 message._findInvalidFields( | 194 message._findInvalidFields( |
| 197 invalidFields, '${prefix}${field.name}.'); | 195 invalidFields, '${prefix}${field.name}.'); |
| 198 } | 196 } |
| 199 } else if ((fieldType & GeneratedMessage._REPEATED_BIT) != 0) { | 197 } else if (_isRepeated(fieldType)) { |
| 200 if (fieldValues.containsKey(tagNumber)) { | 198 if (fieldValues.containsKey(tagNumber)) { |
| 201 // Repeated message/group must have all its members initialized. | 199 // Repeated message/group must have all its members initialized. |
| 202 List list = fieldValues[tagNumber]; | 200 List list = fieldValues[tagNumber]; |
| 203 // For messages that (recursively) contain no required fields, | 201 // For messages that (recursively) contain no required fields, |
| 204 // short-circuit the loop. | 202 // short-circuit the loop. |
| 205 if (!list.isEmpty && list[0].hasRequiredFields()) { | 203 if (!list.isEmpty && list[0].hasRequiredFields()) { |
| 206 int position = 0; | 204 int position = 0; |
| 207 for (GeneratedMessage message in list) { | 205 for (GeneratedMessage message in list) { |
| 208 if (message.hasRequiredFields()) { | 206 if (message.hasRequiredFields()) { |
| 209 message._findInvalidFields( | 207 message._findInvalidFields( |
| 210 invalidFields, '${prefix}${field.name}[${position}].'); | 208 invalidFields, '${prefix}${field.name}[${position}].'); |
| 211 } | 209 } |
| 212 position++; | 210 position++; |
| 213 } | 211 } |
| 214 } | 212 } |
| 215 } | 213 } |
| 216 } else { | 214 } else { |
| 217 GeneratedMessage message = fieldValues[tagNumber]; | 215 GeneratedMessage message = fieldValues[tagNumber]; |
| 218 // Required message/group must be present. | 216 // Required message/group must be present. |
| 219 if (message != null) { | 217 if (message != null) { |
| 220 message._findInvalidFields(invalidFields, '${prefix}${field.name}.')
; | 218 message._findInvalidFields(invalidFields, '${prefix}${field.name}.')
; |
| 221 } | 219 } |
| 222 } | 220 } |
| 223 | 221 |
| 224 } else if((fieldType & GeneratedMessage._REQUIRED_BIT) != 0) { | 222 } else if(_isRequired(fieldType)) { |
| 225 // Required 'primitive' must be present. | 223 // Required 'primitive' must be present. |
| 226 if (fieldValues[tagNumber] == null) { | 224 if (fieldValues[tagNumber] == null) { |
| 227 invalidFields.add('${prefix}${field.name}'); | 225 invalidFields.add('${prefix}${field.name}'); |
| 228 } | 226 } |
| 229 } | 227 } |
| 230 }); | 228 }); |
| 231 return invalidFields; | 229 return invalidFields; |
| 232 } | 230 } |
| 233 } | 231 } |
| OLD | NEW |