private void ProcessOutcomingTransfer(OutcomingFileTransfer oft) { if (oft.Reader.Eof) { // waiting for verification result - skip return; } var lastBlock = oft.Reader.CurrentBlock == oft.Reader.BlockCount - 1; var tmpBlockSize = oft.BlockSize; if (lastBlock) { tmpBlockSize -= oft.Reader.Padding; } var msg = new CsFileTransferData { SessionId = oft.Id, Data = new byte[tmpBlockSize] }; oft.Reader.Read(msg.Data); oft.BytesDone += tmpBlockSize; oft.BlocksDone = oft.Reader.CurrentBlock; client.Send(msg); OnDataSent(oft); }
private void OnCsFileTransferData(CsFileTransferData msg) { FileTransferBase ft; if (!assignedFts.TryGetValue(msg.SessionId, out ft)) { Root.Log(LogLevel.Error, "FileTransferManager: session not found [sid={0}]", msg.SessionId); return; } var ift = ft as IncomingFileTransfer; if (ift == null) { Root.Log(LogLevel.Error, "FileTransferManager: expected incoming session [sid={0}]", msg.SessionId); return; } if (ift.Writer == null) { Root.Log(LogLevel.Error, "FileTransferManager: can't process session [sid={0}] data: " + "writer is not initialized", msg.SessionId); return; } ift.Writer.Write(msg.Data); ift.BytesDone += msg.Data.Length; ift.BlocksDone = ift.Writer.CurrentBlock; // XXX: send confirmation respond for each N blocks OnDataReceived(ift); // all data received: verify checksum, send verification result and delete session if (ift.Writer.Eof) { ift.Writer.Close(); var hash = ComputeHash(ift.Name); var success = CompareHashes(hash, ift.Hash); Root.Log(LogLevel.Info, "FileTransferManager: data verification [sid={0}] {1}", msg.SessionId, success ? "succeeded" : "failed"); var ftvr = success ? FileTransferVerificationResult.Success : FileTransferVerificationResult.ChecksumMismatch; var result = new CsFileTransferVerificationResult { Result = ftvr, SessionId = ift.Id }; client.Send(result); ApplyVerificationResult(ift, ftvr); } }
public void SaveLoadCsFileTransferData() { // arrange var refSid = new FileTransferId(81289); byte[] refData = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; var msg = new CsFileTransferData { SessionId = refSid, Data = refData, }; // act MultiprotocolSaveLoad(msg, () => { // assert Assert.AreEqual(msg.SessionId, refSid); Assert.AreEqual(msg.Data, refData); }); }
private void OnCsFileTransferData(CsFileTransferData 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 receiver; if (!nameToClient.TryGetValue(ft.Receiver, out receiver)) { Root.Log(LogLevel.Warning, "Server: ignoring file transfer data {0} -> {1} (receiver disconnected)", cl.Login, ft.Receiver); // XXX: suspend session (cl is offline) return; } if (ft.State != FileTransferState.Working) { Root.Log(LogLevel.Error, "Server: invalid file transfer state [sid={0}, expected={1}, got={2}]", ft.Id, FileTransferState.Working, ft.State); return; } if (!SendTo(receiver.Id, msg)) { // XXX: suspend file transfer session return; } ft.BlocksDone++; if (ft.BlocksDone == ft.BlocksTotal) { ft.State = FileTransferState.Verification; } }