Ejemplo n.º 1
0
        private static Type ReadDictionaryType(IBinaryReader reader, out ReadDelegate keyReadDelegate, out ReadDelegate valueReadDelegate)
        {
            Type   clrArrayType;
            Type   type4;
            GpType gpType = (GpType)reader.ReadByte();
            GpType type2  = (GpType)reader.ReadByte();

            if (gpType == GpType.Unknown)
            {
                clrArrayType    = typeof(object);
                keyReadDelegate = new ReadDelegate(GpBinaryByteReader.Read);
            }
            else
            {
                clrArrayType    = GpBinaryByteTypeConverter.GetClrArrayType(gpType);
                keyReadDelegate = GetReadDelegate(gpType);
            }
            if (type2 == GpType.Unknown)
            {
                type4             = typeof(object);
                valueReadDelegate = new ReadDelegate(GpBinaryByteReader.Read);
            }
            else
            {
                type4             = GpBinaryByteTypeConverter.GetClrArrayType(type2);
                valueReadDelegate = GetReadDelegate(type2);
            }
            return(typeof(Dictionary <,>).MakeGenericType(new Type[] { clrArrayType, type4 }));
        }
Ejemplo n.º 2
0
        private static Type ReadDictionaryType(IBinaryReader reader)
        {
            Type   clrArrayType;
            Type   dictArrayType;
            GpType gpType = (GpType)reader.ReadByte();
            GpType type2  = (GpType)reader.ReadByte();

            if (gpType == GpType.Unknown)
            {
                clrArrayType = typeof(object);
            }
            else
            {
                clrArrayType = GpBinaryByteTypeConverter.GetClrArrayType(gpType);
            }
            switch (type2)
            {
            case GpType.Unknown:
                dictArrayType = typeof(object);
                break;

            case GpType.Dictionary:
                dictArrayType = ReadDictionaryType(reader);
                break;

            case GpType.Array:
                dictArrayType = GetDictArrayType(reader);
                break;

            default:
                dictArrayType = GpBinaryByteTypeConverter.GetClrArrayType(type2);
                break;
            }
            return(typeof(Dictionary <,>).MakeGenericType(new Type[] { clrArrayType, dictArrayType }));
        }
Ejemplo n.º 3
0
        // Methods
        private static Type GetDictArrayType(IBinaryReader reader)
        {
            GpType gpType = (GpType)reader.ReadByte();
            int    num    = 0;

            while (gpType == GpType.Array)
            {
                num++;
                gpType = (GpType)reader.ReadByte();
            }
            Type type3 = GpBinaryByteTypeConverter.GetClrArrayType(gpType).MakeArrayType();

            for (int i = 0; i < num; i++)
            {
                type3 = type3.MakeArrayType();
            }
            return(type3);
        }
