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);
            }
        }
Example #3
0
        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);
            });
        }
Example #4
0
        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);
        }