Beispiel #1
0
        public string ReadAddress(bool validate)
        {
            OscSerializationToken token = ReadNextToken(out string value);

            if (token != OscSerializationToken.Literal)
            {
                throw new OscException(OscError.ErrorParsingOscAdress, $"Unexpected serialization token {token}");
            }

            string address = value.Trim();

            if (validate != true)
            {
                return(address);
            }

            if (string.IsNullOrWhiteSpace(address))
            {
                throw new Exception("Address was empty");
            }

            if (OscAddress.IsValidAddressPattern(address) == false)
            {
                throw new Exception("Invalid address");
            }

            return(address);
        }
Beispiel #2
0
        public void WriteToken(OscSerializationToken token)
        {
            switch (token)
            {
            case OscSerializationToken.Separator:
                builder.Append(", ");
                break;

            case OscSerializationToken.ArrayStart:
                builder.Append("[ ");
                break;

            case OscSerializationToken.ArrayEnd:
                builder.Append(" ]");
                break;

            case OscSerializationToken.ObjectStart:
                builder.Append("{ ");
                break;

            case OscSerializationToken.ObjectEnd:
                builder.Append(" }");
                break;

            case OscSerializationToken.None:
            case OscSerializationToken.Literal:
            case OscSerializationToken.String:
            case OscSerializationToken.Symbol:
            case OscSerializationToken.Char:
            case OscSerializationToken.End:
            default:
                throw new ArgumentOutOfRangeException(nameof(token), token, null);
            }
        }
Beispiel #3
0
        public new static OscBundle Parse(ref OscStringReader reader, IFormatProvider provider = null, OscSerializationToken endToken = OscSerializationToken.End)
        {
            if (provider == null)
            {
                provider = CultureInfo.InvariantCulture;
            }

            string ident = reader.ReadAddress(false)
                           .Trim();

            if (BundleIdent.Equals(ident, StringComparison.Ordinal) == false)
            {
                throw new Exception($"Invalid bundle ident '{ident}'");
            }

            reader.ReadSeparator();

            if (reader.ReadNextToken(out string timeStampStr) != OscSerializationToken.Literal)
            {
                throw new Exception("Invalid bundle timestamp");
            }

            OscTimeTag timeStamp = OscTimeTag.Parse(timeStampStr.Trim(), provider);

            if (reader.ReadSeparatorOrEnd() == endToken)
            {
                return(new OscBundle(timeStamp));
            }

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

            OscSerializationToken token = OscSerializationToken.None;

            token = reader.ReadNextToken(out string _);

            while (token != endToken && token != OscSerializationToken.End)
            {
                if (token != OscSerializationToken.ObjectStart)
                {
                    throw new Exception("Invalid bundle token");
                }

                packets.Add(OscPacket.Parse(ref reader, provider, OscSerializationToken.ObjectEnd));

                token = reader.ReadNextToken(out string _);

                if (token == OscSerializationToken.Separator)
                {
                    token = reader.ReadNextToken(out string _);
                }
            }

            if (token != endToken)
            {
                throw new OscException(OscError.UnexpectedToken, $"Unexpected token {token}");
            }

            return(new OscBundle(timeStamp, packets.ToArray()));
        }
Beispiel #4
0
        private object[] ReadArray(IFormatProvider provider)
        {
            OscSerializationToken endToken = OscSerializationToken.ArrayEnd;

            List <object> arguments = new List <object>();

            OscSerializationToken token;

            do
            {
                token = ReadNextToken(out string value);

                switch (token)
                {
                case OscSerializationToken.Literal:
                    arguments.Add(ParseLiteral(value, provider));
                    break;

                case OscSerializationToken.String:
                    arguments.Add(ParseString(value, provider));
                    break;

                case OscSerializationToken.Symbol:
                    arguments.Add(ParseSymbol(value, provider));
                    break;

                case OscSerializationToken.Char:
                    arguments.Add(ParseChar(value, provider));
                    break;

                case OscSerializationToken.Separator:
                    break;

                case OscSerializationToken.ArrayStart:
                    arguments.Add(ReadArray(provider));
                    break;

                case OscSerializationToken.ArrayEnd:
                    break;

                case OscSerializationToken.ObjectStart:
                    arguments.Add(ParseObject(value, provider));
                    break;

                case OscSerializationToken.None:
                case OscSerializationToken.End:
                case OscSerializationToken.ObjectEnd:
                default:
                    throw new ArgumentOutOfRangeException();
                }
            }while (token != endToken && token != OscSerializationToken.End);

            if (token != endToken)
            {
                throw new OscException(OscError.UnexpectedToken, $"Unexpected token {token}");
            }

            return(arguments.ToArray());
        }
