This commit is contained in:
niko
2026-06-04 11:42:34 +02:00
parent f39ba70a9f
commit e720b98cd1
7488 changed files with 2493818 additions and 0 deletions
@@ -0,0 +1,1444 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace ExitGames.Client.Photon
{
// Token: 0x02000028 RID: 40
public class Protocol16 : IProtocol
{
// Token: 0x17000069 RID: 105
// (get) Token: 0x060001D7 RID: 471 RVA: 0x0000F738 File Offset: 0x0000D938
internal override string protocolType
{
get
{
return "GpBinaryV16";
}
}
// Token: 0x1700006A RID: 106
// (get) Token: 0x060001D8 RID: 472 RVA: 0x0000F750 File Offset: 0x0000D950
internal override byte[] VersionBytes
{
get
{
return this.versionBytes;
}
}
// Token: 0x060001D9 RID: 473 RVA: 0x0000F768 File Offset: 0x0000D968
private bool SerializeCustom(StreamBuffer dout, object serObject)
{
CustomType customType;
bool flag = Protocol.TypeDict.TryGetValue(serObject.GetType(), out customType);
bool flag3;
if (flag)
{
bool flag2 = customType.SerializeStreamFunction == null;
if (flag2)
{
byte[] array = customType.SerializeFunction(serObject);
dout.WriteByte(99);
dout.WriteByte(customType.Code);
this.SerializeShort(dout, (short)array.Length, false);
dout.Write(array, 0, array.Length);
flag3 = true;
}
else
{
dout.WriteByte(99);
dout.WriteByte(customType.Code);
long position = dout.Position;
dout.Position += 2L;
short num = customType.SerializeStreamFunction(dout, serObject);
long position2 = dout.Position;
dout.Position = position;
this.SerializeShort(dout, num, false);
dout.Position += (long)num;
bool flag4 = dout.Position != position2;
if (flag4)
{
throw new Exception(string.Concat(new object[] { "Serialization failed. Stream position corrupted. Should be ", position2, " is now: ", dout.Position, " serializedLength: ", num }));
}
flag3 = true;
}
}
else
{
flag3 = false;
}
return flag3;
}
// Token: 0x060001DA RID: 474 RVA: 0x0000F8B8 File Offset: 0x0000DAB8
private object DeserializeCustom(StreamBuffer din, byte customTypeCode)
{
short num = this.DeserializeShort(din);
CustomType customType;
bool flag = Protocol.CodeDict.TryGetValue(customTypeCode, out customType);
object obj;
if (flag)
{
bool flag2 = customType.DeserializeStreamFunction == null;
if (flag2)
{
byte[] array = new byte[(int)num];
din.Read(array, 0, (int)num);
obj = customType.DeserializeFunction(array);
}
else
{
long position = din.Position;
object obj2 = customType.DeserializeStreamFunction(din, num);
int num2 = (int)(din.Position - position);
bool flag3 = num2 != (int)num;
if (flag3)
{
din.Position = position + (long)num;
}
obj = obj2;
}
}
else
{
byte[] array2 = new byte[(int)num];
din.Read(array2, 0, (int)num);
obj = array2;
}
return obj;
}
// Token: 0x060001DB RID: 475 RVA: 0x0000F974 File Offset: 0x0000DB74
private Type GetTypeOfCode(byte typeCode)
{
if (typeCode <= 42)
{
if (typeCode == 0 || typeCode == 42)
{
return typeof(object);
}
}
else
{
if (typeCode == 68)
{
return typeof(IDictionary);
}
switch (typeCode)
{
case 97:
return typeof(string[]);
case 98:
return typeof(byte);
case 99:
return typeof(CustomType);
case 100:
return typeof(double);
case 101:
return typeof(EventData);
case 102:
return typeof(float);
case 104:
return typeof(Hashtable);
case 105:
return typeof(int);
case 107:
return typeof(short);
case 108:
return typeof(long);
case 110:
return typeof(int[]);
case 111:
return typeof(bool);
case 112:
return typeof(OperationResponse);
case 113:
return typeof(OperationRequest);
case 115:
return typeof(string);
case 120:
return typeof(byte[]);
case 121:
return typeof(Array);
case 122:
return typeof(object[]);
}
}
Debug.WriteLine("missing type: " + typeCode);
throw new Exception("deserialize(): " + typeCode);
}
// Token: 0x060001DC RID: 476 RVA: 0x0000FB78 File Offset: 0x0000DD78
private Protocol16.GpType GetCodeOfType(Type type)
{
TypeCode typeCode = Type.GetTypeCode(type);
TypeCode typeCode2 = typeCode;
switch (typeCode2)
{
case TypeCode.Boolean:
return Protocol16.GpType.Boolean;
case TypeCode.Char:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
break;
case TypeCode.Byte:
return Protocol16.GpType.Byte;
case TypeCode.Int16:
return Protocol16.GpType.Short;
case TypeCode.Int32:
return Protocol16.GpType.Integer;
case TypeCode.Int64:
return Protocol16.GpType.Long;
case TypeCode.Single:
return Protocol16.GpType.Float;
case TypeCode.Double:
return Protocol16.GpType.Double;
default:
if (typeCode2 == TypeCode.String)
{
return Protocol16.GpType.String;
}
break;
}
bool isArray = type.IsArray;
Protocol16.GpType gpType;
if (isArray)
{
bool flag = type == typeof(byte[]);
if (flag)
{
gpType = Protocol16.GpType.ByteArray;
}
else
{
gpType = Protocol16.GpType.Array;
}
}
else
{
bool flag2 = type == typeof(Hashtable);
if (flag2)
{
gpType = Protocol16.GpType.Hashtable;
}
else
{
bool flag3 = type.IsGenericType && typeof(Dictionary<, >) == type.GetGenericTypeDefinition();
if (flag3)
{
gpType = Protocol16.GpType.Dictionary;
}
else
{
bool flag4 = type == typeof(EventData);
if (flag4)
{
gpType = Protocol16.GpType.EventData;
}
else
{
bool flag5 = type == typeof(OperationRequest);
if (flag5)
{
gpType = Protocol16.GpType.OperationRequest;
}
else
{
bool flag6 = type == typeof(OperationResponse);
if (flag6)
{
gpType = Protocol16.GpType.OperationResponse;
}
else
{
gpType = Protocol16.GpType.Unknown;
}
}
}
}
}
}
return gpType;
}
// Token: 0x060001DD RID: 477 RVA: 0x0000FCD4 File Offset: 0x0000DED4
private Array CreateArrayByType(byte arrayType, short length)
{
return Array.CreateInstance(this.GetTypeOfCode(arrayType), (int)length);
}
// Token: 0x060001DE RID: 478 RVA: 0x0000FCF3 File Offset: 0x0000DEF3
private void SerializeOperationRequest(StreamBuffer stream, OperationRequest serObject, bool setType)
{
this.SerializeOperationRequest(stream, serObject.OperationCode, serObject.Parameters, setType);
}
// Token: 0x060001DF RID: 479 RVA: 0x0000FD0C File Offset: 0x0000DF0C
public override void SerializeOperationRequest(StreamBuffer stream, byte operationCode, Dictionary<byte, object> parameters, bool setType)
{
if (setType)
{
stream.WriteByte(113);
}
stream.WriteByte(operationCode);
this.SerializeParameterTable(stream, parameters);
}
// Token: 0x060001E0 RID: 480 RVA: 0x0000FD3C File Offset: 0x0000DF3C
public override OperationRequest DeserializeOperationRequest(StreamBuffer din)
{
return new OperationRequest
{
OperationCode = this.DeserializeByte(din),
Parameters = this.DeserializeParameterTable(din)
};
}
// Token: 0x060001E1 RID: 481 RVA: 0x0000FD70 File Offset: 0x0000DF70
public override void SerializeOperationResponse(StreamBuffer stream, OperationResponse serObject, bool setType)
{
if (setType)
{
stream.WriteByte(112);
}
stream.WriteByte(serObject.OperationCode);
this.SerializeShort(stream, serObject.ReturnCode, false);
bool flag = string.IsNullOrEmpty(serObject.DebugMessage);
if (flag)
{
stream.WriteByte(42);
}
else
{
this.SerializeString(stream, serObject.DebugMessage, false);
}
this.SerializeParameterTable(stream, serObject.Parameters);
}
// Token: 0x060001E2 RID: 482 RVA: 0x0000FDE8 File Offset: 0x0000DFE8
public override OperationResponse DeserializeOperationResponse(StreamBuffer stream)
{
return new OperationResponse
{
OperationCode = this.DeserializeByte(stream),
ReturnCode = this.DeserializeShort(stream),
DebugMessage = (this.Deserialize(stream, this.DeserializeByte(stream)) as string),
Parameters = this.DeserializeParameterTable(stream)
};
}
// Token: 0x060001E3 RID: 483 RVA: 0x0000FE44 File Offset: 0x0000E044
public override void SerializeEventData(StreamBuffer stream, EventData serObject, bool setType)
{
if (setType)
{
stream.WriteByte(101);
}
stream.WriteByte(serObject.Code);
this.SerializeParameterTable(stream, serObject.Parameters);
}
// Token: 0x060001E4 RID: 484 RVA: 0x0000FE80 File Offset: 0x0000E080
public override EventData DeserializeEventData(StreamBuffer din)
{
return new EventData
{
Code = this.DeserializeByte(din),
Parameters = this.DeserializeParameterTable(din)
};
}
// Token: 0x060001E5 RID: 485 RVA: 0x0000FEB4 File Offset: 0x0000E0B4
private void SerializeParameterTable(StreamBuffer stream, Dictionary<byte, object> parameters)
{
bool flag = parameters == null || parameters.Count == 0;
if (flag)
{
this.SerializeShort(stream, 0, false);
}
else
{
this.SerializeShort(stream, (short)parameters.Count, false);
foreach (KeyValuePair<byte, object> keyValuePair in parameters)
{
stream.WriteByte(keyValuePair.Key);
this.Serialize(stream, keyValuePair.Value, true);
}
}
}
// Token: 0x060001E6 RID: 486 RVA: 0x0000FF50 File Offset: 0x0000E150
private Dictionary<byte, object> DeserializeParameterTable(StreamBuffer stream)
{
short num = this.DeserializeShort(stream);
Dictionary<byte, object> dictionary = new Dictionary<byte, object>((int)num);
for (int i = 0; i < (int)num; i++)
{
byte b = (byte)stream.ReadByte();
object obj = this.Deserialize(stream, (byte)stream.ReadByte());
dictionary[b] = obj;
}
return dictionary;
}
// Token: 0x060001E7 RID: 487 RVA: 0x0000FFAC File Offset: 0x0000E1AC
public override void Serialize(StreamBuffer dout, object serObject, bool setType)
{
bool flag = serObject == null;
if (flag)
{
if (setType)
{
dout.WriteByte(42);
}
}
else
{
Protocol16.GpType codeOfType = this.GetCodeOfType(serObject.GetType());
Protocol16.GpType gpType = codeOfType;
if (gpType != Protocol16.GpType.Dictionary)
{
switch (gpType)
{
case Protocol16.GpType.Byte:
this.SerializeByte(dout, (byte)serObject, setType);
return;
case Protocol16.GpType.Double:
this.SerializeDouble(dout, (double)serObject, setType);
return;
case Protocol16.GpType.EventData:
this.SerializeEventData(dout, (EventData)serObject, setType);
return;
case Protocol16.GpType.Float:
this.SerializeFloat(dout, (float)serObject, setType);
return;
case Protocol16.GpType.Hashtable:
this.SerializeHashTable(dout, (Hashtable)serObject, setType);
return;
case Protocol16.GpType.Integer:
this.SerializeInteger(dout, (int)serObject, setType);
return;
case Protocol16.GpType.Short:
this.SerializeShort(dout, (short)serObject, setType);
return;
case Protocol16.GpType.Long:
this.SerializeLong(dout, (long)serObject, setType);
return;
case Protocol16.GpType.Boolean:
this.SerializeBoolean(dout, (bool)serObject, setType);
return;
case Protocol16.GpType.OperationResponse:
this.SerializeOperationResponse(dout, (OperationResponse)serObject, setType);
return;
case Protocol16.GpType.OperationRequest:
this.SerializeOperationRequest(dout, (OperationRequest)serObject, setType);
return;
case Protocol16.GpType.String:
this.SerializeString(dout, (string)serObject, setType);
return;
case Protocol16.GpType.ByteArray:
this.SerializeByteArray(dout, (byte[])serObject, setType);
return;
case Protocol16.GpType.Array:
{
bool flag2 = serObject is int[];
if (flag2)
{
this.SerializeIntArrayOptimized(dout, (int[])serObject, setType);
}
else
{
bool flag3 = serObject.GetType().GetElementType() == typeof(object);
if (flag3)
{
this.SerializeObjectArray(dout, serObject as object[], setType);
}
else
{
this.SerializeArray(dout, (Array)serObject, setType);
}
}
return;
}
}
bool flag4 = serObject is ArraySegment<byte>;
if (flag4)
{
ArraySegment<byte> arraySegment = (ArraySegment<byte>)serObject;
this.SerializeByteArraySegment(dout, arraySegment.Array, arraySegment.Offset, arraySegment.Count, setType);
}
else
{
bool flag5 = !this.SerializeCustom(dout, serObject);
if (flag5)
{
throw new Exception("cannot serialize(): " + serObject.GetType());
}
}
}
else
{
this.SerializeDictionary(dout, (IDictionary)serObject, setType);
}
}
}
// Token: 0x060001E8 RID: 488 RVA: 0x0001023C File Offset: 0x0000E43C
private void SerializeByte(StreamBuffer dout, byte serObject, bool setType)
{
if (setType)
{
dout.WriteByte(98);
}
dout.WriteByte(serObject);
}
// Token: 0x060001E9 RID: 489 RVA: 0x00010264 File Offset: 0x0000E464
private void SerializeBoolean(StreamBuffer dout, bool serObject, bool setType)
{
if (setType)
{
dout.WriteByte(111);
}
dout.WriteByte(serObject ? 1 : 0);
}
// Token: 0x060001EA RID: 490 RVA: 0x00010290 File Offset: 0x0000E490
public override void SerializeShort(StreamBuffer dout, short serObject, bool setType)
{
if (setType)
{
dout.WriteByte(107);
}
byte[] array = this.memShort;
lock (array)
{
byte[] array2 = this.memShort;
array2[0] = (byte)(serObject >> 8);
array2[1] = (byte)serObject;
dout.Write(array2, 0, 2);
}
}
// Token: 0x060001EB RID: 491 RVA: 0x000102F8 File Offset: 0x0000E4F8
private void SerializeInteger(StreamBuffer dout, int serObject, bool setType)
{
if (setType)
{
dout.WriteByte(105);
}
byte[] array = this.memInteger;
lock (array)
{
byte[] array2 = this.memInteger;
array2[0] = (byte)(serObject >> 24);
array2[1] = (byte)(serObject >> 16);
array2[2] = (byte)(serObject >> 8);
array2[3] = (byte)serObject;
dout.Write(array2, 0, 4);
}
}
// Token: 0x060001EC RID: 492 RVA: 0x00010370 File Offset: 0x0000E570
private void SerializeLong(StreamBuffer dout, long serObject, bool setType)
{
if (setType)
{
dout.WriteByte(108);
}
long[] array = this.memLongBlock;
lock (array)
{
this.memLongBlock[0] = serObject;
Buffer.BlockCopy(this.memLongBlock, 0, this.memLongBlockBytes, 0, 8);
byte[] array2 = this.memLongBlockBytes;
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
byte b = array2[0];
byte b2 = array2[1];
byte b3 = array2[2];
byte b4 = array2[3];
array2[0] = array2[7];
array2[1] = array2[6];
array2[2] = array2[5];
array2[3] = array2[4];
array2[4] = b4;
array2[5] = b3;
array2[6] = b2;
array2[7] = b;
}
dout.Write(array2, 0, 8);
}
}
// Token: 0x060001ED RID: 493 RVA: 0x00010434 File Offset: 0x0000E634
private void SerializeFloat(StreamBuffer dout, float serObject, bool setType)
{
if (setType)
{
dout.WriteByte(102);
}
byte[] array = Protocol16.memFloatBlockBytes;
lock (array)
{
Protocol16.memFloatBlock[0] = serObject;
Buffer.BlockCopy(Protocol16.memFloatBlock, 0, Protocol16.memFloatBlockBytes, 0, 4);
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
byte b = Protocol16.memFloatBlockBytes[0];
byte b2 = Protocol16.memFloatBlockBytes[1];
Protocol16.memFloatBlockBytes[0] = Protocol16.memFloatBlockBytes[3];
Protocol16.memFloatBlockBytes[1] = Protocol16.memFloatBlockBytes[2];
Protocol16.memFloatBlockBytes[2] = b2;
Protocol16.memFloatBlockBytes[3] = b;
}
dout.Write(Protocol16.memFloatBlockBytes, 0, 4);
}
}
// Token: 0x060001EE RID: 494 RVA: 0x000104F0 File Offset: 0x0000E6F0
private void SerializeDouble(StreamBuffer dout, double serObject, bool setType)
{
if (setType)
{
dout.WriteByte(100);
}
byte[] array = this.memDoubleBlockBytes;
lock (array)
{
this.memDoubleBlock[0] = serObject;
Buffer.BlockCopy(this.memDoubleBlock, 0, this.memDoubleBlockBytes, 0, 8);
byte[] array2 = this.memDoubleBlockBytes;
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
byte b = array2[0];
byte b2 = array2[1];
byte b3 = array2[2];
byte b4 = array2[3];
array2[0] = array2[7];
array2[1] = array2[6];
array2[2] = array2[5];
array2[3] = array2[4];
array2[4] = b4;
array2[5] = b3;
array2[6] = b2;
array2[7] = b;
}
dout.Write(array2, 0, 8);
}
}
// Token: 0x060001EF RID: 495 RVA: 0x000105B4 File Offset: 0x0000E7B4
public override void SerializeString(StreamBuffer dout, string serObject, bool setType)
{
if (setType)
{
dout.WriteByte(115);
}
byte[] bytes = Encoding.UTF8.GetBytes(serObject);
bool flag = bytes.Length > 32767;
if (flag)
{
throw new NotSupportedException("Strings that exceed a UTF8-encoded byte-length of 32767 (short.MaxValue) are not supported. Yours is: " + bytes.Length);
}
this.SerializeShort(dout, (short)bytes.Length, false);
dout.Write(bytes, 0, bytes.Length);
}
// Token: 0x060001F0 RID: 496 RVA: 0x00010620 File Offset: 0x0000E820
private void SerializeArray(StreamBuffer dout, Array serObject, bool setType)
{
if (setType)
{
dout.WriteByte(121);
}
bool flag = serObject.Length > 32767;
if (flag)
{
throw new NotSupportedException("String[] that exceed 32767 (short.MaxValue) entries are not supported. Yours is: " + serObject.Length);
}
this.SerializeShort(dout, (short)serObject.Length, false);
Type elementType = serObject.GetType().GetElementType();
Protocol16.GpType codeOfType = this.GetCodeOfType(elementType);
bool flag2 = codeOfType > Protocol16.GpType.Unknown;
if (flag2)
{
dout.WriteByte((byte)codeOfType);
bool flag3 = codeOfType == Protocol16.GpType.Dictionary;
if (flag3)
{
bool flag4;
bool flag5;
this.SerializeDictionaryHeader(dout, serObject, out flag4, out flag5);
for (int i = 0; i < serObject.Length; i++)
{
object value = serObject.GetValue(i);
this.SerializeDictionaryElements(dout, value, flag4, flag5);
}
}
else
{
for (int j = 0; j < serObject.Length; j++)
{
object value2 = serObject.GetValue(j);
this.Serialize(dout, value2, false);
}
}
}
else
{
CustomType customType;
bool flag6 = Protocol.TypeDict.TryGetValue(elementType, out customType);
if (!flag6)
{
throw new NotSupportedException("cannot serialize array of type " + elementType);
}
dout.WriteByte(99);
dout.WriteByte(customType.Code);
for (int k = 0; k < serObject.Length; k++)
{
object value3 = serObject.GetValue(k);
bool flag7 = customType.SerializeStreamFunction == null;
if (flag7)
{
byte[] array = customType.SerializeFunction(value3);
this.SerializeShort(dout, (short)array.Length, false);
dout.Write(array, 0, array.Length);
}
else
{
long position = dout.Position;
dout.Position += 2L;
short num = customType.SerializeStreamFunction(dout, value3);
long position2 = dout.Position;
dout.Position = position;
this.SerializeShort(dout, num, false);
dout.Position += (long)num;
bool flag8 = dout.Position != position2;
if (flag8)
{
throw new Exception(string.Concat(new object[] { "Serialization failed. Stream position corrupted. Should be ", position2, " is now: ", dout.Position, " serializedLength: ", num }));
}
}
}
}
}
// Token: 0x060001F1 RID: 497 RVA: 0x0001089C File Offset: 0x0000EA9C
private void SerializeByteArray(StreamBuffer dout, byte[] serObject, bool setType)
{
if (setType)
{
dout.WriteByte(120);
}
this.SerializeInteger(dout, serObject.Length, false);
dout.Write(serObject, 0, serObject.Length);
}
// Token: 0x060001F2 RID: 498 RVA: 0x000108D4 File Offset: 0x0000EAD4
private void SerializeByteArraySegment(StreamBuffer dout, byte[] serObject, int offset, int count, bool setType)
{
if (setType)
{
dout.WriteByte(120);
}
this.SerializeInteger(dout, count, false);
dout.Write(serObject, offset, count);
}
// Token: 0x060001F3 RID: 499 RVA: 0x0001090C File Offset: 0x0000EB0C
private void SerializeIntArrayOptimized(StreamBuffer inWriter, int[] serObject, bool setType)
{
if (setType)
{
inWriter.WriteByte(121);
}
this.SerializeShort(inWriter, (short)serObject.Length, false);
inWriter.WriteByte(105);
byte[] array = new byte[serObject.Length * 4];
int num = 0;
for (int i = 0; i < serObject.Length; i++)
{
array[num++] = (byte)(serObject[i] >> 24);
array[num++] = (byte)(serObject[i] >> 16);
array[num++] = (byte)(serObject[i] >> 8);
array[num++] = (byte)serObject[i];
}
inWriter.Write(array, 0, array.Length);
}
// Token: 0x060001F4 RID: 500 RVA: 0x000109A4 File Offset: 0x0000EBA4
private void SerializeStringArray(StreamBuffer dout, string[] serObject, bool setType)
{
if (setType)
{
dout.WriteByte(97);
}
this.SerializeShort(dout, (short)serObject.Length, false);
for (int i = 0; i < serObject.Length; i++)
{
this.SerializeString(dout, serObject[i], false);
}
}
// Token: 0x060001F5 RID: 501 RVA: 0x000109F0 File Offset: 0x0000EBF0
private void SerializeObjectArray(StreamBuffer dout, object[] objects, bool setType)
{
if (setType)
{
dout.WriteByte(122);
}
this.SerializeShort(dout, (short)objects.Length, false);
foreach (object obj in objects)
{
this.Serialize(dout, obj, true);
}
}
// Token: 0x060001F6 RID: 502 RVA: 0x00010A40 File Offset: 0x0000EC40
private void SerializeHashTable(StreamBuffer dout, Hashtable serObject, bool setType)
{
if (setType)
{
dout.WriteByte(104);
}
this.SerializeShort(dout, (short)serObject.Count, false);
Dictionary<object, object>.KeyCollection keys = serObject.Keys;
foreach (object obj in keys)
{
this.Serialize(dout, obj, true);
this.Serialize(dout, serObject[obj], true);
}
}
// Token: 0x060001F7 RID: 503 RVA: 0x00010AD0 File Offset: 0x0000ECD0
private void SerializeDictionary(StreamBuffer dout, IDictionary serObject, bool setType)
{
if (setType)
{
dout.WriteByte(68);
}
bool flag;
bool flag2;
this.SerializeDictionaryHeader(dout, serObject, out flag, out flag2);
this.SerializeDictionaryElements(dout, serObject, flag, flag2);
}
// Token: 0x060001F8 RID: 504 RVA: 0x00010B08 File Offset: 0x0000ED08
private void SerializeDictionaryHeader(StreamBuffer writer, Type dictType)
{
bool flag;
bool flag2;
this.SerializeDictionaryHeader(writer, dictType, out flag, out flag2);
}
// Token: 0x060001F9 RID: 505 RVA: 0x00010B24 File Offset: 0x0000ED24
private void SerializeDictionaryHeader(StreamBuffer writer, object dict, out bool setKeyType, out bool setValueType)
{
Type[] genericArguments = dict.GetType().GetGenericArguments();
setKeyType = genericArguments[0] == typeof(object);
setValueType = genericArguments[1] == typeof(object);
bool flag = setKeyType;
if (flag)
{
writer.WriteByte(0);
}
else
{
Protocol16.GpType codeOfType = this.GetCodeOfType(genericArguments[0]);
bool flag2 = codeOfType == Protocol16.GpType.Unknown || codeOfType == Protocol16.GpType.Dictionary;
if (flag2)
{
throw new Exception("Unexpected - cannot serialize Dictionary with key type: " + genericArguments[0]);
}
writer.WriteByte((byte)codeOfType);
}
bool flag3 = setValueType;
if (flag3)
{
writer.WriteByte(0);
}
else
{
Protocol16.GpType codeOfType2 = this.GetCodeOfType(genericArguments[1]);
bool flag4 = codeOfType2 == Protocol16.GpType.Unknown;
if (flag4)
{
throw new Exception("Unexpected - cannot serialize Dictionary with value type: " + genericArguments[0]);
}
writer.WriteByte((byte)codeOfType2);
bool flag5 = codeOfType2 == Protocol16.GpType.Dictionary;
if (flag5)
{
this.SerializeDictionaryHeader(writer, genericArguments[1]);
}
}
}
// Token: 0x060001FA RID: 506 RVA: 0x00010C10 File Offset: 0x0000EE10
private void SerializeDictionaryElements(StreamBuffer writer, object dict, bool setKeyType, bool setValueType)
{
IDictionary dictionary = (IDictionary)dict;
this.SerializeShort(writer, (short)dictionary.Count, false);
foreach (object obj in dictionary)
{
DictionaryEntry dictionaryEntry = (DictionaryEntry)obj;
bool flag = !setValueType && dictionaryEntry.Value == null;
if (flag)
{
throw new Exception("Can't serialize null in Dictionary with specific value-type.");
}
bool flag2 = !setKeyType && dictionaryEntry.Key == null;
if (flag2)
{
throw new Exception("Can't serialize null in Dictionary with specific key-type.");
}
this.Serialize(writer, dictionaryEntry.Key, setKeyType);
this.Serialize(writer, dictionaryEntry.Value, setValueType);
}
}
// Token: 0x060001FB RID: 507 RVA: 0x00010CE0 File Offset: 0x0000EEE0
public override object Deserialize(StreamBuffer din, byte type)
{
if (type <= 42)
{
if (type == 0 || type == 42)
{
return null;
}
}
else
{
if (type == 68)
{
return this.DeserializeDictionary(din);
}
switch (type)
{
case 97:
return this.DeserializeStringArray(din);
case 98:
return this.DeserializeByte(din);
case 99:
{
byte b = (byte)din.ReadByte();
return this.DeserializeCustom(din, b);
}
case 100:
return this.DeserializeDouble(din);
case 101:
return this.DeserializeEventData(din);
case 102:
return this.DeserializeFloat(din);
case 104:
return this.DeserializeHashTable(din);
case 105:
return this.DeserializeInteger(din);
case 107:
return this.DeserializeShort(din);
case 108:
return this.DeserializeLong(din);
case 110:
return this.DeserializeIntArray(din);
case 111:
return this.DeserializeBoolean(din);
case 112:
return this.DeserializeOperationResponse(din);
case 113:
return this.DeserializeOperationRequest(din);
case 115:
return this.DeserializeString(din);
case 120:
return this.DeserializeByteArray(din);
case 121:
return this.DeserializeArray(din);
case 122:
return this.DeserializeObjectArray(din);
}
}
throw new Exception(string.Concat(new object[]
{
"Deserialize(): ",
type,
" pos: ",
din.Position,
" bytes: ",
din.Length,
". ",
SupportClass.ByteArrayToString(din.GetBuffer())
}));
}
// Token: 0x060001FC RID: 508 RVA: 0x00010F10 File Offset: 0x0000F110
public override byte DeserializeByte(StreamBuffer din)
{
return (byte)din.ReadByte();
}
// Token: 0x060001FD RID: 509 RVA: 0x00010F2C File Offset: 0x0000F12C
private bool DeserializeBoolean(StreamBuffer din)
{
return din.ReadByte() != 0;
}
// Token: 0x060001FE RID: 510 RVA: 0x00010F48 File Offset: 0x0000F148
public override short DeserializeShort(StreamBuffer din)
{
byte[] array = this.memShort;
short num;
lock (array)
{
byte[] array2 = this.memShort;
din.Read(array2, 0, 2);
num = (short)(((int)array2[0] << 8) | (int)array2[1]);
}
return num;
}
// Token: 0x060001FF RID: 511 RVA: 0x00010F9C File Offset: 0x0000F19C
private int DeserializeInteger(StreamBuffer din)
{
byte[] array = this.memInteger;
int num;
lock (array)
{
byte[] array2 = this.memInteger;
din.Read(array2, 0, 4);
num = ((int)array2[0] << 24) | ((int)array2[1] << 16) | ((int)array2[2] << 8) | (int)array2[3];
}
return num;
}
// Token: 0x06000200 RID: 512 RVA: 0x00011000 File Offset: 0x0000F200
private long DeserializeLong(StreamBuffer din)
{
byte[] array = this.memLong;
long num;
lock (array)
{
byte[] array2 = this.memLong;
din.Read(array2, 0, 8);
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
num = (long)(((ulong)array2[0] << 56) | ((ulong)array2[1] << 48) | ((ulong)array2[2] << 40) | ((ulong)array2[3] << 32) | ((ulong)array2[4] << 24) | ((ulong)array2[5] << 16) | ((ulong)array2[6] << 8) | (ulong)array2[7]);
}
else
{
num = BitConverter.ToInt64(array2, 0);
}
}
return num;
}
// Token: 0x06000201 RID: 513 RVA: 0x0001109C File Offset: 0x0000F29C
private float DeserializeFloat(StreamBuffer din)
{
byte[] array = this.memFloat;
float num;
lock (array)
{
byte[] array2 = this.memFloat;
din.Read(array2, 0, 4);
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
byte b = array2[0];
byte b2 = array2[1];
array2[0] = array2[3];
array2[1] = array2[2];
array2[2] = b2;
array2[3] = b;
}
num = BitConverter.ToSingle(array2, 0);
}
return num;
}
// Token: 0x06000202 RID: 514 RVA: 0x00011118 File Offset: 0x0000F318
private double DeserializeDouble(StreamBuffer din)
{
byte[] array = this.memDouble;
double num;
lock (array)
{
byte[] array2 = this.memDouble;
din.Read(array2, 0, 8);
bool isLittleEndian = BitConverter.IsLittleEndian;
if (isLittleEndian)
{
byte b = array2[0];
byte b2 = array2[1];
byte b3 = array2[2];
byte b4 = array2[3];
array2[0] = array2[7];
array2[1] = array2[6];
array2[2] = array2[5];
array2[3] = array2[4];
array2[4] = b4;
array2[5] = b3;
array2[6] = b2;
array2[7] = b;
}
num = BitConverter.ToDouble(array2, 0);
}
return num;
}
// Token: 0x06000203 RID: 515 RVA: 0x000111B4 File Offset: 0x0000F3B4
private string DeserializeString(StreamBuffer din)
{
short num = this.DeserializeShort(din);
bool flag = num == 0;
string text;
if (flag)
{
text = string.Empty;
}
else
{
bool flag2 = this.memString == null || this.memString.Length < (int)num;
if (flag2)
{
this.memString = new byte[(int)num];
}
din.Read(this.memString, 0, (int)num);
text = Encoding.UTF8.GetString(this.memString, 0, (int)num);
}
return text;
}
// Token: 0x06000204 RID: 516 RVA: 0x00011228 File Offset: 0x0000F428
private Array DeserializeArray(StreamBuffer din)
{
short num = this.DeserializeShort(din);
byte b = (byte)din.ReadByte();
bool flag = b == 121;
Array array2;
if (flag)
{
Array array = this.DeserializeArray(din);
Type type = array.GetType();
array2 = Array.CreateInstance(type, (int)num);
array2.SetValue(array, 0);
for (short num2 = 1; num2 < num; num2 += 1)
{
array = this.DeserializeArray(din);
array2.SetValue(array, (int)num2);
}
}
else
{
bool flag2 = b == 120;
if (flag2)
{
array2 = Array.CreateInstance(typeof(byte[]), (int)num);
for (short num3 = 0; num3 < num; num3 += 1)
{
Array array3 = this.DeserializeByteArray(din);
array2.SetValue(array3, (int)num3);
}
}
else
{
bool flag3 = b == 99;
if (flag3)
{
byte b2 = (byte)din.ReadByte();
CustomType customType;
bool flag4 = Protocol.CodeDict.TryGetValue(b2, out customType);
if (!flag4)
{
throw new Exception("Cannot find deserializer for custom type: " + b2);
}
array2 = Array.CreateInstance(customType.Type, (int)num);
for (int i = 0; i < (int)num; i++)
{
short num4 = this.DeserializeShort(din);
bool flag5 = customType.DeserializeStreamFunction == null;
if (flag5)
{
byte[] array4 = new byte[(int)num4];
din.Read(array4, 0, (int)num4);
array2.SetValue(customType.DeserializeFunction(array4), i);
}
else
{
array2.SetValue(customType.DeserializeStreamFunction(din, num4), i);
}
}
}
else
{
bool flag6 = b == 68;
if (flag6)
{
Array array5 = null;
this.DeserializeDictionaryArray(din, num, out array5);
return array5;
}
array2 = this.CreateArrayByType(b, num);
for (short num5 = 0; num5 < num; num5 += 1)
{
array2.SetValue(this.Deserialize(din, b), (int)num5);
}
}
}
}
return array2;
}
// Token: 0x06000205 RID: 517 RVA: 0x0001142C File Offset: 0x0000F62C
private byte[] DeserializeByteArray(StreamBuffer din)
{
int num = this.DeserializeInteger(din);
byte[] array = new byte[num];
din.Read(array, 0, num);
return array;
}
// Token: 0x06000206 RID: 518 RVA: 0x00011458 File Offset: 0x0000F658
private int[] DeserializeIntArray(StreamBuffer din)
{
int num = this.DeserializeInteger(din);
int[] array = new int[num];
for (int i = 0; i < num; i++)
{
array[i] = this.DeserializeInteger(din);
}
return array;
}
// Token: 0x06000207 RID: 519 RVA: 0x00011498 File Offset: 0x0000F698
private string[] DeserializeStringArray(StreamBuffer din)
{
int num = (int)this.DeserializeShort(din);
string[] array = new string[num];
for (int i = 0; i < num; i++)
{
array[i] = this.DeserializeString(din);
}
return array;
}
// Token: 0x06000208 RID: 520 RVA: 0x000114D8 File Offset: 0x0000F6D8
private object[] DeserializeObjectArray(StreamBuffer din)
{
short num = this.DeserializeShort(din);
object[] array = new object[(int)num];
for (int i = 0; i < (int)num; i++)
{
byte b = (byte)din.ReadByte();
array[i] = this.Deserialize(din, b);
}
return array;
}
// Token: 0x06000209 RID: 521 RVA: 0x00011524 File Offset: 0x0000F724
private Hashtable DeserializeHashTable(StreamBuffer din)
{
int num = (int)this.DeserializeShort(din);
Hashtable hashtable = new Hashtable(num);
for (int i = 0; i < num; i++)
{
object obj = this.Deserialize(din, (byte)din.ReadByte());
object obj2 = this.Deserialize(din, (byte)din.ReadByte());
hashtable[obj] = obj2;
}
return hashtable;
}
// Token: 0x0600020A RID: 522 RVA: 0x00011588 File Offset: 0x0000F788
private IDictionary DeserializeDictionary(StreamBuffer din)
{
byte b = (byte)din.ReadByte();
byte b2 = (byte)din.ReadByte();
int num = (int)this.DeserializeShort(din);
bool flag = b == 0 || b == 42;
bool flag2 = b2 == 0 || b2 == 42;
Type typeOfCode = this.GetTypeOfCode(b);
Type typeOfCode2 = this.GetTypeOfCode(b2);
Type type = typeof(Dictionary<, >).MakeGenericType(new Type[] { typeOfCode, typeOfCode2 });
IDictionary dictionary = Activator.CreateInstance(type) as IDictionary;
for (int i = 0; i < num; i++)
{
object obj = this.Deserialize(din, flag ? ((byte)din.ReadByte()) : b);
object obj2 = this.Deserialize(din, flag2 ? ((byte)din.ReadByte()) : b2);
dictionary.Add(obj, obj2);
}
return dictionary;
}
// Token: 0x0600020B RID: 523 RVA: 0x00011664 File Offset: 0x0000F864
private bool DeserializeDictionaryArray(StreamBuffer din, short size, out Array arrayResult)
{
byte b;
byte b2;
Type type = this.DeserializeDictionaryType(din, out b, out b2);
arrayResult = Array.CreateInstance(type, (int)size);
for (short num = 0; num < size; num += 1)
{
IDictionary dictionary = Activator.CreateInstance(type) as IDictionary;
bool flag = dictionary == null;
if (flag)
{
return false;
}
short num2 = this.DeserializeShort(din);
for (int i = 0; i < (int)num2; i++)
{
bool flag2 = b > 0;
object obj;
if (flag2)
{
obj = this.Deserialize(din, b);
}
else
{
byte b3 = (byte)din.ReadByte();
obj = this.Deserialize(din, b3);
}
bool flag3 = b2 > 0;
object obj2;
if (flag3)
{
obj2 = this.Deserialize(din, b2);
}
else
{
byte b4 = (byte)din.ReadByte();
obj2 = this.Deserialize(din, b4);
}
dictionary.Add(obj, obj2);
}
arrayResult.SetValue(dictionary, (int)num);
}
return true;
}
// Token: 0x0600020C RID: 524 RVA: 0x00011760 File Offset: 0x0000F960
private Type DeserializeDictionaryType(StreamBuffer reader, out byte keyTypeCode, out byte valTypeCode)
{
keyTypeCode = (byte)reader.ReadByte();
valTypeCode = (byte)reader.ReadByte();
Protocol16.GpType gpType = (Protocol16.GpType)keyTypeCode;
Protocol16.GpType gpType2 = (Protocol16.GpType)valTypeCode;
bool flag = gpType == Protocol16.GpType.Unknown;
Type type;
if (flag)
{
type = typeof(object);
}
else
{
type = this.GetTypeOfCode(keyTypeCode);
}
bool flag2 = gpType2 == Protocol16.GpType.Unknown;
Type type2;
if (flag2)
{
type2 = typeof(object);
}
else
{
type2 = this.GetTypeOfCode(valTypeCode);
}
return typeof(Dictionary<, >).MakeGenericType(new Type[] { type, type2 });
}
// Token: 0x04000120 RID: 288
private readonly byte[] versionBytes = new byte[] { 1, 6 };
// Token: 0x04000121 RID: 289
private readonly byte[] memShort = new byte[2];
// Token: 0x04000122 RID: 290
private readonly long[] memLongBlock = new long[1];
// Token: 0x04000123 RID: 291
private readonly byte[] memLongBlockBytes = new byte[8];
// Token: 0x04000124 RID: 292
private static readonly float[] memFloatBlock = new float[1];
// Token: 0x04000125 RID: 293
private static readonly byte[] memFloatBlockBytes = new byte[4];
// Token: 0x04000126 RID: 294
private readonly double[] memDoubleBlock = new double[1];
// Token: 0x04000127 RID: 295
private readonly byte[] memDoubleBlockBytes = new byte[8];
// Token: 0x04000128 RID: 296
private readonly byte[] memInteger = new byte[4];
// Token: 0x04000129 RID: 297
private readonly byte[] memLong = new byte[8];
// Token: 0x0400012A RID: 298
private readonly byte[] memFloat = new byte[4];
// Token: 0x0400012B RID: 299
private readonly byte[] memDouble = new byte[8];
// Token: 0x0400012C RID: 300
private byte[] memString;
// Token: 0x02000049 RID: 73
public enum GpType : byte
{
// Token: 0x040001B0 RID: 432
Unknown,
// Token: 0x040001B1 RID: 433
Array = 121,
// Token: 0x040001B2 RID: 434
Boolean = 111,
// Token: 0x040001B3 RID: 435
Byte = 98,
// Token: 0x040001B4 RID: 436
ByteArray = 120,
// Token: 0x040001B5 RID: 437
ObjectArray = 122,
// Token: 0x040001B6 RID: 438
Short = 107,
// Token: 0x040001B7 RID: 439
Float = 102,
// Token: 0x040001B8 RID: 440
Dictionary = 68,
// Token: 0x040001B9 RID: 441
Double = 100,
// Token: 0x040001BA RID: 442
Hashtable = 104,
// Token: 0x040001BB RID: 443
Integer,
// Token: 0x040001BC RID: 444
IntegerArray = 110,
// Token: 0x040001BD RID: 445
Long = 108,
// Token: 0x040001BE RID: 446
String = 115,
// Token: 0x040001BF RID: 447
StringArray = 97,
// Token: 0x040001C0 RID: 448
Custom = 99,
// Token: 0x040001C1 RID: 449
Null = 42,
// Token: 0x040001C2 RID: 450
EventData = 101,
// Token: 0x040001C3 RID: 451
OperationRequest = 113,
// Token: 0x040001C4 RID: 452
OperationResponse = 112
}
}
}