EndSubItem() public static method

Indicates the end of a nested record.
public static EndSubItem ( ProtoBuf.SubItemToken token, ProtoWriter writer ) : void
token ProtoBuf.SubItemToken The token obtained from StartubItem.
writer ProtoWriter The destination.
return void
コード例 #1
0
        /// <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
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
ファイル: BclHelpers.cs プロジェクト: x1234xx/Mystery_Stealer
        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);
        }
コード例 #6
0
ファイル: BclHelpers.cs プロジェクト: szehetner/protobuf-net
        /// <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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
ファイル: BclHelpers.cs プロジェクト: x1234xx/Mystery_Stealer
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
ファイル: BclHelpers.cs プロジェクト: x1234xx/Mystery_Stealer
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
        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);
        }
コード例 #15
0
ファイル: BclHelpers.cs プロジェクト: zhangbo27/SimpleBinary
        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);
        }
コード例 #16
0
        /// <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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
ファイル: ProtoReader.cs プロジェクト: yonglehou/Symbiote
        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();
            }
        }
コード例 #20
0
        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();
            }
        }
コード例 #21
0
ファイル: ProtoReader.cs プロジェクト: unseen-code/tianqi_src
        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();
        }
コード例 #22
0
 /// <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);
コード例 #23
0
        public static void EndSubItem(SubItemToken token, ProtoWriter writer)
        {
            State state = writer.DefaultState();

            writer.EndSubItem(ref state, token, PrefixStyle.Base128);
        }
コード例 #24
0
        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());
            }
        }
コード例 #25
0
        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()));
        }
コード例 #26
0
 public static void EndSubItem(SubItemToken token, ProtoWriter writer)
 {
     ProtoWriter.EndSubItem(token, writer, PrefixStyle.Base128);
 }
コード例 #27
0
ファイル: BclHelpers.cs プロジェクト: x1234xx/Mystery_Stealer
        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);
            }
        }
コード例 #28
0
        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);
        }