From cec87854259851e0a0fbd3cea38ea95fd2f8ca26 Mon Sep 17 00:00:00 2001
From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Date: Tue, 9 Jan 2018 11:37:16 -0500
Subject: [PATCH] datatransfer: add dataTransferList API

Add API to obtain the list of known datatransfer.
libring and DBus API included.

Change-Id: I4e1a46c132f99bd36b4a531035dbc83261061093
Reviewed-by: Olivier Soldano <olivier.soldano@savoirfairelinux.com>
---
 bin/dbus/cx.ring.Ring.ConfigurationManager.xml | 11 +++++++++--
 bin/dbus/dbusconfigurationmanager.cpp          |  6 ++++++
 bin/dbus/dbusconfigurationmanager.h            |  1 +
 src/client/datatransfer.cpp                    |  6 ++++++
 src/data_transfer.cpp                          |  8 ++++++++
 src/data_transfer.h                            |  3 +++
 src/dring/datatransfer_interface.h             |  3 +++
 7 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
index a1af941c61..ee2525cfe5 100644
--- a/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
+++ b/bin/dbus/cx.ring.Ring.ConfigurationManager.xml
@@ -1410,7 +1410,14 @@
            <arg type="s" name="display_name" direction="in"></arg>
        </method>
 
-	   <method name="dataTransferInfo" tp:name-for-bindings="dataTransferInfo">
+       <method name="dataTransferList" tp:name-for-bindings="dataTransferList">
+           <tp:added version="4.2.0"/>
+           <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorULongLong"/>
+           <arg type="at" name="DataTransferList" direction="out">
+           </arg>
+       </method>
+
+       <method name="dataTransferInfo" tp:name-for-bindings="dataTransferInfo">
            <tp:added version="4.2.0"/>
            <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="DataTransferInfo"/>
            <arg type="(buttss)" name="DataTransferInfo" direction="out">
@@ -1419,7 +1426,7 @@
            </arg>
        </method>
 
-	   <method name="dataTransferBytesSent" tp:name-for-bindings="dataTransferBytesSent">
+       <method name="dataTransferBytesSent" tp:name-for-bindings="dataTransferBytesSent">
            <tp:added version="4.2.0"/>
            <arg type="t" name="BytesProgress" direction="out">
            </arg>
diff --git a/bin/dbus/dbusconfigurationmanager.cpp b/bin/dbus/dbusconfigurationmanager.cpp
index be041d502f..8a632d8168 100644
--- a/bin/dbus/dbusconfigurationmanager.cpp
+++ b/bin/dbus/dbusconfigurationmanager.cpp
@@ -640,3 +640,9 @@ DBusConfigurationManager::dataTransferBytesSent(const uint64_t& id)
 {
     return DRing::dataTransferBytesSent(id);;
 }
+
+auto
+DBusConfigurationManager::dataTransferList() -> decltype(DRing::dataTransferList())
+{
+    return DRing::dataTransferList();;
+}
diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h
index 35478b24ff..5e86a48ef3 100644
--- a/bin/dbus/dbusconfigurationmanager.h
+++ b/bin/dbus/dbusconfigurationmanager.h
@@ -157,6 +157,7 @@ class DBusConfigurationManager :
                                        const std::string& file_path, const std::string& display_name);
         DBus::Struct<bool, uint32_t, uint64_t, uint64_t, std::string, std::string> dataTransferInfo(const DRing::DataTransferId& id);
         uint64_t dataTransferBytesSent(const uint64_t& id);
+        std::vector<uint64_t> dataTransferList();
 };
 
 #endif // __RING_DBUSCONFIGURATIONMANAGER_H__
diff --git a/src/client/datatransfer.cpp b/src/client/datatransfer.cpp
index 063e8f1fbf..7b44e56de7 100644
--- a/src/client/datatransfer.cpp
+++ b/src/client/datatransfer.cpp
@@ -41,6 +41,12 @@ registerDataXferHandlers(const std::map<std::string, std::shared_ptr<CallbackWra
     }
 }
 
+std::vector<DataTransferId>
+dataTransferList()
+{
+    return ring::Manager::instance().dataTransfers->list();
+}
+
 DataTransferId
 sendFile(const std::string& account_id,
          const std::string& peer_uri,
diff --git a/src/data_transfer.cpp b/src/data_transfer.cpp
index 728a566be9..38eb00ca92 100644
--- a/src/data_transfer.cpp
+++ b/src/data_transfer.cpp
@@ -25,6 +25,7 @@
 #include "peer_connection.h"
 #include "fileutils.h"
 #include "string_utils.h"
+#include "map_utils.h"
 #include "client/ring_signal.h"
 
 #include <stdexcept>
@@ -365,6 +366,13 @@ DataTransferFacade::~DataTransferFacade()
     RING_WARN("facade destroy, pimpl @%p", pimpl_.get());
 };
 
+std::vector<DRing::DataTransferId>
+DataTransferFacade::list() const
+{
+    std::lock_guard<std::mutex> lk {pimpl_->mapMutex_};
+    return map_utils::extractKeys(pimpl_->map_);
+}
+
 DRing::DataTransferId
 DataTransferFacade::sendFile(const std::string& account_id, const std::string& peer_uri,
                              const std::string& file_path, const std::string& display_name)
diff --git a/src/data_transfer.h b/src/data_transfer.h
index 5ddc03c687..56cf0ef018 100644
--- a/src/data_transfer.h
+++ b/src/data_transfer.h
@@ -34,6 +34,9 @@ public:
     DataTransferFacade();
     ~DataTransferFacade();
 
+    /// Return all known transfer id
+    std::vector<DRing::DataTransferId> list() const;
+
     /// Send a file to a peer.
     /// Open a file and send its contents over a reliable connection
     /// to given peer using the protocol from given account.
diff --git a/src/dring/datatransfer_interface.h b/src/dring/datatransfer_interface.h
index e9aac344f9..238b353fc0 100644
--- a/src/dring/datatransfer_interface.h
+++ b/src/dring/datatransfer_interface.h
@@ -25,6 +25,7 @@
 
 #include <string>
 #include <map>
+#include <vector>
 #include <memory>
 #include <cstdlib> // std::size_t
 #include <ios> // std::streamsize
@@ -57,6 +58,8 @@ struct DataTransferInfo
     std::string path; ///< associated local file path if supported (empty, if not)
 };
 
+std::vector<DataTransferId> dataTransferList();
+
 /// Asynchronously send a file to a peer using given account connection.
 ///
 /// If given account supports a file transfer protocol this function creates
-- 
GitLab