protected void parseRawMessage(byte[] rawMessage) { MemoryStream stream = new MemoryStream(rawMessage); int protocol = stream.ReadInt(); if (protocol != PROTOCOL_PREFIX) { throw new IOException("Invalid message header, expected REX0"); } int cmd = stream.ReadInt(); int cmdLen = stream.ReadInt(); if (cmdLen != stream.Length - 12) { throw new IOException("Invalid message size"); } byte[] payload = stream.ReadFully(cmdLen); RawMessageReceivedEventHandler listener = RawListeners [cmd]; if (listener != null) { listener(payload); } else { Console.WriteLine(this + ": Unhandled message " + cmd); } }
protected async Task <T> WaitResponseAsync <T>(int cmd, Func <byte[], T> handler) { TaskCompletionSource <T> task = new TaskCompletionSource <T>(); RawMessageReceivedEventHandler wrapper = null; wrapper = (payload) => { RawListeners [cmd] -= wrapper; task.SetResult(handler(payload)); }; RawListeners [cmd] += wrapper; return(await task.Task); }