示例#1
0
        /// <summary>
        /// Serialize item to byte list.
        /// </summary>
        /// <returns>The byte list.</returns>
        public List <byte> SerializeToByteList()
        {
            List <byte> byteList = new List <byte>();

            int lengthOfItems = this.SerializeItemsToByteList(byteList);

            StreamObjectHeaderStart header;

            if ((int)this.StreamObjectType <= 0x3F && lengthOfItems <= 127)
            {
                header = new StreamObjectHeaderStart16bit(this.StreamObjectType, lengthOfItems);
            }
            else
            {
                header = new StreamObjectHeaderStart32bit(this.StreamObjectType, lengthOfItems);
            }

            byteList.InsertRange(0, header.SerializeToByteList());

            if (CompoundTypes.Contains(this.StreamObjectType))
            {
                if ((int)this.StreamObjectType <= 0x3F)
                {
                    byteList.AddRange(new StreamObjectHeaderEnd8bit((int)this.StreamObjectType).SerializeToByteList());
                }
                else
                {
                    byteList.AddRange(new StreamObjectHeaderEnd16bit((int)this.StreamObjectType).SerializeToByteList());
                }
            }

            return(byteList);
        }
示例#2
0
        /// <summary>
        /// Used to return the length of this element.
        /// </summary>
        /// <param name="header">Then instance of StreamObjectHeaderStart.</param>
        /// <param name="byteArray">The byte list</param>
        /// <param name="startIndex">The position where to start.</param>
        /// <returns>The element length</returns>
        public int DeserializeFromByteArray(StreamObjectHeaderStart header, byte[] byteArray, int startIndex)
        {
            this.StreamObjectType = header.Type;
            this.LengthOfItems    = header.Length;

            if (header is StreamObjectHeaderStart32bit)
            {
                if (header.Length == 32767)
                {
                    this.LengthOfItems = (int)(header as StreamObjectHeaderStart32bit).LargeLength.DecodedValue;
                }
            }

            int index = startIndex;

            this.StreamObjectHeaderStart = header;
            this.DeserializeItemsFromByteArray(byteArray, ref index, this.LengthOfItems);

            if (CompoundTypes.Contains(this.StreamObjectType))
            {
                StreamObjectHeaderEnd end       = null;
                BitReader             bitReader = new BitReader(byteArray, index);
                int aField = bitReader.ReadInt32(2);
                if (aField == 0x1)
                {
                    end = BasicObject.Parse <StreamObjectHeaderEnd8bit>(byteArray, ref index);
                }
                if (aField == 0x3)
                {
                    end = BasicObject.Parse <StreamObjectHeaderEnd16bit>(byteArray, ref index);
                }

                if ((int)end.Type != (int)this.StreamObjectType)
                {
                    throw new StreamObjectParseErrorException(index, null, "Unexpected the stream header end value " + (int)this.StreamObjectType, null);
                }

                this.StreamObjectHeaderEnd = end;
            }

            // Capture all the type related requirements
            if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
            {
                new MsfsshttpbAdapterCapture().InvokeCaptureMethod(this.GetType(), this, SharedContext.Current.Site);
            }

            return(index - startIndex);
        }
示例#3
0
        public SchemaTypeBuilder(SchemaDocument document,
                                 ModuleBuilder moduleBuilder,
                                 SchemaBasicReaderBuilder basicBuilder)
        {
            Document = document;
            BasicTypeDescriptions = basicBuilder;

            CompoundTypes = document.Compounds
                            .ToDictionary(kvp => kvp.Value, kvp => BuildCompoundType(moduleBuilder, kvp.Value));
            NiObjectTypes = document.NiObjects
                            .ToDictionary(kvp => kvp.Value, kvp => BuildNiObjectType(moduleBuilder, kvp.Value));
            EnumTypes = document.Enums
                        .ToDictionary(kvp => kvp.Value, kvp => BuildEnumType(moduleBuilder, kvp.Value, document));
            BitFieldTypes = document.Bitfields
                            .ToDictionary(kvp => kvp.Value, kvp => BuildBitfieldType(moduleBuilder, kvp.Value));
            BitflagsTypes = document.Bitflags
                            .ToDictionary(kvp => kvp.Value, kvp => BuildBitflagType(moduleBuilder, kvp.Value, document));

            BuiltTypesByName = new List <(string, TypeBuilder)>()
                               .Concat(CompoundTypes.Select(kvp => (kvp.Key.Name, kvp.Value)))
                               .Concat(NiObjectTypes.Select(kvp => (kvp.Key.Name, kvp.Value)))
                               .Concat(BitFieldTypes.Select(kvp => (kvp.Key.Name, kvp.Value)))
                               .ToDictionary(pair => pair.Item1, pair => pair.Item2);
            BuiltEnumsByName = new List <(string, EnumBuilder)>()
                               .Concat(EnumTypes.Select(kvp => (kvp.Key.Name, kvp.Value)))
                               .Concat(BitflagsTypes.Select(kvp => (kvp.Key.Name, kvp.Value)))
                               .ToDictionary(pair => pair.Item1, pair => pair.Item2);

            SchemaTypesByName = new List <(string, Type)>()
                                .Concat(BasicTypeDescriptions.BasicDescriptions.Select(kvp => (kvp.Key.Name, kvp.Value.UnderlyingType)))
                                .Concat(BuiltTypesByName.Select(kvp => (kvp.Key, kvp.Value as Type)))
                                .Concat(BuiltEnumsByName.Select(kvp => (kvp.Key, kvp.Value as Type)))
                                .ToDictionary(pair => pair.Item1, pair => pair.Item2);
            TemplateTypeByName = CompoundTypes
                                 .ToDictionary(c => c.Key.Name, c => BuildTemplateType(c.Value, c.Key));
        }