|
|
|
@ -16,6 +16,7 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.IO; |
|
|
|
|
using System.Text; |
|
|
|
|
using Google.ProtocolBuffers.Descriptors; |
|
|
|
|
|
|
|
|
|
namespace Google.ProtocolBuffers { |
|
|
|
|
|
|
|
|
@ -251,26 +252,26 @@ namespace Google.ProtocolBuffers { |
|
|
|
|
WriteTag(WireFormat.MessageSetField.Item, WireFormat.WireType.EndGroup); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void WriteField(Descriptors.FieldDescriptor.Type fieldType, int fieldNumber, object value) { |
|
|
|
|
public void WriteField(FieldType fieldType, int fieldNumber, object value) { |
|
|
|
|
switch (fieldType) { |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Double: WriteDouble(fieldNumber, (double)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Float: WriteFloat(fieldNumber, (float)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Int64: WriteInt64(fieldNumber, (long)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.UInt64: WriteUInt64(fieldNumber, (ulong)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Int32: WriteInt32(fieldNumber, (int)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Fixed64: WriteFixed64(fieldNumber, (long)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Fixed32: WriteFixed32(fieldNumber, (int)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Bool: WriteBool(fieldNumber, (bool)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.String: WriteString(fieldNumber, (string)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Group: WriteGroup(fieldNumber, (IMessage)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Message: WriteMessage(fieldNumber, (IMessage)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Bytes: WriteBytes(fieldNumber, (ByteString)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.UInt32: WriteUInt32(fieldNumber, (uint)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SFixed32: WriteSFixed32(fieldNumber, (int)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SFixed64: WriteSFixed64(fieldNumber, (long)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SInt32: WriteSInt32(fieldNumber, (int)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SInt64: WriteSInt64(fieldNumber, (long)value); break; |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Enum: WriteEnum(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number); |
|
|
|
|
case FieldType.Double: WriteDouble(fieldNumber, (double)value); break; |
|
|
|
|
case FieldType.Float: WriteFloat(fieldNumber, (float)value); break; |
|
|
|
|
case FieldType.Int64: WriteInt64(fieldNumber, (long)value); break; |
|
|
|
|
case FieldType.UInt64: WriteUInt64(fieldNumber, (ulong)value); break; |
|
|
|
|
case FieldType.Int32: WriteInt32(fieldNumber, (int)value); break; |
|
|
|
|
case FieldType.Fixed64: WriteFixed64(fieldNumber, (long)value); break; |
|
|
|
|
case FieldType.Fixed32: WriteFixed32(fieldNumber, (int)value); break; |
|
|
|
|
case FieldType.Bool: WriteBool(fieldNumber, (bool)value); break; |
|
|
|
|
case FieldType.String: WriteString(fieldNumber, (string)value); break; |
|
|
|
|
case FieldType.Group: WriteGroup(fieldNumber, (IMessage)value); break; |
|
|
|
|
case FieldType.Message: WriteMessage(fieldNumber, (IMessage)value); break; |
|
|
|
|
case FieldType.Bytes: WriteBytes(fieldNumber, (ByteString)value); break; |
|
|
|
|
case FieldType.UInt32: WriteUInt32(fieldNumber, (uint)value); break; |
|
|
|
|
case FieldType.SFixed32: WriteSFixed32(fieldNumber, (int)value); break; |
|
|
|
|
case FieldType.SFixed64: WriteSFixed64(fieldNumber, (long)value); break; |
|
|
|
|
case FieldType.SInt32: WriteSInt32(fieldNumber, (int)value); break; |
|
|
|
|
case FieldType.SInt64: WriteSInt64(fieldNumber, (long)value); break; |
|
|
|
|
case FieldType.Enum: WriteEnum(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -617,26 +618,26 @@ namespace Google.ProtocolBuffers { |
|
|
|
|
* {@link Message#getField(Descriptors.FieldDescriptor)} for |
|
|
|
|
* this field. |
|
|
|
|
*/ |
|
|
|
|
public static int ComputeFieldSize(Descriptors.FieldDescriptor.Type fieldType, int fieldNumber, Object value) { |
|
|
|
|
public static int ComputeFieldSize(FieldType fieldType, int fieldNumber, Object value) { |
|
|
|
|
switch (fieldType) { |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Double: return ComputeDoubleSize(fieldNumber, (double)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Float: return ComputeFloatSize(fieldNumber, (float)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Int64: return ComputeInt64Size(fieldNumber, (long)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Int32: return ComputeInt32Size(fieldNumber, (int)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Bool: return ComputeBoolSize(fieldNumber, (bool)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.String: return ComputeStringSize(fieldNumber, (string)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Group: return ComputeGroupSize(fieldNumber, (IMessage)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Message: return ComputeMessageSize(fieldNumber, (IMessage)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Bytes: return ComputeBytesSize(fieldNumber, (ByteString)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.UInt32: return ComputeUInt32Size(fieldNumber, (uint)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SFixed32: return ComputeSFixed32Size(fieldNumber, (int)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SFixed64: return ComputeSFixed64Size(fieldNumber, (long)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SInt32: return ComputeSInt32Size(fieldNumber, (int)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.SInt64: return ComputeSInt64Size(fieldNumber, (long)value); |
|
|
|
|
case Descriptors.FieldDescriptor.Type.Enum: return ComputeEnumSize(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number); |
|
|
|
|
case FieldType.Double: return ComputeDoubleSize(fieldNumber, (double)value); |
|
|
|
|
case FieldType.Float: return ComputeFloatSize(fieldNumber, (float)value); |
|
|
|
|
case FieldType.Int64: return ComputeInt64Size(fieldNumber, (long)value); |
|
|
|
|
case FieldType.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value); |
|
|
|
|
case FieldType.Int32: return ComputeInt32Size(fieldNumber, (int)value); |
|
|
|
|
case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value); |
|
|
|
|
case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value); |
|
|
|
|
case FieldType.Bool: return ComputeBoolSize(fieldNumber, (bool)value); |
|
|
|
|
case FieldType.String: return ComputeStringSize(fieldNumber, (string)value); |
|
|
|
|
case FieldType.Group: return ComputeGroupSize(fieldNumber, (IMessage)value); |
|
|
|
|
case FieldType.Message: return ComputeMessageSize(fieldNumber, (IMessage)value); |
|
|
|
|
case FieldType.Bytes: return ComputeBytesSize(fieldNumber, (ByteString)value); |
|
|
|
|
case FieldType.UInt32: return ComputeUInt32Size(fieldNumber, (uint)value); |
|
|
|
|
case FieldType.SFixed32: return ComputeSFixed32Size(fieldNumber, (int)value); |
|
|
|
|
case FieldType.SFixed64: return ComputeSFixed64Size(fieldNumber, (long)value); |
|
|
|
|
case FieldType.SInt32: return ComputeSInt32Size(fieldNumber, (int)value); |
|
|
|
|
case FieldType.SInt64: return ComputeSInt64Size(fieldNumber, (long)value); |
|
|
|
|
case FieldType.Enum: return ComputeEnumSize(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number); |
|
|
|
|
default: |
|
|
|
|
throw new ArgumentOutOfRangeException("Invalid field type " + fieldType); |
|
|
|
|
} |
|
|
|
@ -704,5 +705,33 @@ namespace Google.ProtocolBuffers { |
|
|
|
|
RefreshBuffer(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Verifies that SpaceLeft returns zero. It's common to create a byte array |
|
|
|
|
/// that is exactly big enough to hold a message, then write to it with |
|
|
|
|
/// a CodedOutputStream. Calling CheckNoSpaceLeft after writing verifies that |
|
|
|
|
/// the message was actually as big as expected, which can help bugs. |
|
|
|
|
/// </summary> |
|
|
|
|
public void CheckNoSpaceLeft() { |
|
|
|
|
if (SpaceLeft != 0) { |
|
|
|
|
throw new InvalidOperationException("Did not write as much data as expected."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// If writing to a flat array, returns the space left in the array. Otherwise, |
|
|
|
|
/// throws an InvalidOperationException. |
|
|
|
|
/// </summary> |
|
|
|
|
public int SpaceLeft { |
|
|
|
|
get { |
|
|
|
|
if (output == null) { |
|
|
|
|
return limit - position; |
|
|
|
|
} else { |
|
|
|
|
throw new InvalidOperationException( |
|
|
|
|
"SpaceLeft can only be called on CodedOutputStreams that are " + |
|
|
|
|
"writing to a flat array."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |