Exemplo n.º 1
0
        public new static OscMessage Read(
            OscReader reader,
            int count,
            Uri origin         = null,
            OscTimeTag?timeTag = null)
        {
            reader.BeginMessage(count);

            OscMessage msg = new OscMessage
            {
                Origin    = origin,
                Timestamp = timeTag
            };

            msg.Address = reader.ReadAddress();

            if (reader.PeekToken() == OscToken.End)
            {
                msg.arguments = new object[0];

                return(msg);
            }

            OscTypeTag typeTag = reader.ReadTypeTag();

            msg.arguments = new object[reader.GetArgumentCount(ref typeTag, out OscToken argumentsType)];
Exemplo n.º 2
0
        private void ReadMessages(
            ArraySegment <byte> buffer,
            OscReader reader,
            int count,
            List <OscMessageRaw> messages,
            out OscTimeTag timestamp)
        {
            int start     = reader.Position;
            int bundleEnd = start + count;

            reader.BeginBundle(count);

            string ident = reader.ReadAddress();

            if (OscBundle.BundleIdent.Equals(ident, StringComparison.Ordinal) == false)
            {
                // this is an error
                throw new OscException(OscError.InvalidBundleIdent, $"Invalid bundle ident '{ident}'");
            }

            timestamp = reader.ReadBundleTimeTag();

            while (reader.Position < bundleEnd)
            {
                if (reader.Position + 4 > bundleEnd)
                {
                    // this is an error
                    throw new OscException(OscError.InvalidBundleMessageHeader, "Invalid bundle message header");
                }

                int messageLength = reader.ReadBundleMessageLength(start, count);

                if (reader.Position + messageLength > bundleEnd ||
                    messageLength < 0 ||
                    messageLength % 4 != 0)
                {
                    // this is an error
                    throw new OscException(OscError.InvalidBundleMessageLength, "Invalid bundle message length");
                }

                if (reader.PeekByte() == (byte)'#')
                {
                    ReadMessages(buffer, reader, messageLength, messages, out OscTimeTag _);
                }
                else
                {
                    messages.Add(new OscMessageRaw(new ArraySegment <byte>(buffer.Array, buffer.Offset + reader.Position, messageLength), Origin, timestamp));

                    reader.Position += messageLength;
                }
            }
        }
Exemplo n.º 3
0
        public static OscBundle Read(OscReader reader, int count, Uri origin = null)
        {
            OscBundle bundle = new OscBundle
            {
                Origin = origin
            };

            int start     = reader.Position;
            int bundleEnd = start + count;

            reader.BeginBundle(count);

            string ident = reader.ReadAddress();

            if (BundleIdent.Equals(ident, StringComparison.Ordinal) == false)
            {
                // this is an error
                throw new OscException(OscError.InvalidBundleIdent, $"Invalid bundle ident '{ident}'");
            }

            bundle.Timestamp = reader.ReadBundleTimeTag();

            List <OscPacket> messages = new List <OscPacket>();

            while (reader.Position < bundleEnd)
            {
                if (reader.Position + 4 > bundleEnd)
                {
                    // this is an error
                    throw new OscException(OscError.InvalidBundleMessageHeader, "Invalid bundle message header");
                }

                int messageLength = reader.ReadBundleMessageLength(start, count);

                if (reader.Position + messageLength > bundleEnd ||
                    messageLength < 0 ||
                    messageLength % 4 != 0)
                {
                    // this is an error
                    throw new OscException(OscError.InvalidBundleMessageLength, "Invalid bundle message length");
                }

                messages.Add(Read(reader, messageLength, origin, bundle.Timestamp));
            }

            bundle.packets = messages.ToArray();

            return(bundle);
        }
Exemplo n.º 4
0
        public OscMessageRaw(ArraySegment <byte> buffer, Uri origin = null, OscTimeTag?timestamp = null)
        {
            Origin    = origin;
            Timestamp = timestamp;

            reader = new OscReader(buffer);

            reader.BeginMessage(buffer.Count);

            Address = reader.ReadAddress();

            if (reader.PeekToken() == OscToken.End)
            {
                arguments = new OscArgument[0];

                return;
            }

            OscTypeTag typeTag = reader.ReadTypeTag();

            arguments = new OscArgument[reader.GetArgumentCount(ref typeTag, out OscToken argumentsType)];