public void SendRequest(DsiCommand command, byte[] payload, AfpTransportReplyHandler replyHandler = null) { DsiHeader header = new DsiHeader() { command = command, flags = DsiFlags.Request, requestId = this.NextRequestId(), errorCodeOrWriteOffset = 0, totalDataLength = (uint)payload.Length }; AfpStream stream = new AfpStream(); header.Write(stream); stream.WriteBytes(payload); if (replyHandler != null) { _replyHandlers[header.requestId] = replyHandler; } byte[] result = stream.ToByteArray(); this.SendBuffer(result); }
private void OnCommandReceived(DsiHeader header, byte[] payload) { if (header.flags == DsiFlags.Reply) { // Find reply handler. AfpTransportReplyHandler handler = null; if (!_replyHandlers.TryRemove(header.requestId, out handler)) { // BUG? Request ID flipped in replies from Mac OS X Snow Leopard? byte[] requestIdData = BitConverter.GetBytes(header.requestId); Array.Reverse(requestIdData); header.requestId = BitConverter.ToUInt16(requestIdData, 0); _replyHandlers.TryRemove(header.requestId, out handler); } if (handler != null) { try { handler(header, payload); } catch { } return; } } switch (header.command) { case DsiCommand.Tickle: break; default: { AfpTransportCommandReceivedEventArgs args = new AfpTransportCommandReceivedEventArgs(header, payload); try { CommandReceived(this, args); } catch { } break; } } }