/// <summary> /// Parses the embedded message from within a base message /// </summary> /// <param name="data"></param> /// <returns></returns> public static object[] ParseEmbeddedMessages(byte[] data) { var fs = new MemoryStream(data); var messages = new LinkedList <object>(); while (fs.Position < fs.Length) { ulong kind = DemParser.ReadVarInt(fs); ulong size = DemParser.ReadVarInt(fs); var buf = new byte[size]; fs.Read(buf, 0, (int)size); object message = RuntimeTypeModel.Default.Deserialize(new MemoryStream(buf), null, DemParser.EmbeddedTypeMap[kind]); messages.AddLast(message); } var array = new object[messages.Count]; messages.CopyTo(array, 0); return(array); }
/// <summary> /// Parses a base message and its embedded message (if required) /// </summary> /// <param name="fs"></param> /// <returns></returns> public static object ParseMessage(Stream fs) { ulong kind = DemParser.ReadVarInt(fs); ulong tick = DemParser.ReadVarInt(fs); ulong size = DemParser.ReadVarInt(fs); var buf = new byte[size]; fs.Read(buf, 0, (int)size); // decompress if needed bool isCompressed = (kind & DemParser.CompressedKindMask) != 0; if (isCompressed) { kind = kind - DemParser.CompressedKindMask; buf = Snappy.SnappyCodec.Uncompress(buf); } object message = RuntimeTypeModel.Default.Deserialize(new MemoryStream(buf), null, DemParser.BaseTypeMap[kind]); DemParser.PrintMessage(message, kind, tick, size, buf, isCompressed); return(message); }