/// <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); }
/// <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); }
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)); }