Beispiel #5
0
        public void ReadSeparator()
        {
            OscSerializationToken token = ReadNextToken(out string _);

            if (token != OscSerializationToken.Separator)
            {
                throw new OscException(OscError.ErrorParsingOscAdress, $"Unexpected serialization token {token}");
            }
        }
Beispiel #6
0
        public void Literal()
        {
            string original      = "hello";
            string expectedValue = "hello";
            OscSerializationToken expectedToken = OscSerializationToken.Literal;

            OscStringReader reader = new OscStringReader(original);

            OscSerializationToken token = reader.ReadNextToken(out string value);

            Assert.Equal(expectedToken, token);
            Assert.Equal(expectedValue, value);
        }
Beispiel #7
0
        public void End()
        {
            string original      = @"";
            string expectedValue = null;
            OscSerializationToken expectedToken = OscSerializationToken.End;

            OscStringReader reader = new OscStringReader(original);

            OscSerializationToken token = reader.ReadNextToken(out string value);

            Assert.Equal(expectedToken, token);
            Assert.Equal(expectedValue, value);
        }
Beispiel #8
0
        public void StringWithEscape()
        {
            string original      = @"""let's say \""hello\""""";
            string expectedValue = @"let's say \""hello\""";
            OscSerializationToken expectedToken = OscSerializationToken.String;

            OscStringReader reader = new OscStringReader(original);

            OscSerializationToken token = reader.ReadNextToken(out string value);

            Assert.Equal(expectedToken, token);
            Assert.Equal(expectedValue, value);
        }
Beispiel #9
0
        public OscSerializationToken ReadSeparatorOrEnd()
        {
            OscSerializationToken token = ReadNextToken(out string _);

            if (token != OscSerializationToken.Separator &&
                token != OscSerializationToken.ArrayEnd &&
                token != OscSerializationToken.ObjectEnd &&
                token != OscSerializationToken.End)
            {
                throw new OscException(OscError.ErrorParsingOscAdress, $"Unexpected serialization token {token}");
            }

            return(token);
        }
Beispiel #10
0
        public static OscColor Parse(ref OscStringReader reader, IFormatProvider provider)
        {
            string[] pieces = new string[4];

            OscSerializationToken token = OscSerializationToken.None;

            for (int i = 0; i < 4; i++)
            {
                token     = reader.ReadNextToken(out string value);
                pieces[i] = value;
                token     = reader.ReadNextToken(out string _);
            }

            if (token != OscSerializationToken.ObjectEnd)
            {
                throw new Exception("Invalid color");
            }

            byte a, r, g, b;

            r = byte.Parse(
                pieces[0]
                .Trim(),
                NumberStyles.None,
                provider
                );
            g = byte.Parse(
                pieces[1]
                .Trim(),
                NumberStyles.None,
                provider
                );
            b = byte.Parse(
                pieces[2]
                .Trim(),
                NumberStyles.None,
                provider
                );
            a = byte.Parse(
                pieces[3]
                .Trim(),
                NumberStyles.None,
                provider
                );

            return(FromArgb(a, r, g, b));
        }
Beispiel #11
0
        public new static OscMessage Parse(ref OscStringReader reader, IFormatProvider provider = null, OscSerializationToken endToken = OscSerializationToken.End)
        {
            string address = reader.ReadAddress(true);

            // parse arguments
            List <object> arguments = new List <object>(reader.ReadArguments(provider, endToken));

            return(new OscMessage(address, arguments.ToArray()));
        }
Beispiel #12
0
        public static OscPacket Parse(ref OscStringReader reader, IFormatProvider provider = null, OscSerializationToken endToken = OscSerializationToken.End)
        {
            if (reader.PeekChar() == '#')
            {
                return(OscBundle.Parse(ref reader, provider, endToken));
            }

            return(OscMessage.Parse(ref reader, provider, endToken));
        }
Beispiel #13
0
        private byte[] ParseBlob(IFormatProvider provider)
        {
            OscSerializationToken token = ReadNextToken(out string value);

            if (token == OscSerializationToken.ObjectEnd)
            {
                return(new byte[0]);
            }

            if (token == OscSerializationToken.Literal)
            {
                string trimmed = value.Trim();

                if (trimmed.StartsWith("64x"))
                {
                    byte[] bytes = Convert.FromBase64String(trimmed.Substring(3));

                    if (ReadNextToken(out string _) != OscSerializationToken.ObjectEnd)
                    {
                        throw new Exception("Expected end of object");
                    }

                    return(bytes);
                }

                if (trimmed.StartsWith("0x"))
                {
                    trimmed = trimmed.Substring(2);

                    if (trimmed.Length % 2 != 0)
                    {
                        // this is an error
                        throw new Exception("Invalid blob string length");
                    }

                    int length = trimmed.Length / 2;

                    byte[] bytes = new byte[length];

                    for (int i = 0; i < bytes.Length; i++)
                    {
                        bytes[i] = byte.Parse(trimmed.Substring(i * 2, 2), NumberStyles.HexNumber, provider);
                    }

                    if (ReadNextToken(out string _) != OscSerializationToken.ObjectEnd)
                    {
                        throw new Exception("Expected end of object");
                    }

                    return(bytes);
                }
            }

            using (MemoryStream stream = new MemoryStream())
            {
                while (token != OscSerializationToken.ObjectEnd)
                {
                    stream.WriteByte(byte.Parse(value.Trim(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite, provider));

                    token = ReadNextToken(out value);

                    if (token == OscSerializationToken.Separator)
                    {
                        token = ReadNextToken(out value);
                    }
                }

                return(stream.ToArray());
            }
        }
Beispiel #14
0
        public static OscMidiMessage Parse(ref OscStringReader reader, IFormatProvider provider)
        {
//            string[] pieces = new string[4];
//
//            OscSerializationToken token = OscSerializationToken.None;
//
//            for (int i = 0; i < 4; i++)
//            {
//                token = reader.ReadNextToken(out string value);
//                pieces[i] = value;
//                token = reader.ReadNextToken(out string _);
//            }
//
//            if (token != OscSerializationToken.ObjectEnd)
//            {
//                throw new Exception($"Invalid color");
//            }
//
//            byte a, r, g, b;
//
//            r = byte.Parse(pieces[0].Trim(), System.Globalization.NumberStyles.None, provider);
//            g = byte.Parse(pieces[1].Trim(), System.Globalization.NumberStyles.None, provider);
//            b = byte.Parse(pieces[2].Trim(), System.Globalization.NumberStyles.None, provider);
//            a = byte.Parse(pieces[3].Trim(), System.Globalization.NumberStyles.None, provider);
//
//            return OscColor.FromArgb(a, r, g, b);
//
//            return new OscMidiMessage(0, OscMidiMessageType.ControlChange, 0, 0);

            List <string> parts = new List <string>();

            OscSerializationToken token = OscSerializationToken.None;

            do
            {
                token = reader.ReadNextToken(out string value);
                parts.Add(value);
                token = reader.ReadNextToken(out string _);
            }while (token != OscSerializationToken.ObjectEnd);

            if (parts.Count < 4)
            {
                throw new Exception($"Not a midi message '{parts.Count}'");
            }

            int  index  = 0;
            byte portID = byte.Parse(
                parts[index++]
                .Trim(),
                provider
                );

            byte statusByte;
            OscMidiMessageType messageType;

            if (byte.TryParse(
                    parts[index]
                    .Trim(),
                    NumberStyles.Integer,
                    provider,
                    out statusByte
                    ) == false)
            {
                OscMidiSystemMessageType systemMessage;

                if (Enum.TryParse(
                        parts[index]
                        .Trim(),
                        true,
                        out systemMessage
                        ))
                {
                    messageType = OscMidiMessageType.SystemExclusive;
                    statusByte  = (byte)((int)messageType | (int)systemMessage);
                    index++;
                }
                else if (Enum.TryParse(
                             parts[index]
                             .Trim(),
                             true,
                             out messageType
                             ))
                {
                    index++;
                    byte channel = byte.Parse(
                        parts[index++]
                        .Trim(),
                        NumberStyles.Integer,
                        provider
                        );

                    if (channel > 15)
                    {
                        throw new ArgumentOutOfRangeException(nameof(channel));
                    }

                    statusByte = (byte)((int)messageType | channel);

                    if (parts.Count < 5)
                    {
                        throw new Exception($"Not a midi message '{parts.Count}'");
                    }
                }
                else
                {
                    throw new Exception($"Not a midi message '{parts.Count}'");
                }
            }

            byte data1 = byte.Parse(
                parts[index++]
                .Trim(),
                NumberStyles.Integer,
                provider
                );

            if (data1 > 0x7F)
            {
                throw new ArgumentOutOfRangeException(nameof(data1));
            }

            byte data2 = byte.Parse(
                parts[index++]
                .Trim(),
                NumberStyles.Integer,
                provider
                );

            if (data2 > 0x7F)
            {
                throw new ArgumentOutOfRangeException(nameof(data2));
            }

            if (index != parts.Count)
            {
                throw new Exception($"Not a midi message '{parts.Count}'");
            }

            return(new OscMidiMessage(portID, statusByte, data1, data2));
        }