Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
            });
        }
Exemplo n.º 4
0
        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;
            }
        }