public static NominalStructTypeDescriptor FromStream(Stream stm, TLNominalTypeDescriptor tlNom, TLDirectMetadata tlMet, int sizeofMachinePointer) { if (sizeofMachinePointer != 4 && sizeofMachinePointer != 8) { throw ErrorHelper.CreateError(ReflectorError.kCantHappenBase + 12, $"was expecting a machine pointer size of either 4 or 8, but got {sizeofMachinePointer}"); } var reader = new BinaryReader(stm); reader.BaseStream.Seek((long)tlNom.Offset, SeekOrigin.Begin); string mangledName = ReadRelativeString(reader); uint fieldCount = reader.ReadUInt32(); uint fieldOffsetVectorOffset = reader.ReadUInt32(); var fieldNames = ReadRelativeStringArray(reader, fieldCount); var fieldOffsets = ReadFieldOffsets(reader, tlMet, sizeofMachinePointer, fieldOffsetVectorOffset, fieldCount); return(new NominalStructTypeDescriptor(mangledName, fieldCount, fieldOffsetVectorOffset, fieldNames, fieldOffsets)); }
static List <ulong> ReadFieldOffsets(BinaryReader reader, TLDirectMetadata tlMet, int sizeofMachinePointer, uint fieldOffsetVectorOffset, uint fieldCount) { reader.BaseStream.Seek((long)tlMet.Offset + (fieldOffsetVectorOffset * sizeofMachinePointer), SeekOrigin.Begin); return(ReadMachinePointers(reader, sizeofMachinePointer, fieldCount)); }
public void Add(TLDefinition tld, Stream srcStm) { TLFunction tlf = tld as TLFunction; if (tlf != null) { if (ClassContents.IsWitnessTable(tlf.Signature, tlf.Class)) { WitnessTable.Add(tlf, srcStm); } FunctionsOfUnknownDestination.Add(tlf); return; } TLDirectMetadata meta = tld as TLDirectMetadata; if (meta != null) { if (DirectMetadata != null) { throw ErrorHelper.CreateError(ReflectorError.kInventoryBase + 1, $"duplicate direct metadata in protocol {DirectMetadata.Class.ClassName.ToFullyQualifiedName ()}"); } DirectMetadata = meta; return; } TLMetaclass mc = tld as TLMetaclass; if (mc != null) { if (Metaclass != null) { throw ErrorHelper.CreateError(ReflectorError.kInventoryBase + 2, $"duplicate type meta data descriptor in protocol {Metaclass.Class.ClassName.ToFullyQualifiedName ()}"); } Metaclass = mc; return; } TLProtocolTypeDescriptor ptd = tld as TLProtocolTypeDescriptor; if (ptd != null) { if (TypeDescriptor != null) { throw ErrorHelper.CreateError(ReflectorError.kInventoryBase + 3, $"duplicate protocol type descriptor in protocol {TypeDescriptor.Class.ClassName.ToFullyQualifiedName ()}"); } TypeDescriptor = ptd; return; } if (tld is TLProtocolRequirementsBaseDescriptor baseDescriptor) { BaseDescriptors.Add(baseDescriptor); return; } if (tld is TLBaseConformanceDescriptor baseConformanceDescriptor) { BaseConformanceDescriptors.Add(baseConformanceDescriptor); return; } DefinitionsOfUnknownDestination.Add(tld); }