Esempio n. 1
0
        public void TestFixedArrayHeader()
        {
            MsgPackWriter writer = new MsgPackWriter(Allocator.Temp);

            writer.WriteArrayHeader(0);
            writer.WriteArrayHeader(0xF);

            var asArray = writer.ToArray(Allocator.Temp);

            Assert.That(asArray.Length, Is.EqualTo(2));    // such small numbers should be stored as fixed numbers

            MsgPackReader reader = new MsgPackReader(asArray);

            Assert.That(reader.ReadArrayHeader(out var len1), Is.True);
            Assert.That(len1, Is.EqualTo(0));

            Assert.That(reader.ReadArrayHeader(out var len2), Is.True);
            Assert.That(len2, Is.EqualTo(0xF));
        }
        private Message ReadCompletion(MsgPackReader reader)
        {
            // https://github.com/aspnet/AspNetCore/blob/master/src/SignalR/docs/specs/HubProtocol.md#completion-message-encoding-1

            ReadHeaders(reader);
            string invocationId = reader.ReadString();
            byte   resultKind   = reader.ReadByte();

            switch (resultKind)
            {
            // 1 - Error result - Result contains a String with the error message
            case 1:
                string error = reader.ReadString();
                return(new Message
                {
                    type = MessageTypes.Completion,
                    invocationId = invocationId,
                    error = error
                });

            // 2 - Void result - Result is absent
            case 2:
                return(new Message
                {
                    type = MessageTypes.Completion,
                    invocationId = invocationId
                });

            // 3 - Non-Void result - Result contains the value returned by the server
            case 3:
                object item = ReadItem(reader, invocationId);
                return(new Message
                {
                    type = MessageTypes.Completion,
                    invocationId = invocationId,
                    item = item,
                    result = item
                });

            default:
                throw new NotImplementedException("Unknown resultKind: " + resultKind);
            }
        }
        public static Sphere ReadSphere(this MsgPackReader reader)
        {
            var sphere = new Sphere();

            reader.ReadPrefix(TypePrefixes.FixMap);
            for (int i = 0; i < 2; i++)
            {
                var key = reader.ReadString();
                switch (key)
                {
                case "center": sphere.Center = reader.ReadPoint3d(); break;

                case "radius": sphere.Radius = reader.ReadDouble(); break;

                default: throw new InvalidOperationException(Resources.ParseError);
                }
            }
            return(sphere);
        }
        private TreeNode CreateNode(MsgPackReader reader)
        {
            var formatName = GetFormatName(reader.Format);

            var text = GetNodeText(reader);

            var tooltip = String.Format("{0} ({1:x2}) ({2} bytes)", formatName, reader.FormatByte, reader.TotalSize);

            if (reader.IsExtended)
            {
                tooltip += String.Format(" (Extended Type {0})", reader.ExtendedType);
            }
            else if ((reader.ContentSize > 0) && (reader.ContentSize <= 32) && !reader.IsBinary)
            {
                tooltip += " " + GetHex(reader.ContentBytes);
            }

            return(CreateNode(text, tooltip));
        }
        private Message ReadClose(MsgPackReader reader)
        {
            // https://github.com/aspnet/AspNetCore/blob/master/src/SignalR/docs/specs/HubProtocol.md#close-message-encoding-1

            string error          = reader.ReadString();
            bool   allowReconnect = false;

            try
            {
                allowReconnect = reader.ReadBoolean();
            }
            catch { }

            return(new Message
            {
                type = MessageTypes.Close,
                error = error,
                allowReconnect = allowReconnect
            });
        }
        private Message ReadInvocation(MsgPackReader reader)
        {
            // https://github.com/aspnet/AspNetCore/blob/master/src/SignalR/docs/specs/HubProtocol.md#invocation-message-encoding-1

            ReadHeaders(reader);
            string invocationId = reader.ReadString();
            string target       = reader.ReadString();

            object[] arguments = ReadArguments(reader, target);
            string[] streamIds = ReadStreamIds(reader);

            return(new Message
            {
                type = MessageTypes.Invocation,
                invocationId = invocationId,
                target = target,
                arguments = arguments,
                streamIds = streamIds
            });
        }
        public static Ellipse ReadEllipse(this MsgPackReader reader)
        {
            var ellipse = new Ellipse();

            reader.ReadPrefix(TypePrefixes.FixMap);
            for (int i = 0; i < 3; i++)
            {
                var key = reader.ReadString();
                switch (key)
                {
                case "center": ellipse.Center = reader.ReadPoint2d(); break;

                case "angle": ellipse.Angle = reader.ReadDouble(); break;

                case "axes": ellipse.Axes = reader.ReadPoint2d(); break;

                default: throw new InvalidOperationException(Resources.ParseError);
                }
            }
            return(ellipse);
        }
        public static Circle3d ReadCircle3d(this MsgPackReader reader)
        {
            var circle = new Circle3d();

            reader.ReadPrefix(TypePrefixes.FixMap);
            for (int i = 0; i < 3; i++)
            {
                var key = reader.ReadString();
                switch (key)
                {
                case "center": circle.Center = reader.ReadPoint3d(); break;

                case "radius": circle.Radius = reader.ReadDouble(); break;

                case "normal": circle.Normal = reader.ReadPoint3d(); break;

                default: throw new InvalidOperationException(Resources.ParseError);
                }
            }
            return(circle);
        }
