// 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); }
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); }
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); }); }