private void InitialiseFromStream(Stream str) { protocolVersion = MagicNumberToProtocolVersion((short)str.ReadByte()); if (protocolVersion == WaveProtocolVersion.Version4) { messageSize = str.ReadInteger24(); } else { messageSize = str.ReadShort(); } applicationID = (byte)str.ReadByte(); messageID = (short)str.ReadByte(); short numberOfFields = str.ReadShort(); byte extras = 0; int extendedHeaderLength = 0; bool isCompressed = false; if (protocolVersion == WaveProtocolVersion.Version4) { extras = (byte)str.ReadByte(); } isCompressed = ((extras & CompressedDataFlag) == CompressedDataFlag); extendedHeaderLength = extras >> 4; if (extendedHeaderLength > 0) { str.Seek(extendedHeaderLength, SeekOrigin.Current); } if (isCompressed) { // get size of data when uncompressed int uncompressedSize = str.ReadInteger24(); // calculate size of compressed data int compressedSize = messageSize; if (protocolVersion == WaveProtocolVersion.Version4) { compressedSize -= HeaderSizeV4; } else { compressedSize -= HeaderSizeV3; } compressedSize -= extendedHeaderLength; compressedSize -= 3; // size of uncompressedSize // uncompress byte[] compressedData = str.ReadBytes(compressedSize); if (compressedData != null) { byte[] uncompressedMessage = CompressionHelper.DeflateBuffer(compressedData); using (MemoryStream mem = new MemoryStream(uncompressedMessage)) rootList = new FieldList(mem, numberOfFields); } } else { rootList = new FieldList(str, numberOfFields); } }
public void AddFieldList(FieldList list) { rootList.Add(list); }
public WaveMessage() { rootList = new FieldList(); }
private void ReadFromStream(Stream str, short numberOfFields) { if (numberOfFields <= 0) { return; } for (int i = 0; i < numberOfFields; i++) { // start with the field type int b1 = str.ReadByte(); FieldType fType = (FieldType)(b1 >> 4); short wID = (short)((b1 & 0x000F) << 8); wID |= (short)str.ReadByte(); switch (fType) { case FieldType.Int16: fields.Add(new Int16Field(wID, str)); break; case FieldType.Int32: fields.Add(new Int32Field(wID, str)); break; case FieldType.Bool: fields.Add(new BooleanField(wID, str)); break; case FieldType.Double: fields.Add(new DoubleField(wID, str)); break; case FieldType.Byte: fields.Add(new ByteField(wID, str)); break; case FieldType.Binary: fields.Add(new BinaryField(wID, str)); break; case FieldType.DateTime: fields.Add(new DateTimeField(wID, str)); break; case FieldType.LongBinary: fields.Add(new LongBinaryField(wID, str)); break; case FieldType.String: fields.Add(new StringField(wID, str)); break; case FieldType.FieldList: fields.Add(FieldList.CreateField(wID, str, str.ReadShort())); break; default: DebugHelper.Out("Unsupported field type: {0}", (int)fType); break; } } }