Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }