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)];
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; } } }
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); }
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)];