Example #1
0
        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));
        }
Example #2
0
 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));
 }
Example #3
0
        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);
        }