public Task<ITransferHandle> BeginTransfer(string path, Verb verb = Verb.Default, Action<TransferHandle> onConnect = null) { var socket = _socket ?? CreateSocket(); if (socket.Connected) throw new InvalidOperationException("Already connected"); var state = new TransferHandle(path, verb, _clientId, socket, _socket == null, _compression, onConnect); var connectedHandle = new ManualResetEvent(false); return Task<ITransferHandle>.Factory.StartNew(() => { if (!socket.Connected) { DebugOutput.Log("Connecting to " + _endpoint); socket.BeginConnect(_endpoint, a => { var handle = (TransferHandle)a.AsyncState; handle.ClientSocket.EndConnect(a); handle.OnConnect(handle); connectedHandle.Set(); }, state); connectedHandle.WaitOne(); if (socket.Connected) DebugOutput.Log("Connected to " + _endpoint); } else { connectedHandle.Set(); } return state; }); }
private static async Task<Stream> ReceiveData(TransferHandle state, ICompressionProvider compression) { var context = await new AsyncSocketWriterReader(state.ClientSocket, state.BufferSize) .ReadAsync(); return compression.DecompressFrom(context.ReceivedData); }
private static async Task Send(TransferHandle state, DataBatch transferDoc, ICompressionProvider compression) { var buffer = new byte[state.BufferSize]; using (var ms = new MemoryStream()) using (var cs = compression.CompressTo(ms)) { transferDoc.Save(cs); cs.Flush(); cs.Dispose(); ms.Flush(); ms.Position = 0; var sockWriter = new AsyncSocketWriterReader(state.ClientSocket, state.BufferSize); var sent = await sockWriter.WriteAsync(ms); DebugOutput.LogVerbose("Sent {0} bytes", sent); } }