Esempio n. 9
0
        public static object Deserialize(Type objectType, Stream msgPackInput, SerializationContext context)
        {
            if (objectType == null)
            {
                throw new ArgumentNullException("objectType");
            }
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (msgPackInput == null)
            {
                throw new ArgumentNullException("msgPackInput");
            }
            if (!msgPackInput.CanRead)
            {
                throw JsonSerializationException.StreamIsNotReadable();
            }

            var reader = new MsgPackReader(msgPackInput, context);

            return(reader.ReadValue(objectType, false));
        }
Esempio n. 10
0
        private object[] ReadArguments(MsgPackReader reader, string target)
        {
            var subscription = this.Connection.GetSubscription(target);

            object[] args;
            if (subscription == null || subscription.callbacks == null || subscription.callbacks.Count == 0)
            {
                args = reader.ReadValue(typeof(object[])) as object[];
            }
            else
            {
                reader.NextToken();

                args = new object[subscription.callbacks[0].ParamTypes.Length];
                for (int i = 0; i < subscription.callbacks[0].ParamTypes.Length; ++i)
                {
                    args[i] = reader.ReadValue(subscription.callbacks[0].ParamTypes[i]);
                }

                reader.NextToken();
            }

            return(args);
        }
Esempio n. 11
0
        public IncomingPacket Parse(SocketManager manager, BufferSegment data, TransportEventTypes transportEvent = TransportEventTypes.Unknown)
        {
            using (var stream = new System.IO.MemoryStream(data.Data, data.Offset, data.Count))
            {
                var buff = BufferPool.Get(MsgPackReader.DEFAULT_BUFFER_SIZE, true);
                try
                {
                    var context = new SerializationContext
                    {
                        Options = SerializationOptions.SuppressTypeInformation/*,
                                                                               * ExtensionTypeHandler = CustomMessagePackExtensionTypeHandler.Instance*/
                    };
                    IJsonReader reader = new MsgPackReader(stream, context, Endianness.BigEndian, buff);

                    reader.ReadObjectBegin();

                    int    type = -1, id = -1;
                    string nsp = null;

                    bool hasData = false, readData = false;

                    IncomingPacket packet = IncomingPacket.Empty;

READ:

                    while (reader.Token != JsonToken.EndOfObject)
                    {
                        string key = reader.ReadMember();

                        switch (key)
                        {
                        case "type":
                            type = reader.ReadByte();
                            break;

                        case "nsp":
                            nsp = reader.ReadString();
                            break;

                        case "id":
                            id = reader.ReadInt32();
                            break;

                        case "data":
                            if (!hasData)
                            {
                                hasData = true;
                                SkipData(reader, (SocketIOEventTypes)type);
                            }
                            else
                            {
                                readData = true;

                                packet = new IncomingPacket(transportEvent != TransportEventTypes.Unknown ? transportEvent : TransportEventTypes.Message, (SocketIOEventTypes)type, nsp, id);
                                (string eventName, object[] args) = ReadData(manager, packet, reader);

                                packet.EventName = eventName;
                                if (args != null)
                                {
                                    if (args.Length == 1)
                                    {
                                        packet.DecodedArg = args[0];
                                    }
                                    else
                                    {
                                        packet.DecodedArgs = args;
                                    }
                                }
                            }
                            break;
                        }
                    }

                    // type, nsp, id and data can come in any order. To read data strongly typed we need to know all the additional fields before processing the data field.
                    // In order to do it, when we first encounter the data field we skip it than we do a reset and an additional turn but reading the data too now.
                    if (hasData && !readData)
                    {
                        reader.Reset();
                        stream.Position = 0;
                        reader.ReadObjectBegin();

                        goto READ;
                    }

                    reader.ReadObjectEnd();

                    return(packet.Equals(IncomingPacket.Empty) ? new IncomingPacket(transportEvent != TransportEventTypes.Unknown ? transportEvent : TransportEventTypes.Message, (SocketIOEventTypes)type, nsp, id) : packet);
                }
                finally
                {
                    BufferPool.Release(buff);
                }
            }
        }
 private Dictionary <string, string> ReadHeaders(MsgPackReader reader)
 {
     return(reader.ReadValue(typeof(Dictionary <string, string>)) as Dictionary <string, string>);
 }
 private string[] ReadStreamIds(MsgPackReader reader)
 {
     return(reader.ReadValue(typeof(string[])) as string[]);
 }
        private static string GetNodeText(MsgPackReader reader)
        {
            if (reader.IsArray)
                return String.Format("Array ({0} items)", reader.ChildObjectCount);
            if (reader.IsMap)
                return String.Format("Map ({0} items)", reader.ChildObjectCount/2);

            var value = reader.GetValue();
            if (value == null)
                return "null";

            var stringValue = value as string;
            if (stringValue != null)
                return "\"" + stringValue.Replace("\"", "\\\"").Replace("\0", "\\0") + "\"";

            var byteValue = value as byte[];
            if (byteValue != null)
                return GetHex(byteValue);

            return value.ToString();
        }
        private TreeNode CreateNode(MsgPackReader reader)
        {
            var formatName = GetFormatName(reader.Format);

            var text = GetNodeText(reader);

            var tooltip = String.Format("{0} ({1:x2}) ({2} bytes)", formatName, reader.FormatByte, reader.TotalSize);
            if (reader.IsExtended)
                tooltip += String.Format(" (Extended Type {0})", reader.ExtendedType);
            else if ((reader.ContentSize > 0) && (reader.ContentSize <= 32) && !reader.IsBinary)
                tooltip += " " + GetHex(reader.ContentBytes);

            return CreateNode(text, tooltip);
        }
        public void DisplayData(byte[] data)
        {
            Clear();

            TreeNode root = null;
            TreeNode parent = null;
            var remainingCountStack = new Stack<int>();
            var remainingCount = 1;

            using (var stream = new MemoryStream(data))
            using (var reader = new MsgPackReader(stream))
            {
                try
                {
                    while (reader.ReadNext())
                    {
                        var node = CreateNode(reader);
                        if (parent != null)
                            parent.Nodes.Add(node);
                        else
                        {
                            root = node;
                            parent = node;
                        }
                        remainingCount--;

                        if (reader.IsArray || reader.IsMap)
                        {
                            remainingCountStack.Push(remainingCount);
                            remainingCount = reader.ChildObjectCount;
                            parent = node;
                        }

                        while ((remainingCount == 0) && (remainingCountStack.Count > 0))
                        {
                            remainingCount = remainingCountStack.Pop();
                            parent = parent.Parent;
                        }
                        if ((remainingCount == 0) && (remainingCountStack.Count == 0))
                            break;
                    }

                    if (reader.ReadNext())
                        throw new Exception("content after the root node");
                }
                catch (Exception ex)
                {
                    var message = String.Format("Error at byte {0}: {1}", stream.Position, ex.Message);
                    var node = CreateNode(message, ex.ToString());
                    if (root == null)
                        root = node;
                    else
                        root.Nodes.Add(node);
                }
            }

            if (root != null)
            {
                tree.Nodes.Add(root);
                tree.ExpandAll();
                tree.SelectedNode = root;
            }
        }
