Exemple #1
0
 /// <summary>
 /// Indicates whether the reader still has data remaining in the current sub-item,
 /// additionally setting the wire-type for the next field if there is more data.
 /// This is used when decoding packed data.
 /// </summary>
 public static bool HasSubValue(ProtoBuf.WireType wireType, ProtoReader source)
 {
     // check for virtual end of stream
     if (source.blockEnd <= source.position || wireType == WireType.EndGroup)
     {
         return(false);
     }
     source.wireType = wireType;
     return(true);
 }
        public static void WriteFieldHeader(int fieldNumber, ProtoBuf.WireType wireType, ProtoWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            if (writer.wireType != ProtoBuf.WireType.None)
            {
                string[] str = new string[] { "Cannot write a ", wireType.ToString(), " header until the ", writer.wireType.ToString(), " data has been written" };
                throw new InvalidOperationException(string.Concat(str));
            }
            if (fieldNumber < 0)
            {
                throw new ArgumentOutOfRangeException("fieldNumber");
            }
            if (writer.packedFieldNumber == 0)
            {
                writer.fieldNumber = fieldNumber;
                writer.wireType    = wireType;
                ProtoWriter.WriteHeaderCore(fieldNumber, wireType, writer);
                return;
            }
            if (writer.packedFieldNumber != fieldNumber)
            {
                throw new InvalidOperationException(string.Concat("Field mismatch during packed encoding; expected ", writer.packedFieldNumber.ToString(), " but received ", fieldNumber.ToString()));
            }
            ProtoBuf.WireType wireType1 = wireType;
            switch (wireType1)
            {
            case ProtoBuf.WireType.Variant:
            case ProtoBuf.WireType.Fixed64:
            {
                writer.fieldNumber = fieldNumber;
                writer.wireType    = wireType;
                return;
            }

            default:
            {
                if (wireType1 == ProtoBuf.WireType.Fixed32 || wireType1 == ProtoBuf.WireType.SignedVariant)
                {
                    writer.fieldNumber = fieldNumber;
                    writer.wireType    = wireType;
                    return;
                }
                throw new InvalidOperationException(string.Concat("Wire-type cannot be encoded as packed: ", wireType.ToString()));
            }
            }
        }
 public static void WriteSingle(float value, ProtoWriter writer)
 {
     if (writer == null)
     {
         throw new ArgumentNullException("writer");
     }
     ProtoBuf.WireType wireType = writer.wireType;
     if (wireType == ProtoBuf.WireType.Fixed64)
     {
         ProtoWriter.WriteDouble((double)value, writer);
         return;
     }
     if (wireType != ProtoBuf.WireType.Fixed32)
     {
         throw ProtoWriter.CreateException(writer);
     }
     ProtoWriter.WriteInt32(BitConverter.ToInt32(BitConverter.GetBytes(value), 0), writer);
 }
        public static void WriteUInt32(uint value, ProtoWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            ProtoBuf.WireType wireType = writer.wireType;
            switch (wireType)
            {
            case ProtoBuf.WireType.Variant:
            {
                ProtoWriter.WriteUInt32Variant(value, writer);
                writer.wireType = ProtoBuf.WireType.None;
                return;
            }

            case ProtoBuf.WireType.Fixed64:
            {
                ProtoWriter.WriteInt64((long)value, writer);
                return;
            }

            default:
            {
                if (wireType != ProtoBuf.WireType.Fixed32)
                {
                    break;
                }
                else
                {
                    ProtoWriter.WriteInt32((int)value, writer);
                    return;
                }
            }
            }
            throw ProtoWriter.CreateException(writer);
        }
 public ProtoWriter(Stream dest, TypeModel model, SerializationContext context)
 {
     if (dest == null)
     {
         throw new ArgumentNullException("dest");
     }
     if (!dest.CanWrite)
     {
         throw new ArgumentException("Cannot write to stream", "dest");
     }
     this.dest     = dest;
     this.ioBuffer = BufferPool.GetBuffer();
     this.model    = model;
     this.wireType = ProtoBuf.WireType.None;
     if (context != null)
     {
         context.Freeze();
     }
     else
     {
         context = SerializationContext.Default;
     }
     this.context = context;
 }
        public static void WriteDouble(double value, ProtoWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            ProtoBuf.WireType wireType = writer.wireType;
            if (wireType == ProtoBuf.WireType.Fixed64)
            {
                ProtoWriter.WriteInt64(BitConverter.ToInt64(BitConverter.GetBytes(value), 0), writer);
                return;
            }
            if (wireType != ProtoBuf.WireType.Fixed32)
            {
                throw ProtoWriter.CreateException(writer);
            }
            float single = (float)value;

            if (Helpers.IsInfinity(single) && !Helpers.IsInfinity(value))
            {
                throw new OverflowException();
            }
            ProtoWriter.WriteSingle(single, writer);
        }
        public static void WriteInt64(long value, ProtoWriter writer)
        {
            byte[] numArray;
            int    num;

            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            ProtoBuf.WireType wireType = writer.wireType;
            switch (wireType)
            {
            case ProtoBuf.WireType.Variant:
            {
                if (value >= (long)0)
                {
                    ProtoWriter.WriteUInt64Variant((ulong)value, writer);
                    writer.wireType = ProtoBuf.WireType.None;
                    return;
                }
                ProtoWriter.DemandSpace(10, writer);
                numArray          = writer.ioBuffer;
                num               = writer.ioIndex;
                numArray[num]     = (byte)(value | (long)128);
                numArray[num + 1] = (byte)((int)(value >> 7) | 128);
                numArray[num + 2] = (byte)((int)(value >> 14) | 128);
                numArray[num + 3] = (byte)((int)(value >> 21) | 128);
                numArray[num + 4] = (byte)((int)(value >> 28) | 128);
                numArray[num + 5] = (byte)((int)(value >> 35) | 128);
                numArray[num + 6] = (byte)((int)(value >> 42) | 128);
                numArray[num + 7] = (byte)((int)(value >> 49) | 128);
                numArray[num + 8] = (byte)((int)(value >> 56) | 128);
                numArray[num + 9] = 1;
                ProtoWriter.IncrementedAndReset(10, writer);
                return;
            }

            case ProtoBuf.WireType.Fixed64:
            {
                ProtoWriter.DemandSpace(8, writer);
                numArray          = writer.ioBuffer;
                num               = writer.ioIndex;
                numArray[num]     = (byte)value;
                numArray[num + 1] = (byte)(value >> 8);
                numArray[num + 2] = (byte)(value >> 16);
                numArray[num + 3] = (byte)(value >> 24);
                numArray[num + 4] = (byte)(value >> 32);
                numArray[num + 5] = (byte)(value >> 40);
                numArray[num + 6] = (byte)(value >> 48);
                numArray[num + 7] = (byte)(value >> 56);
                ProtoWriter.IncrementedAndReset(8, writer);
                return;
            }

            default:
            {
                if (wireType == ProtoBuf.WireType.Fixed32)
                {
                    break;
                }
                else
                {
                    if (wireType != ProtoBuf.WireType.SignedVariant)
                    {
                        throw ProtoWriter.CreateException(writer);
                    }
                    ProtoWriter.WriteUInt64Variant(ProtoWriter.Zig(value), writer);
                    writer.wireType = ProtoBuf.WireType.None;
                    return;
                }
            }
            }
            ProtoWriter.WriteInt32(checked ((int)value), writer);
        }
        public static void WriteInt32(int value, ProtoWriter writer)
        {
            byte[] numArray;
            int    num;

            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            ProtoBuf.WireType wireType = writer.wireType;
            switch (wireType)
            {
            case ProtoBuf.WireType.Variant:
            {
                if (value >= 0)
                {
                    ProtoWriter.WriteUInt32Variant((uint)value, writer);
                    writer.wireType = ProtoBuf.WireType.None;
                    return;
                }
                ProtoWriter.DemandSpace(10, writer);
                numArray          = writer.ioBuffer;
                num               = writer.ioIndex;
                numArray[num]     = (byte)(value | 128);
                numArray[num + 1] = (byte)(value >> 7 | 128);
                numArray[num + 2] = (byte)(value >> 14 | 128);
                numArray[num + 3] = (byte)(value >> 21 | 128);
                numArray[num + 4] = (byte)(value >> 28 | 128);
                int  num1 = 255;
                byte num2 = (byte)num1;
                numArray[num + 8] = (byte)num1;
                byte num3 = num2;
                byte num4 = num3;
                numArray[num + 7] = num3;
                byte num5 = num4;
                byte num6 = num5;
                numArray[num + 6] = num5;
                numArray[num + 5] = num6;
                numArray[num + 9] = 1;
                ProtoWriter.IncrementedAndReset(10, writer);
                return;
            }

            case ProtoBuf.WireType.Fixed64:
            {
                ProtoWriter.DemandSpace(8, writer);
                numArray          = writer.ioBuffer;
                num               = writer.ioIndex;
                numArray[num]     = (byte)value;
                numArray[num + 1] = (byte)(value >> 8);
                numArray[num + 2] = (byte)(value >> 16);
                numArray[num + 3] = (byte)(value >> 24);
                int  num7 = 0;
                byte num8 = (byte)num7;
                numArray[num + 7] = (byte)num7;
                byte num9  = num8;
                byte num10 = num9;
                numArray[num + 6] = num9;
                byte num11 = num10;
                byte num12 = num11;
                numArray[num + 5] = num11;
                numArray[num + 4] = num12;
                ProtoWriter.IncrementedAndReset(8, writer);
                return;
            }

            default:
            {
                if (wireType == ProtoBuf.WireType.Fixed32)
                {
                    break;
                }
                else
                {
                    if (wireType != ProtoBuf.WireType.SignedVariant)
                    {
                        throw ProtoWriter.CreateException(writer);
                    }
                    ProtoWriter.WriteUInt32Variant(ProtoWriter.Zig(value), writer);
                    writer.wireType = ProtoBuf.WireType.None;
                    return;
                }
            }
            }
            ProtoWriter.DemandSpace(4, writer);
            ProtoWriter.WriteInt32ToBuffer(value, writer.ioBuffer, writer.ioIndex);
            ProtoWriter.IncrementedAndReset(4, writer);
        }
        internal static void WriteHeaderCore(int fieldNumber, ProtoBuf.WireType wireType, ProtoWriter writer)
        {
            uint num = (uint)(fieldNumber << 3 | (int)(wireType & (ProtoBuf.WireType.Fixed64 | ProtoBuf.WireType.String | ProtoBuf.WireType.StartGroup | ProtoBuf.WireType.EndGroup | ProtoBuf.WireType.Fixed32)));

            ProtoWriter.WriteUInt32Variant(num, writer);
        }
Exemple #10
0
 static bool NeedsHint(ProtoBuf.WireType wireType)
 {
     return(((int)wireType & ~7) != 0);
 }