public static EndSubItem ( ProtoBuf.SubItemToken token, |
||
token | ProtoBuf.SubItemToken | The token obtained from StartubItem. |
writer | The destination. | |
Résultat | void |
/// <summary> /// Writes an *implementation specific* bundled .NET object, including (as options) type-metadata, identity/re-use, etc. /// </summary> public static void WriteNetObject(object value, ProtoWriter dest, int key, NetObjectOptions options) { #if FEAT_IKVM throw new NotSupportedException(); #else Helpers.DebugAssert(value != null); bool dynamicType = (options & NetObjectOptions.DynamicType) != 0, asReference = (options & NetObjectOptions.AsReference) != 0; WireType wireType = dest.WireType; SubItemToken token = ProtoWriter.StartSubItem(null, dest); bool writeObject = true; if (asReference) { bool existing; int objectKey = dest.NetCache.AddObjectKey(value, out existing); ProtoWriter.WriteFieldHeader(existing ? FieldExistingObjectKey : FieldNewObjectKey, WireType.Variant, dest); ProtoWriter.WriteInt32(objectKey, dest); if (existing) { writeObject = false; } } if (writeObject) { if (dynamicType) { bool existing; Type type = value.GetType(); if (!(value is string)) { key = dest.GetTypeKey(ref type); if (key < 0) { throw new InvalidOperationException("Dynamic type is not a contract-type: " + type.Name); } } int typeKey = dest.NetCache.AddObjectKey(type, out existing); ProtoWriter.WriteFieldHeader(existing ? FieldExistingTypeKey : FieldNewTypeKey, WireType.Variant, dest); ProtoWriter.WriteInt32(typeKey, dest); if (!existing) { ProtoWriter.WriteFieldHeader(FieldTypeName, WireType.String, dest); ProtoWriter.WriteString(dest.SerializeType(type), dest); } } ProtoWriter.WriteFieldHeader(FieldObject, wireType, dest); if (value is string) { ProtoWriter.WriteString((string)value, dest); } else { ProtoWriter.WriteObject(value, key, dest); } } ProtoWriter.EndSubItem(token, dest); #endif }
public static void WriteDecimal(decimal value, ProtoWriter writer) { int[] bits = decimal.GetBits(value); ulong num = (ulong)((ulong)((long)bits[1]) << 32); ulong num2 = (ulong)((long)bits[0] & (long)((ulong)-1)); ulong num3 = num | num2; uint num4 = (uint)bits[2]; uint num5 = (uint)((bits[3] >> 15 & 510) | (bits[3] >> 31 & 1)); SubItemToken token = ProtoWriter.StartSubItem(null, writer); if (num3 != 0uL) { ProtoWriter.WriteFieldHeader(1, WireType.Variant, writer); ProtoWriter.WriteUInt64(num3, writer); } if (num4 != 0u) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer); ProtoWriter.WriteUInt32(num4, writer); } if (num5 != 0u) { ProtoWriter.WriteFieldHeader(3, WireType.Variant, writer); ProtoWriter.WriteUInt32(num5, writer); } ProtoWriter.EndSubItem(token, writer); }
public static void WriteDecimal(decimal value, ProtoWriter writer) { int[] bits = decimal.GetBits(value); ulong num = (ulong)((long)bits[1] << 32); ulong num1 = (long)bits[0] & (ulong)-1; ulong num2 = num | num1; uint num3 = (uint)bits[2]; uint num4 = (uint)(bits[3] >> 15 & 510 | bits[3] >> 31 & 1); SubItemToken subItemToken = ProtoWriter.StartSubItem(null, writer); if (num2 != (long)0) { ProtoWriter.WriteFieldHeader(1, WireType.Variant, writer); ProtoWriter.WriteUInt64(num2, writer); } if (num3 != 0) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer); ProtoWriter.WriteUInt32(num3, writer); } if (num4 != 0) { ProtoWriter.WriteFieldHeader(3, WireType.Variant, writer); ProtoWriter.WriteUInt32(num4, writer); } ProtoWriter.EndSubItem(subItemToken, writer); }
/// <summary> /// Writes a decimal to a protobuf stream /// </summary> public static void WriteDecimal(decimal value, ProtoWriter writer) { int[] bits = decimal.GetBits(value); ulong a = ((ulong)bits[1]) << 32, b = ((ulong)bits[0]) & 0xFFFFFFFFL; ulong low = a | b; uint high = (uint)bits[2]; uint signScale = (uint)(((bits[3] >> 15) & 0x01FE) | ((bits[3] >> 31) & 0x0001)); SubItemToken token = ProtoWriter.StartSubItem(null, writer); if (low != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalLow, WireType.Variant, writer); ProtoWriter.WriteUInt64(low, writer); } if (high != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalHigh, WireType.Variant, writer); ProtoWriter.WriteUInt32(high, writer); } if (signScale != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalSignScale, WireType.Variant, writer); ProtoWriter.WriteUInt32(signScale, writer); } ProtoWriter.EndSubItem(token, writer); }
public static void WriteDecimal(decimal value, ProtoWriter writer) { int[] bits = decimal.GetBits(value); long num = (long)bits[1] << 32; ulong num2 = (ulong)(bits[0] & uint.MaxValue); ulong num3 = (ulong)(num | (long)num2); uint num4 = (uint)bits[2]; uint num5 = (uint)(((bits[3] >> 15) & 0x1FE) | ((bits[3] >> 31) & 1)); SubItemToken token = ProtoWriter.StartSubItem(null, writer); if (num3 != 0L) { ProtoWriter.WriteFieldHeader(1, WireType.Variant, writer); ProtoWriter.WriteUInt64(num3, writer); } if (num4 != 0) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer); ProtoWriter.WriteUInt32(num4, writer); } if (num5 != 0) { ProtoWriter.WriteFieldHeader(3, WireType.Variant, writer); ProtoWriter.WriteUInt32(num5, writer); } ProtoWriter.EndSubItem(token, writer); }
/// <summary> /// Writes a decimal to a protobuf stream /// </summary> public static void WriteDecimal(decimal value, ProtoWriter writer) { var dec = new DecimalAccessor(value); ulong a = ((ulong)dec.Mid) << 32, b = ((ulong)dec.Lo) & 0xFFFFFFFFL; ulong low = a | b; uint high = (uint)dec.Hi; uint signScale = (uint)(((dec.Flags >> 15) & 0x01FE) | ((dec.Flags >> 31) & 0x0001)); SubItemToken token = ProtoWriter.StartSubItem(null, writer); if (low != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalLow, WireType.Variant, writer); ProtoWriter.WriteUInt64(low, writer); } if (high != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalHigh, WireType.Variant, writer); ProtoWriter.WriteUInt32(high, writer); } if (signScale != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalSignScale, WireType.Variant, writer); ProtoWriter.WriteUInt32(signScale, writer); } ProtoWriter.EndSubItem(token, writer); }
public static void WriteNetObject(object value, ProtoWriter dest, int key, BclHelpers.NetObjectOptions options) { bool flag; bool flag1; if (dest == null) { throw new ArgumentNullException("dest"); } bool flag2 = (byte)(options & BclHelpers.NetObjectOptions.DynamicType) != 0; bool flag3 = (byte)(options & BclHelpers.NetObjectOptions.AsReference) != 0; WireType wireType = dest.WireType; SubItemToken subItemToken = ProtoWriter.StartSubItem(null, dest); bool flag4 = true; if (flag3) { int num = dest.NetCache.AddObjectKey(value, out flag); ProtoWriter.WriteFieldHeader((flag ? 1 : 2), WireType.Variant, dest); ProtoWriter.WriteInt32(num, dest); if (flag) { flag4 = false; } } if (flag4) { if (flag2) { Type type = value.GetType(); if (!(value is string)) { key = dest.GetTypeKey(ref type); if (key < 0) { throw new InvalidOperationException(string.Concat("Dynamic type is not a contract-type: ", type.Name)); } } int num1 = dest.NetCache.AddObjectKey(type, out flag1); ProtoWriter.WriteFieldHeader((flag1 ? 3 : 4), WireType.Variant, dest); ProtoWriter.WriteInt32(num1, dest); if (!flag1) { ProtoWriter.WriteFieldHeader(8, WireType.String, dest); ProtoWriter.WriteString(dest.SerializeType(type), dest); } } ProtoWriter.WriteFieldHeader(10, wireType, dest); if (!(value is string)) { ProtoWriter.WriteObject(value, key, dest); } else { ProtoWriter.WriteString((string)value, dest); } } ProtoWriter.EndSubItem(subItemToken, dest); }
/// <summary> /// Writes a TimeSpan to a protobuf stream /// </summary> public static void WriteTimeSpan(TimeSpan timeSpan, ProtoWriter dest) { TimeSpanScale scale; long value = timeSpan.Ticks; if (timeSpan == TimeSpan.MaxValue) { value = 1; scale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { value = -1; scale = TimeSpanScale.MinMax; } else if (value % TimeSpan.TicksPerDay == 0) { scale = TimeSpanScale.Days; value /= TimeSpan.TicksPerDay; } else if (value % TimeSpan.TicksPerHour == 0) { scale = TimeSpanScale.Hours; value /= TimeSpan.TicksPerHour; } else if (value % TimeSpan.TicksPerMinute == 0) { scale = TimeSpanScale.Minutes; value /= TimeSpan.TicksPerMinute; } else if (value % TimeSpan.TicksPerSecond == 0) { scale = TimeSpanScale.Seconds; value /= TimeSpan.TicksPerSecond; } else if (value % TimeSpan.TicksPerMillisecond == 0) { scale = TimeSpanScale.Milliseconds; value /= TimeSpan.TicksPerMillisecond; } else { scale = TimeSpanScale.Ticks; } SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (value != 0) { ProtoWriter.WriteFieldHeader(FieldTimeSpanValue, WireType.SignedVariant, dest); ProtoWriter.WriteInt64(value, dest); } if (scale != TimeSpanScale.Days) { ProtoWriter.WriteFieldHeader(FieldTimeSpanScale, WireType.Variant, dest); ProtoWriter.WriteInt32((int)scale, dest); } ProtoWriter.EndSubItem(token, dest); }
public static void WriteNetObject(object value, ProtoWriter dest, int key, NetObjectOptions options) { if (dest == null) { throw new ArgumentNullException("dest"); } bool flag = (options & NetObjectOptions.DynamicType) != 0; bool num = (options & NetObjectOptions.AsReference) != 0; WireType wireType = dest.WireType; SubItemToken token = ProtoWriter.StartSubItem(null, dest); bool flag2 = true; if (num) { bool existing; int value2 = dest.NetCache.AddObjectKey(value, out existing); ProtoWriter.WriteFieldHeader(existing ? 1 : 2, WireType.Variant, dest); ProtoWriter.WriteInt32(value2, dest); if (existing) { flag2 = false; } } if (flag2) { if (flag) { Type type = value.GetType(); if (!(value is string)) { key = dest.GetTypeKey(ref type); if (key < 0) { throw new InvalidOperationException("Dynamic type is not a contract-type: " + type.Name); } } bool existing2; int value3 = dest.NetCache.AddObjectKey(type, out existing2); ProtoWriter.WriteFieldHeader(existing2 ? 3 : 4, WireType.Variant, dest); ProtoWriter.WriteInt32(value3, dest); if (!existing2) { ProtoWriter.WriteFieldHeader(8, WireType.String, dest); ProtoWriter.WriteString(dest.SerializeType(type), dest); } } ProtoWriter.WriteFieldHeader(10, wireType, dest); if (value is string) { ProtoWriter.WriteString((string)value, dest); } else { ProtoWriter.WriteObject(value, key, dest); } } ProtoWriter.EndSubItem(token, dest); }
public static void WriteNetObject(object value, ProtoWriter dest, int key, BclHelpers.NetObjectOptions options) { if (dest == null) { throw new ArgumentNullException("dest"); } bool flag = (byte)(options & BclHelpers.NetObjectOptions.DynamicType) != 0; bool flag2 = (byte)(options & BclHelpers.NetObjectOptions.AsReference) != 0; WireType wireType = dest.WireType; SubItemToken token = ProtoWriter.StartSubItem(null, dest); bool flag3 = true; if (flag2) { bool flag4; int value2 = dest.NetCache.AddObjectKey(value, out flag4); ProtoWriter.WriteFieldHeader((!flag4) ? 2 : 1, WireType.Variant, dest); ProtoWriter.WriteInt32(value2, dest); if (flag4) { flag3 = false; } } if (flag3) { if (flag) { Type type = value.GetType(); if (!(value is string)) { key = dest.GetTypeKey(ref type); if (key < 0) { throw new InvalidOperationException("Dynamic type is not a contract-type: " + type.get_Name()); } } bool flag5; int value3 = dest.NetCache.AddObjectKey(type, out flag5); ProtoWriter.WriteFieldHeader((!flag5) ? 4 : 3, WireType.Variant, dest); ProtoWriter.WriteInt32(value3, dest); if (!flag5) { ProtoWriter.WriteFieldHeader(8, WireType.String, dest); ProtoWriter.WriteString(dest.SerializeType(type), dest); } } ProtoWriter.WriteFieldHeader(10, wireType, dest); if (value is string) { ProtoWriter.WriteString((string)value, dest); } else { ProtoWriter.WriteObject(value, key, dest); } } ProtoWriter.EndSubItem(token, dest); }
public static void WriteGuid(Guid value, ProtoWriter dest) { byte[] data = value.ToByteArray(); SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (value != Guid.Empty) { ProtoWriter.WriteFieldHeader(1, WireType.Fixed64, dest); ProtoWriter.WriteBytes(data, 0, 8, dest); ProtoWriter.WriteFieldHeader(2, WireType.Fixed64, dest); ProtoWriter.WriteBytes(data, 8, 8, dest); } ProtoWriter.EndSubItem(token, dest); }
internal static void WriteObject(object value, int key, ProtoWriter writer, PrefixStyle style, int fieldNumber) { if (writer.model == null) { throw new InvalidOperationException("Cannot serialize sub-objects unless a model is provided"); } if (writer.wireType != ProtoBuf.WireType.None) { throw ProtoWriter.CreateException(writer); } switch (style) { case PrefixStyle.Base128: { writer.wireType = ProtoBuf.WireType.String; writer.fieldNumber = fieldNumber; if (fieldNumber <= 0) { break; } ProtoWriter.WriteHeaderCore(fieldNumber, ProtoBuf.WireType.String, writer); break; } case PrefixStyle.Fixed32: case PrefixStyle.Fixed32BigEndian: { writer.fieldNumber = 0; writer.wireType = ProtoBuf.WireType.Fixed32; break; } default: { throw new ArgumentOutOfRangeException("style"); } } SubItemToken subItemToken = ProtoWriter.StartSubItem(value, writer, true); if (key >= 0) { writer.model.Serialize(key, value, writer); } else if (!writer.model.TrySerializeAuxiliaryType(writer, value.GetType(), DataFormat.Default, 1, value, false)) { TypeModel.ThrowUnexpectedType(value.GetType()); } ProtoWriter.EndSubItem(subItemToken, writer, style); }
/// <summary> /// Writes a CombGuid to a protobuf stream /// </summary> public static void WriteCombGuid(CuteAnt.CombGuid value, ProtoWriter dest) { byte[] blob = value.GetByteArray(); SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (!value.IsNullOrEmpty) { ProtoWriter.WriteFieldHeader(FieldGuidLow, WireType.Fixed64, dest); ProtoWriter.WriteBytes(blob, 0, 8, dest); ProtoWriter.WriteFieldHeader(FieldGuidHigh, WireType.Fixed64, dest); ProtoWriter.WriteBytes(blob, 8, 8, dest); } ProtoWriter.EndSubItem(token, dest); }
public static void WriteRecursionSafeObject(object value, int key, ProtoWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.model == null) { throw new InvalidOperationException("Cannot serialize sub-objects unless a model is provided"); } SubItemToken subItemToken = ProtoWriter.StartSubItem(null, writer); writer.model.Serialize(key, value, writer); ProtoWriter.EndSubItem(subItemToken, writer); }
private static void WriteSecondsNanos(long seconds, int nanos, ProtoWriter dest, ref ProtoWriter.State state) { SubItemToken token = ProtoWriter.StartSubItem(null, dest, ref state); if (seconds != 0) { ProtoWriter.WriteFieldHeader(1, WireType.Variant, dest, ref state); ProtoWriter.WriteInt64(seconds, dest, ref state); } if (nanos != 0) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, dest, ref state); ProtoWriter.WriteInt32(nanos, dest, ref state); } ProtoWriter.EndSubItem(token, dest, ref state); }
/// <summary> /// Writes an *implementation specific* bundled .NET object, including (as options) type-metadata, identity/re-use, etc. /// </summary> public static void WriteNetObject(object value, ProtoWriter dest, int key, bool dynamicType, bool asReference) { Helpers.DebugAssert(value != null); WireType wireType = dest.WireType; SubItemToken token = ProtoWriter.StartSubItem(null, dest); bool writeObject = true; if (asReference) { bool existing; int objectKey = dest.NetCache.AddObjectKey(value, out existing); ProtoWriter.WriteFieldHeader(existing ? FieldExistingObjectKey : FieldNewObjectKey, WireType.Variant, dest); ProtoWriter.WriteInt32(objectKey, dest); if (existing) { writeObject = false; } } if (writeObject) { if (dynamicType) { bool existing; Type type = value.GetType(); key = dest.GetTypeKey(ref type); int typeKey = dest.NetCache.AddObjectKey(type, out existing); ProtoWriter.WriteFieldHeader(existing ? FieldExistingTypeKey : FieldNewTypeKey, WireType.Variant, dest); ProtoWriter.WriteInt32(typeKey, dest); if (!existing) { ProtoWriter.WriteFieldHeader(FieldTypeName, WireType.String, dest); ProtoWriter.WriteString(dest.SerializeType(type), dest); } } ProtoWriter.WriteFieldHeader(FieldObject, wireType, dest); if (value is string) { ProtoWriter.WriteString((string)value, dest); } else { ProtoWriter.WriteObject(value, key, dest); } } ProtoWriter.EndSubItem(token, dest); }
internal static void WriteObject(ProtoWriter writer, ref State state, object value, int key, PrefixStyle style, int fieldNumber) { if (writer.model == null) { throw new InvalidOperationException("Cannot serialize sub-objects unless a model is provided"); } if (writer.WireType != WireType.None) { throw ProtoWriter.CreateException(writer); } switch (style) { case PrefixStyle.Base128: writer.WireType = WireType.String; writer.fieldNumber = fieldNumber; if (fieldNumber > 0) { WriteHeaderCore(fieldNumber, WireType.String, writer, ref state); } break; case PrefixStyle.Fixed32: case PrefixStyle.Fixed32BigEndian: writer.fieldNumber = 0; writer.WireType = WireType.Fixed32; break; default: throw new ArgumentOutOfRangeException(nameof(style)); } SubItemToken token = writer.StartSubItem(ref state, value, style); if (key < 0) { if (!writer.model.TrySerializeAuxiliaryType(writer, ref state, value.GetType(), DataFormat.Default, TypeModel.ListItemTag, value, false, null)) { TypeModel.ThrowUnexpectedType(value.GetType()); } } else { writer.model.Serialize(writer, ref state, key, value); } writer.EndSubItem(ref state, token, style); }
public static void WriteObject(object value, int key, ProtoWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.model == null) { throw new InvalidOperationException("Cannot serialize sub-objects unless a model is provided"); } SubItemToken subItemToken = ProtoWriter.StartSubItem(value, writer); if (key >= 0) { writer.model.Serialize(key, value, writer); } else if (writer.model == null || !writer.model.TrySerializeAuxiliaryType(writer, value.GetType(), DataFormat.Default, 1, value, false)) { TypeModel.ThrowUnexpectedType(value.GetType()); } ProtoWriter.EndSubItem(subItemToken, writer); }
private void AppendExtensionField(ProtoWriter writer) { //TODO: replace this with stream-based, buffered raw copying ProtoWriter.WriteFieldHeader(fieldNumber, wireType, writer); switch (wireType) { case WireType.Fixed32: ProtoWriter.WriteInt32(ReadInt32(), writer); return; case WireType.Variant: case WireType.SignedVariant: case WireType.Fixed64: ProtoWriter.WriteInt64(ReadInt64(), writer); return; case WireType.String: ProtoWriter.WriteBytes(AppendBytes(null, this), writer); return; case WireType.StartGroup: SubItemToken readerToken = StartSubItem(this), writerToken = ProtoWriter.StartSubItem(null, writer); while (ReadFieldHeader() > 0) { AppendExtensionField(writer); } EndSubItem(readerToken, this); ProtoWriter.EndSubItem(writerToken, writer); return; case WireType.None: // treat as explicit errorr case WireType.EndGroup: // treat as explicit error default: // treat as implicit error throw CreateException(); } }
private void AppendExtensionField(ProtoWriter writer) { ProtoWriter.WriteFieldHeader(fieldNumber, wireType, writer); switch (wireType) { case WireType.Fixed32: ProtoWriter.WriteInt32(ReadInt32(), writer); break; case WireType.Variant: case WireType.Fixed64: case WireType.SignedVariant: ProtoWriter.WriteInt64(ReadInt64(), writer); break; case WireType.String: ProtoWriter.WriteBytes(AppendBytes(null, this), writer); break; case WireType.StartGroup: { SubItemToken token = StartSubItem(this); SubItemToken token2 = ProtoWriter.StartSubItem(null, writer); while (ReadFieldHeader() > 0) { AppendExtensionField(writer); } EndSubItem(token, this); ProtoWriter.EndSubItem(token2, writer); break; } default: throw CreateWireTypeException(); } }
private void AppendExtensionField(ProtoWriter writer) { ProtoWriter.WriteFieldHeader(this.fieldNumber, this.wireType, writer); WireType wireType = this.wireType; switch (wireType + 1) { case WireType.Fixed64: case WireType.String: case (WireType)9: ProtoWriter.WriteInt64(this.ReadInt64(), writer); return; case WireType.StartGroup: ProtoWriter.WriteBytes(ProtoReader.AppendBytes(null, this), writer); return; case WireType.EndGroup: { SubItemToken token = ProtoReader.StartSubItem(this); SubItemToken token2 = ProtoWriter.StartSubItem(null, writer); while (this.ReadFieldHeader() > 0) { this.AppendExtensionField(writer); } ProtoReader.EndSubItem(token, this); ProtoWriter.EndSubItem(token2, writer); return; } case (WireType)6: ProtoWriter.WriteInt32(this.ReadInt32(), writer); return; } throw this.CreateWireTypeException(); }
/// <summary> /// Indicates the end of a nested record. /// </summary> /// <param name="token">The token obtained from StartubItem.</param> /// <param name="writer">The destination.</param> /// <param name="state">Writer state</param> public static void EndSubItem(SubItemToken token, ProtoWriter writer, ref State state) => writer.EndSubItem(ref state, token, PrefixStyle.Base128);
public static void EndSubItem(SubItemToken token, ProtoWriter writer) { State state = writer.DefaultState(); writer.EndSubItem(ref state, token, PrefixStyle.Base128); }
private static void WriteTimeSpanImpl(TimeSpan timeSpan, ProtoWriter dest, DateTimeKind kind) { if (dest == null) { throw new ArgumentNullException("dest"); } long value; switch (dest.WireType) { case WireType.String: case WireType.StartGroup: TimeSpanScale scale; value = timeSpan.Ticks; if (timeSpan == TimeSpan.MaxValue) { value = 1; scale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { value = -1; scale = TimeSpanScale.MinMax; } else if (value % TimeSpan.TicksPerDay == 0) { scale = TimeSpanScale.Days; value /= TimeSpan.TicksPerDay; } else if (value % TimeSpan.TicksPerHour == 0) { scale = TimeSpanScale.Hours; value /= TimeSpan.TicksPerHour; } else if (value % TimeSpan.TicksPerMinute == 0) { scale = TimeSpanScale.Minutes; value /= TimeSpan.TicksPerMinute; } else if (value % TimeSpan.TicksPerSecond == 0) { scale = TimeSpanScale.Seconds; value /= TimeSpan.TicksPerSecond; } else if (value % TimeSpan.TicksPerMillisecond == 0) { scale = TimeSpanScale.Milliseconds; value /= TimeSpan.TicksPerMillisecond; } else { scale = TimeSpanScale.Ticks; } SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (value != 0) { ProtoWriter.WriteFieldHeader(FieldTimeSpanValue, WireType.SignedVariant, dest); ProtoWriter.WriteInt64(value, dest); } if (scale != TimeSpanScale.Days) { ProtoWriter.WriteFieldHeader(FieldTimeSpanScale, WireType.Variant, dest); ProtoWriter.WriteInt32((int)scale, dest); } if (kind != DateTimeKind.Unspecified) { ProtoWriter.WriteFieldHeader(FieldTimeSpanKind, WireType.Variant, dest); ProtoWriter.WriteInt32((int)kind, dest); } ProtoWriter.EndSubItem(token, dest); break; case WireType.Fixed64: ProtoWriter.WriteInt64(timeSpan.Ticks, dest); break; default: throw new ProtoException("Unexpected wire-type: " + dest.WireType.ToString()); } }
public static void WriteTimeSpan(TimeSpan timeSpan, ProtoWriter dest) { TimeSpanScale timeSpanScale; if (dest == null) { throw new ArgumentNullException("dest"); } switch (dest.WireType) { case WireType.Fixed64: { ProtoWriter.WriteInt64(timeSpan.Ticks, dest); return; } case WireType.String: case WireType.StartGroup: { long ticks = timeSpan.Ticks; if (timeSpan == TimeSpan.MaxValue) { ticks = (long)1; timeSpanScale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { ticks = (long)-1; timeSpanScale = TimeSpanScale.MinMax; } else if (ticks % 864000000000L == (long)0) { timeSpanScale = TimeSpanScale.Days; ticks /= 864000000000L; } else if (ticks % 36000000000L == (long)0) { timeSpanScale = TimeSpanScale.Hours; ticks /= 36000000000L; } else if (ticks % (long)600000000 == (long)0) { timeSpanScale = TimeSpanScale.Minutes; ticks /= (long)600000000; } else if (ticks % (long)10000000 == (long)0) { timeSpanScale = TimeSpanScale.Seconds; ticks /= (long)10000000; } else if (ticks % (long)10000 != (long)0) { timeSpanScale = TimeSpanScale.Ticks; } else { timeSpanScale = TimeSpanScale.Milliseconds; ticks /= (long)10000; } SubItemToken subItemToken = ProtoWriter.StartSubItem(null, dest); if (ticks != (long)0) { ProtoWriter.WriteFieldHeader(1, WireType.SignedVariant, dest); ProtoWriter.WriteInt64(ticks, dest); } if (timeSpanScale != TimeSpanScale.Days) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, dest); ProtoWriter.WriteInt32((int)timeSpanScale, dest); } ProtoWriter.EndSubItem(subItemToken, dest); return; } } throw new ProtoException(string.Concat("Unexpected wire-type: ", dest.WireType.ToString())); }
public static void EndSubItem(SubItemToken token, ProtoWriter writer) { ProtoWriter.EndSubItem(token, writer, PrefixStyle.Base128); }
public static void WriteTimeSpan(TimeSpan timeSpan, ProtoWriter dest) { if (dest == null) { throw new ArgumentNullException("dest"); } switch (dest.WireType) { case WireType.String: case WireType.StartGroup: { long num = timeSpan.Ticks; TimeSpanScale timeSpanScale; if (timeSpan == TimeSpan.MaxValue) { num = 1L; timeSpanScale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { num = -1L; timeSpanScale = TimeSpanScale.MinMax; } else if (num % 864000000000L == 0L) { timeSpanScale = TimeSpanScale.Days; num /= 864000000000L; } else if (num % 36000000000L == 0L) { timeSpanScale = TimeSpanScale.Hours; num /= 36000000000L; } else if (num % 600000000 == 0L) { timeSpanScale = TimeSpanScale.Minutes; num /= 600000000; } else if (num % 10000000 == 0L) { timeSpanScale = TimeSpanScale.Seconds; num /= 10000000; } else if (num % 10000 == 0L) { timeSpanScale = TimeSpanScale.Milliseconds; num /= 10000; } else { timeSpanScale = TimeSpanScale.Ticks; } SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (num != 0L) { ProtoWriter.WriteFieldHeader(1, WireType.SignedVariant, dest); ProtoWriter.WriteInt64(num, dest); } if (timeSpanScale != 0) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, dest); ProtoWriter.WriteInt32((int)timeSpanScale, dest); } ProtoWriter.EndSubItem(token, dest); break; } case WireType.Fixed64: ProtoWriter.WriteInt64(timeSpan.Ticks, dest); break; default: throw new ProtoException("Unexpected wire-type: " + dest.WireType); } }
public static void WriteTimeSpan(TimeSpan timeSpan, ProtoWriter dest) { if (dest == null) { throw new ArgumentNullException("dest"); } WireType wireType = dest.WireType; if (wireType != WireType.Fixed64) { if ((uint)(wireType - 2) <= 1u) { long num = timeSpan.Ticks; TimeSpanScale timeSpanScale; if (timeSpan == TimeSpan.MaxValue) { num = 1L; timeSpanScale = TimeSpanScale.MinMax; } else if (timeSpan == TimeSpan.MinValue) { num = -1L; timeSpanScale = TimeSpanScale.MinMax; } else if (num % 864000000000L == 0L) { timeSpanScale = TimeSpanScale.Days; num /= 864000000000L; } else if (num % 36000000000L == 0L) { timeSpanScale = TimeSpanScale.Hours; num /= 36000000000L; } else if (num % 600000000 == 0L) { timeSpanScale = TimeSpanScale.Minutes; num /= 600000000; } else if (num % 10000000 == 0L) { timeSpanScale = TimeSpanScale.Seconds; num /= 10000000; } else if (num % 10000 == 0L) { timeSpanScale = TimeSpanScale.Milliseconds; num /= 10000; } else { timeSpanScale = TimeSpanScale.Ticks; } SubItemToken token = ProtoWriter.StartSubItem(null, dest); if (num != 0L) { ProtoWriter.WriteFieldHeader(1, WireType.SignedVariant, dest); ProtoWriter.WriteInt64(num, dest); } if (timeSpanScale != 0) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, dest); ProtoWriter.WriteInt32((int)timeSpanScale, dest); } ProtoWriter.EndSubItem(token, dest); return; } wireType = dest.WireType; throw new ProtoException("Unexpected wire-type: " + wireType.ToString()); } ProtoWriter.WriteInt64(timeSpan.Ticks, dest); }