From 6da3170a953b38d2e454a3035ebc24ed1cd4803a Mon Sep 17 00:00:00 2001 From: csharptest Date: Sat, 4 Jun 2011 12:52:57 -0500 Subject: Packed and Unpacked parsing allow for all repeated, per 2.3 --- src/ProtocolBuffers/ExtendableBuilderLite.cs | 25 +++++++++++++++++++++++++ src/ProtocolBuffers/UnknownFieldSet.cs | 17 ++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) (limited to 'src/ProtocolBuffers') diff --git a/src/ProtocolBuffers/ExtendableBuilderLite.cs b/src/ProtocolBuffers/ExtendableBuilderLite.cs index bac82bcb..27cd3e3b 100644 --- a/src/ProtocolBuffers/ExtendableBuilderLite.cs +++ b/src/ProtocolBuffers/ExtendableBuilderLite.cs @@ -146,6 +146,31 @@ namespace Google.ProtocolBuffers return input.SkipField(); IFieldDescriptorLite field = extension.Descriptor; + + + // Unknown field or wrong wire type. Skip. + if (field == null) + { + return input.SkipField(); + } + WireFormat.WireType expectedType = field.IsPacked + ? WireFormat.WireType.LengthDelimited + : WireFormat.GetWireType(field.FieldType); + if (wireType != expectedType) + { + expectedType = WireFormat.GetWireType(field.FieldType); + if (wireType == expectedType) + { + //Allowed as of 2.3, this is unpacked data for a packed array + } + else if (field.IsRepeated && wireType == WireFormat.WireType.LengthDelimited && + (expectedType == WireFormat.WireType.Varint || expectedType == WireFormat.WireType.Fixed32 || expectedType == WireFormat.WireType.Fixed64)) + { + //Allowed as of 2.3, this is packed data for an unpacked array + } + else + return input.SkipField(); + } if (!field.IsRepeated && wireType != WireFormat.GetWireType(field.FieldType)) //invalid wire type return input.SkipField(); diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs index 13a29581..70910cbf 100644 --- a/src/ProtocolBuffers/UnknownFieldSet.cs +++ b/src/ProtocolBuffers/UnknownFieldSet.cs @@ -666,10 +666,25 @@ namespace Google.ProtocolBuffers } // Unknown field or wrong wire type. Skip. - if (field == null || wireType != WireFormat.GetWireType(field)) + if (field == null) { return MergeFieldFrom(tag, input); } + if (wireType != WireFormat.GetWireType(field)) + { + WireFormat.WireType expectedType = WireFormat.GetWireType(field.FieldType); + if (wireType == expectedType) + { + //Allowed as of 2.3, this is unpacked data for a packed array + } + else if (field.IsRepeated && wireType == WireFormat.WireType.LengthDelimited && + (expectedType == WireFormat.WireType.Varint || expectedType == WireFormat.WireType.Fixed32 || expectedType == WireFormat.WireType.Fixed64)) + { + //Allowed as of 2.3, this is packed data for an unpacked array + } + else + return MergeFieldFrom(tag, input); + } switch (field.FieldType) { -- cgit v1.2.3