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 })); }
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 })); }
// 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); }
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); }
/// <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); }