// XXX: write to temp file 'filename.ext.tmp' and rename it to original name once transfer succeeded
            // XXX: delete file on transfer cancellation

            public override void Cancel()
            {
                IMessage msg;

                switch (State)
                {
                case FileTransferState.Success:
                case FileTransferState.Failure:
                case FileTransferState.Cancelled:
                    return;

                case FileTransferState.Waiting:
                    msg = new ClFileTransferRespond
                    {
                        Result    = FileTransferRequestResult.Rejected,
                        SessionId = Id
                    };
                    break;

                case FileTransferState.Working:
                default:
                    msg = new CsFileTransferInterruption
                    {
                        SessionId = Id,
                        Int       = FileTransferInterruption.Cancel
                    };
                    break;
                }
                State = FileTransferState.Cancelled;
                Delete();
                Owner.client.Send(msg);
                Owner.OnTransferStateChanged(this);
            }
        private void ProcessIncomingTransfer(IncomingFileTransfer ift)
        {
            if (ift.Writer != null) // already processed
            {
                return;
            }
            ift.Writer = new BlockFileWriter(ift.Name, ift.BlockSize, ift.BytesTotal);
            var respond = new ClFileTransferRespond
            {
                Result    = FileTransferRequestResult.Accepted,
                SessionId = ift.Id,
                BlockSize = ift.BlockSize
            };

            client.Send(respond);
        }
Beispiel #3
0
        private void OnClFileTransferRespond(ClFileTransferRespond msg, ClientId id)
        {
            var cl = clients[id];
            var ft = ftsContainer.GetSessionById(msg.SessionId);

            if (ft == null)
            {
                Root.Log(LogLevel.Warning, "Server: bad file transfer session id ({0}) received from client {1} ",
                         msg.SessionId, cl.Login);
                // XXX: send result
                return;
            }
            SocketClientBase fileSender;

            if (!nameToClient.TryGetValue(ft.Sender, out fileSender))
            {
                Root.Log(LogLevel.Warning, "Server: client {0} attempted to send file transfer verification result " +
                         "to disconnected client {1}", cl.Login, ft.Receiver);
                // XXX: suspend session (cl is offline)
                return;
            }
            var result = new SvFileTransferResult
            {
                Result = msg.Result,
                Token  = ft.Token
            };

            if (msg.Result == FileTransferRequestResult.Accepted)
            {
                var newBlockSize = Math.Min(SelectBlockSize(msg.BlockSize), ft.BlockSize);
                ft.BlockSize     = newBlockSize;
                ft.State         = FileTransferState.Working;
                result.BlockSize = newBlockSize;
                result.SessionId = msg.SessionId;
            }
            else
            {
                ftsContainer.DeleteSession(ft.Id);
                result.SessionId = FileTransferId.InvalidId;
            }
            SendTo(fileSender.Id, result);
        }
Beispiel #4
0
        public void SaveLoadClFileTransferRespond()
        {
            // arrange
            const FileTransferRequestResult refResult = FileTransferRequestResult.Accepted;
            var       refSid       = new FileTransferId(81289);
            const int refBlockSize = 8192;
            var       msg          = new ClFileTransferRespond
            {
                Result    = refResult,
                SessionId = refSid,
                BlockSize = refBlockSize,
            };

            // act
            MultiprotocolSaveLoad(msg, () =>
            {
                // assert
                Assert.AreEqual(msg.Result, refResult);
                Assert.AreEqual(msg.SessionId, refSid);
                Assert.AreEqual(msg.BlockSize, refBlockSize);
            });
        }