Ejemplo n.º 4
0
        private static bool ReadDictionary(IBinaryReader reader, out object result)
        {
            ReadDelegate readDelegate;
            Type         clrArrayType;
            ReadDelegate delegate3;
            Type         dictArrayType;

            result = null;
            GpType gpType = (GpType)reader.ReadByte();

            if (gpType == GpType.Unknown)
            {
                clrArrayType = typeof(object);
                readDelegate = new ReadDelegate(GpBinaryByteReader.Read);
            }
            else
            {
                clrArrayType = GpBinaryByteTypeConverter.GetClrArrayType(gpType);
                readDelegate = GetReadDelegate(gpType);
            }
            GpType type3 = (GpType)reader.ReadByte();

            switch (type3)
            {
            case GpType.Unknown:
                dictArrayType = typeof(object);
                delegate3     = new ReadDelegate(GpBinaryByteReader.Read);
                break;

            case GpType.Dictionary:
                dictArrayType = ReadDictionaryType(reader);
                delegate3     = new ReadDelegate(GpBinaryByteReader.ReadDictionary);
                break;

            case GpType.Array:
                dictArrayType = GetDictArrayType(reader);
                delegate3     = new ReadDelegate(GpBinaryByteReader.ReadArray);
                break;

            case GpType.ObjectArray:
                dictArrayType = typeof(object[]);
                delegate3     = new ReadDelegate(GpBinaryByteReader.ReadObjectArray);
                break;

            case GpType.Custom:
                CustomTypeInfo info;
                if (!CustomTypeCache.TryGet(reader.ReadByte(), out info))
                {
                    return(false);
                }
                dictArrayType = info.Type;
                delegate3     = new ReadDelegate(GpBinaryByteReader.ReadCustomType);
                break;

            default:
                dictArrayType = GpBinaryByteTypeConverter.GetClrArrayType(type3);
                delegate3     = GetReadDelegate(type3);
                if ((dictArrayType == null) || (delegate3 == null))
                {
                    return(false);
                }
                break;
            }
            IDictionary dictionary = Activator.CreateInstance(typeof(Dictionary <,>).MakeGenericType(new Type[] { clrArrayType, dictArrayType })) as IDictionary;

            if (dictionary == null)
            {
                return(false);
            }
            short num2 = reader.ReadInt16();

            for (int i = 0; i < num2; i++)
            {
                object obj2;
                object obj3;
                if (!readDelegate(reader, out obj2))
                {
                    return(false);
                }
                if (!delegate3(reader, out obj3))
                {
                    return(false);
                }
                dictionary.Add(obj2, obj3);
            }
            result = dictionary;
            return(true);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Reads an array from a specified <see cref="T:ExitGames.IO.IBinaryReader"/>
        /// </summary>
        /// <param name="binaryReader">The <see cref="T:ExitGames.IO.IBinaryReader"/> to read from.</param>
        /// <param name="result">When this method returns true, contains the array that was read from the <see cref="T:ExitGames.IO.IBinaryReader"/>.</param>
        /// <returns>True if the value was successfully read; otherwise false.</returns>
        internal static bool ReadArray(IBinaryReader binaryReader, out object result)
        {
            short  size   = binaryReader.ReadInt16();
            byte   num2   = binaryReader.ReadByte();
            GpType gpType = (GpType)num2;

            if (gpType == GpType.Dictionary)
            {
                return(ReadDictionaryArray(binaryReader, size, out result));
            }
            int  num3         = 1;
            Type clrArrayType = GpBinaryByteTypeConverter.GetClrArrayType(gpType, ref num3);

            if ((size < 0) || ((size * num3) > (binaryReader.BaseStream.Length - binaryReader.BaseStream.Position)))
            {
                if (log.IsDebugEnabled)
                {
                    log.DebugFormat("Invalid length for array of type {2}: length={0}, bytesLeft={1}", new object[] { size, binaryReader.BaseStream.Length - binaryReader.BaseStream.Position, gpType });
                }
                result = null;
                return(false);
            }
            switch (gpType)
            {
            case GpType.Custom:
                return(ReadCustomTypeArray(binaryReader, size, out result));

            case GpType.Array:
                return(ReadArrayInArray(binaryReader, size, out result));
            }
            if (clrArrayType == null)
            {
                if (log.IsDebugEnabled)
                {
                    if (gpType == GpType.Unknown)
                    {
                        log.DebugFormat("Array of unknown type {0} is not supported.", new object[] { num2 });
                    }
                    else
                    {
                        log.DebugFormat("Array of type {0} is not supported.", new object[] { gpType });
                    }
                }
                result = null;
                return(false);
            }
            Array array = Array.CreateInstance(clrArrayType, size);

            for (short i = 0; i < size; i = (short)(i + 1))
            {
                object obj2;
                if (Read(binaryReader, gpType, out obj2))
                {
                    array.SetValue(obj2, (int)i);
                }
                else
                {
                    result = null;
                    return(false);
                }
            }
            result = array;
            return(true);
        }