Esempio n. 17
0
 void Test(WriteDelegate writeProc, ReadDelegate readProc, byte[] expectedBytes)
 {
     byte[] raw;
     using (MemoryStream ms = new MemoryStream ()) {
         MsgPackWriter writer = new MsgPackWriter (ms);
         writeProc (writer);
         raw = ms.ToArray ();
     }
     Assert.AreEqual (expectedBytes, raw, "pack failed");
     using (MemoryStream ms = new MemoryStream (raw)) {
         MsgPackReader reader = new MsgPackReader (ms);
         readProc (reader);
     }
 }
        public void DisplayData(byte[] data)
        {
            Clear();

            TreeNode root   = null;
            TreeNode parent = null;
            var      remainingCountStack = new Stack <int>();
            var      remainingCount      = 1;

            using (var stream = new MemoryStream(data))
                using (var reader = new MsgPackReader(stream))
                {
                    try
                    {
                        while (reader.ReadNext())
                        {
                            var node = CreateNode(reader);
                            if (parent != null)
                            {
                                parent.Nodes.Add(node);
                            }
                            else
                            {
                                root   = node;
                                parent = node;
                            }
                            remainingCount--;

                            if (reader.IsArray || reader.IsMap)
                            {
                                remainingCountStack.Push(remainingCount);
                                remainingCount = reader.ChildObjectCount;
                                parent         = node;
                            }

                            while ((remainingCount == 0) && (remainingCountStack.Count > 0))
                            {
                                remainingCount = remainingCountStack.Pop();
                                parent         = parent.Parent;
                            }
                            if ((remainingCount == 0) && (remainingCountStack.Count == 0))
                            {
                                break;
                            }
                        }

                        if (reader.ReadNext())
                        {
                            throw new Exception("content after the root node");
                        }
                    }
                    catch (Exception ex)
                    {
                        var message = String.Format("Error at byte {0}: {1}", stream.Position, ex.Message);
                        var node    = CreateNode(message, ex.ToString());
                        if (root == null)
                        {
                            root = node;
                        }
                        else
                        {
                            root.Nodes.Add(node);
                        }
                    }
                }

            if (root != null)
            {
                tree.Nodes.Add(root);
                tree.ExpandAll();
                tree.SelectedNode = root;
            }
        }
Esempio n. 19
0
 public void Reset(Stream _stream)
 {
     stream = _stream;
     structs_pos.Clear();
     io = new MsgPackReader(stream);
 }
Esempio n. 20
0
 public static string ReadString(this MsgPackReader reader)
 {
     reader.ReadPrefix(TypePrefixes.FixRaw);
     return(reader.ReadRawString());
 }