support TL bare vectors

This commit is contained in:
Wizou 2021-09-24 12:29:04 +02:00
parent be4d1aca6b
commit c570f3d8d0

View file

@ -154,15 +154,27 @@ namespace TL
internal static Array ReadTLVector(this BinaryReader reader, Type type) internal static Array ReadTLVector(this BinaryReader reader, Type type)
{ {
var ctorNb = reader.ReadUInt32();
if (ctorNb != Layer.VectorCtor) throw new ApplicationException($"Cannot deserialize {type.Name} with ctor #{ctorNb:x}");
var elementType = type.GetElementType(); var elementType = type.GetElementType();
uint ctorNb = reader.ReadUInt32();
if (ctorNb == Layer.VectorCtor)
{
int count = reader.ReadInt32(); int count = reader.ReadInt32();
Array array = (Array)Activator.CreateInstance(type, count); Array array = (Array)Activator.CreateInstance(type, count);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
array.SetValue(reader.ReadTLValue(elementType), i); array.SetValue(reader.ReadTLValue(elementType), i);
return array; return array;
} }
else if (ctorNb < 1024 && !elementType.IsAbstract && elementType.GetCustomAttribute<TLDefAttribute>() is TLDefAttribute attr)
{
int count = (int)ctorNb;
Array array = (Array)Activator.CreateInstance(type, count);
for (int i = 0; i < count; i++)
array.SetValue(reader.ReadTLObject(attr.CtorNb), i);
return array;
}
else
throw new ApplicationException($"Cannot deserialize {type.Name} with ctor #{ctorNb:x}");
}
internal static void WriteTLStamp(this BinaryWriter writer, DateTime datetime) internal static void WriteTLStamp(this BinaryWriter writer, DateTime datetime)
=> writer.Write((uint)(datetime.ToUniversalTime().Ticks / 10000000 - 62135596800L)); => writer.Write((uint)(datetime.ToUniversalTime().Ticks / 10000000 - 62135596800L));