From f864a6398124a7baac93cd15925723a850611d74 Mon Sep 17 00:00:00 2001
From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Date: Wed, 10 Jan 2018 14:43:10 -0500
Subject: [PATCH] datatransfer: implement incoming totalSize info
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

File total byte size information was missing for incoming transfer.

Change-Id: I4aadc0d6ae2baced02a93c208d7476cf71609945
Reviewed-by: Anthony Léonard <anthony.leonard@savoirfairelinux.com>
---
 src/data_transfer.cpp | 14 +++++++++-----
 src/data_transfer.h   |  2 +-
 src/ftp_server.cpp    |  2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/data_transfer.cpp b/src/data_transfer.cpp
index 38eb00ca92..3a1f70ccc7 100644
--- a/src/data_transfer.cpp
+++ b/src/data_transfer.cpp
@@ -204,7 +204,7 @@ FileTransfer::read(std::vector<uint8_t>& buf) const
 class IncomingFileTransfer final : public DataTransfer
 {
 public:
-    IncomingFileTransfer(DRing::DataTransferId id, const std::string&, std::size_t);
+    IncomingFileTransfer(DRing::DataTransferId id, const std::string&, std::size_t, std::size_t);
 
     bool start() override;
 
@@ -222,14 +222,16 @@ private:
 
 IncomingFileTransfer::IncomingFileTransfer(DRing::DataTransferId id,
                                            const std::string& display_name,
+                                           std::size_t total_size,
                                            std::size_t offset)
     : DataTransfer(id)
 {
-    RING_WARN() << "[FTP] incoming transfert: " << display_name;
+    RING_WARN() << "[FTP] incoming transfert of " << total_size << " byte(s): " << display_name;
     (void)offset;
 
     info_.isOutgoing = false;
     info_.displayName = display_name;
+    info_.totalSize = total_size;
     // TODO: use offset?
 
     emit(DRing::DataTransferEventCode::created);
@@ -291,6 +293,7 @@ public:
     std::shared_ptr<DataTransfer> createFileTransfer(const std::string& file_path,
                                                      const std::string& display_name);
     std::shared_ptr<IncomingFileTransfer> createIncomingFileTransfer(const std::string& display_name,
+                                                                     std::size_t total_size,
                                                                      std::size_t offset);
 
     std::shared_ptr<DataTransfer> getTransfer(const DRing::DataTransferId& id);
@@ -329,10 +332,11 @@ DataTransferFacade::Impl::createFileTransfer(const std::string& file_path,
 
 std::shared_ptr<IncomingFileTransfer>
 DataTransferFacade::Impl::createIncomingFileTransfer(const std::string& display_name,
+                                                     std::size_t total_size,
                                                      std::size_t offset)
 {
     auto id = generateUID();
-    auto transfer = std::make_shared<IncomingFileTransfer>(id, display_name, offset);
+    auto transfer = std::make_shared<IncomingFileTransfer>(id, display_name, total_size, offset);
     std::lock_guard<std::mutex> lk {mapMutex_};
     map_.emplace(id, transfer);
     return transfer;
@@ -437,9 +441,9 @@ DataTransferFacade::info(const DRing::DataTransferId& id) const
 }
 
 std::string
-DataTransferFacade::onIncomingFileRequest(const std::string& display_name, std::size_t offset)
+DataTransferFacade::onIncomingFileRequest(const std::string& display_name, std::size_t total_size, std::size_t offset)
 {
-    auto transfer = pimpl_->createIncomingFileTransfer(display_name, offset);
+    auto transfer = pimpl_->createIncomingFileTransfer(display_name, total_size, offset);
     auto filename = transfer->requestFilename();
     if (!filename.empty())
         transfer->start(); // TODO: bad place, call only if file can be open
diff --git a/src/data_transfer.h b/src/data_transfer.h
index 56cf0ef018..5c5f40213a 100644
--- a/src/data_transfer.h
+++ b/src/data_transfer.h
@@ -70,7 +70,7 @@ public:
     /// Create an IncomingFileTransfer object.
     /// \return a filename to open where incoming data will be written or an empty string
     ///         in case of refusal.
-    std::string onIncomingFileRequest(const std::string& display_name, std::size_t offset);
+    std::string onIncomingFileRequest(const std::string& display_name, std::size_t total_size, std::size_t offset);
 
 private:
     class Impl;
diff --git a/src/ftp_server.cpp b/src/ftp_server.cpp
index 7f7fd3da07..78171640b1 100644
--- a/src/ftp_server.cpp
+++ b/src/ftp_server.cpp
@@ -56,7 +56,7 @@ bool
 FtpServer::startNewFile()
 {
     // Request filename from client (WARNING: synchrone call!)
-    auto filename = Manager::instance().dataTransfers->onIncomingFileRequest(displayName_, 0 /* TODO: offset */);
+    auto filename = Manager::instance().dataTransfers->onIncomingFileRequest(displayName_, fileSize_, 0 /* TODO: offset */);
     if (filename.empty())
         return false;
 
-- 
GitLab