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); }
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); } }
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())); }
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()); }
public void ReadSeparator() { OscSerializationToken token = ReadNextToken(out string _); if (token != OscSerializationToken.Separator) { throw new OscException(OscError.ErrorParsingOscAdress, $"Unexpected serialization token {token}"); } }
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); }
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); }
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); }
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); }
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)); }
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())); }
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)); }
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()); } }
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)); }