aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers/ExtendableBuilderLite.cs
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2011-06-03 21:35:02 -0500
committerrogerk <devnull@localhost>2011-06-03 21:35:02 -0500
commitd2af9e923f4f2d7f7c56a2e74d5a26536aae0369 (patch)
tree786a89b7f356bf8e4d897453d6fe45dab80d2dea /src/ProtocolBuffers/ExtendableBuilderLite.cs
parent9928441649bde7a5e3bb84808821f1a5bef0bba6 (diff)
downloadprotobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.gz
protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.bz2
protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.zip
Refactoring of CodedInputStream.Read??? to use boolean return with out param.
Diffstat (limited to 'src/ProtocolBuffers/ExtendableBuilderLite.cs')
-rw-r--r--src/ProtocolBuffers/ExtendableBuilderLite.cs158
1 files changed, 60 insertions, 98 deletions
diff --git a/src/ProtocolBuffers/ExtendableBuilderLite.cs b/src/ProtocolBuffers/ExtendableBuilderLite.cs
index fc748e6f..f9508d4a 100644
--- a/src/ProtocolBuffers/ExtendableBuilderLite.cs
+++ b/src/ProtocolBuffers/ExtendableBuilderLite.cs
@@ -134,7 +134,7 @@ namespace Google.ProtocolBuffers
/// <returns>true unless the tag is an end-group tag</returns>
[CLSCompliant(false)]
protected override bool ParseUnknownField(CodedInputStream input,
- ExtensionRegistry extensionRegistry, uint tag)
+ ExtensionRegistry extensionRegistry, uint tag, string fieldName)
{
FieldSet extensions = MessageBeingBuilt.Extensions;
@@ -142,119 +142,81 @@ namespace Google.ProtocolBuffers
int fieldNumber = WireFormat.GetTagFieldNumber(tag);
IGeneratedExtensionLite extension = extensionRegistry[DefaultInstanceForType, fieldNumber];
- bool unknown = false;
- bool packed = false;
- if (extension == null)
- {
- unknown = true; // Unknown field.
- }
- else if (wireType ==
- FieldMappingAttribute.WireTypeFromFieldType(extension.Descriptor.FieldType, false /* isPacked */))
- {
- packed = false; // Normal, unpacked value.
- }
- else if (extension.Descriptor.IsRepeated &&
- //?? just returns true ?? extension.Descriptor.type.isPackable() &&
- wireType ==
- FieldMappingAttribute.WireTypeFromFieldType(extension.Descriptor.FieldType, true /* isPacked */))
- {
- packed = true; // Packed value.
- }
- else
- {
- unknown = true; // Wrong wire type.
- }
+ if (extension == null)//unknown field
+ return input.SkipField();
- if (unknown)
- {
- // Unknown field or wrong wire type. Skip.
+ IFieldDescriptorLite field = extension.Descriptor;
+ if (!field.IsRepeated && wireType != WireFormat.GetWireType(field.FieldType)) //invalid wire type
return input.SkipField();
- }
- if (packed)
+ switch (field.FieldType)
{
- int length = (int) Math.Min(int.MaxValue, input.ReadRawVarint32());
- int limit = input.PushLimit(length);
- if (extension.Descriptor.FieldType == FieldType.Enum)
- {
- while (!input.ReachedLimit)
+ case FieldType.Group:
+ case FieldType.Message:
{
- int rawValue = input.ReadEnum();
- Object value =
- extension.Descriptor.EnumType.FindValueByNumber(rawValue);
- if (value == null)
+ if (!field.IsRepeated)
+ {
+ IMessageLite message = extensions[extension.Descriptor] as IMessageLite;
+ IBuilderLite subBuilder = (message ?? extension.MessageDefaultInstance).WeakToBuilder();
+
+ if (field.FieldType == FieldType.Group)
+ input.ReadGroup(field.FieldNumber, subBuilder, extensionRegistry);
+ else
+ input.ReadMessage(subBuilder, extensionRegistry);
+
+ extensions[field] = subBuilder.WeakBuild();
+ }
+ else
{
- // If the number isn't recognized as a valid value for this
- // enum, drop it (don't even add it to unknownFields).
+ List<IMessageLite> list = new List<IMessageLite>();
+ if (field.FieldType == FieldType.Group)
+ input.ReadGroupArray(tag, fieldName, list, extension.MessageDefaultInstance, extensionRegistry);
+ else
+ input.ReadMessageArray(tag, fieldName, list, extension.MessageDefaultInstance, extensionRegistry);
+
+ foreach (IMessageLite m in list)
+ extensions.AddRepeatedField(field, m);
return true;
}
- extensions.AddRepeatedField(extension.Descriptor, value);
+ break;
}
- }
- else
- {
- while (!input.ReachedLimit)
+ case FieldType.Enum:
{
- Object value = input.ReadPrimitiveField(extension.Descriptor.FieldType);
- extensions.AddRepeatedField(extension.Descriptor, value);
- }
- }
- input.PopLimit(limit);
- }
- else
- {
- Object value;
- switch (extension.Descriptor.MappedType)
- {
- case MappedType.Message:
+ if (!field.IsRepeated)
{
- IBuilderLite subBuilder = null;
- if (!extension.Descriptor.IsRepeated)
- {
- IMessageLite existingValue = extensions[extension.Descriptor] as IMessageLite;
- if (existingValue != null)
- {
- subBuilder = existingValue.WeakToBuilder();
- }
- }
- if (subBuilder == null)
- {
- subBuilder = extension.MessageDefaultInstance.WeakCreateBuilderForType();
- }
- if (extension.Descriptor.FieldType == FieldType.Group)
- {
- input.ReadGroup(extension.Number, subBuilder, extensionRegistry);
- }
- else
- {
- input.ReadMessage(subBuilder, extensionRegistry);
- }
- value = subBuilder.WeakBuild();
- break;
+ object unknown;
+ IEnumLite value = null;
+ if (input.ReadEnum(ref value, out unknown, field.EnumType))
+ extensions[field] = value;
}
- case MappedType.Enum:
- int rawValue = input.ReadEnum();
- value = extension.Descriptor.EnumType.FindValueByNumber(rawValue);
- // If the number isn't recognized as a valid value for this enum,
- // drop it.
- if (value == null)
+ else
{
- return true;
+ ICollection<object> unknown;
+ List<IEnumLite> list = new List<IEnumLite>();
+ input.ReadEnumArray(tag, fieldName, list, out unknown, field.EnumType);
+
+ foreach (IEnumLite en in list)
+ extensions.AddRepeatedField(field, en);
}
break;
- default:
- value = input.ReadPrimitiveField(extension.Descriptor.FieldType);
+ }
+ default:
+ {
+ if (!field.IsRepeated)
+ {
+ object value = null;
+ if (input.ReadPrimitiveField(field.FieldType, ref value))
+ extensions[field] = value;
+ }
+ else
+ {
+ List<object> list = new List<object>();
+ input.ReadPrimitiveArray(field.FieldType, tag, fieldName, list);
+ foreach (object oval in list)
+ extensions.AddRepeatedField(field, oval);
+ }
break;
- }
-
- if (extension.Descriptor.IsRepeated)
- {
- extensions.AddRepeatedField(extension.Descriptor, value);
- }
- else
- {
- extensions[extension.Descriptor] = value;
- }
+ }
}
return true;