Exemplo n.º 1
0
        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;
            });
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }