private void OnCsFileTransferVerificationResult(CsFileTransferVerificationResult msg) { FileTransferBase ft; if (!assignedFts.TryGetValue(msg.SessionId, out ft)) { Root.Log(LogLevel.Error, "FileTransferManager: session not found [sid={0}]", msg.SessionId); return; } ApplyVerificationResult(ft, msg.Result); }
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 SaveLoadCsFileTransferVerificationResult() { // arrange const FileTransferVerificationResult refResult = FileTransferVerificationResult.Success; var refSid = new FileTransferId(81289); var msg = new CsFileTransferVerificationResult { Result = refResult, SessionId = refSid, }; // act MultiprotocolSaveLoad(msg, () => { // assert Assert.AreEqual(msg.Result, refResult); Assert.AreEqual(msg.SessionId, refSid); }); }
private void OnCsFileTransferVerificationResult(CsFileTransferVerificationResult 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; } if (ft.State != FileTransferState.Verification) { Root.Log(LogLevel.Error, "Server: invalid file transfer state [sid={0}, expected={1}, got={2}]", ft.Id, FileTransferState.Verification, ft.State); 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; } if (msg.Result == FileTransferVerificationResult.Success) { ft.State = FileTransferState.Success; } else { ft.State = FileTransferState.Failure; } ftsContainer.DeleteSession(ft.Id); SendTo(fileSender.Id, msg); }