Client-server through DBus, cmake support
[qtrapids] / src / server / TorrentSession.cpp
diff --git a/src/server/TorrentSession.cpp b/src/server/TorrentSession.cpp
new file mode 100644 (file)
index 0000000..514b2c9
--- /dev/null
@@ -0,0 +1,147 @@
+#include "TorrentSession.hpp"
+#include "TorrentHandle.hpp"
+#include "AlertWaiterThread.hpp"
+
+
+namespace qtrapids
+{
+
+
+
+    TorrentSession::TorrentSession(QObject *parent, QSettings *settings)
+        : QObject(parent)
+        , btSession_()
+               , alertWaiter_(new AlertWaiterThread(&btSession_, this))
+    {
+        qDBusRegisterMetaType<qtrapids::TorrentState>();
+        qDBusRegisterMetaType<qtrapids::ParamsMap_t>();
+        new QtRapidsServer(this);
+
+        QDBusConnection dbus = QDBusConnection::sessionBus();
+        dbus.registerObject("/qtrapids", this);
+        dbus.registerService("com.ixonos.qtrapids");
+
+        alertWaiter_->allAlerts();
+        connect(alertWaiter_, SIGNAL(alert()), this, SLOT(on_alert()));
+        alertWaiter_->start();
+
+
+    }
+
+    void TorrentSession::on_alert()
+    //NOTE: al parameter not necessarily needed here, as we pop_alert() now!
+    {
+
+        //qDebug() << "QBittorrentSession:on_alert(" << al << ")";
+        //     if (al)
+        //             qDebug() << "on_alert():" << QString::fromStdString(al->message());
+
+        std::auto_ptr<alert_t> alertPtr = btSession_.pop_alert();
+
+        if (alertPtr.get() != NULL) {
+
+            torrent_alert_t *ta = dynamic_cast<torrent_alert_t*> (alertPtr.get());
+
+            qDebug()
+                               << "QBittorrentSession::on_alert(): "
+                               << QString::fromStdString(alertPtr->message());
+
+
+            if (ta) {
+                TorrentHandle handle(ta->handle);
+                TorrentState state;
+
+                state.hash = Hash2QStr(handle.hash());
+                state.state = handle.state();
+                state.progress = handle.progress() * torrent_progress_max;
+                state.down_rate = handle.downloadRate();
+                state.up_rate = handle.uploadRate();
+                state.seeds = handle.numSeeds();
+                state.leeches = handle.numLeeches();
+            
+                ParamsMap_t params;
+                emit alert(state, params);
+            }
+
+        }
+    }
+
+    void TorrentSession::getState()
+    {
+        torrents_t::const_iterator p;
+        for (p = torrents_.constBegin(); p != torrents_.constEnd(); ++p) {
+            TorrentHandlePtr handle = *p;
+            TorrentState state;
+            QString hash = Hash2QStr(handle->hash());
+            
+            state.hash = hash;
+            state.name = handle->name();
+            state.state = handle->state();
+            state.progress = handle->progress() * torrent_progress_max;
+            state.down_rate = handle->downloadRate();
+            state.up_rate = handle->uploadRate();
+            state.seeds = handle->numSeeds();
+            state.leeches = handle->numLeeches();
+            state.total_size = handle->getTotalSize();
+
+            emit alert(state, ParamsMap_t());
+        }
+    }
+
+    void TorrentSession::addTorrent(const QString &path, const QString &save_path
+                                    , qtrapids::ParamsMap_t other_params)
+    {
+        add_torrent_params_t addParams;
+        QFile torrent_file(path);
+        if (!torrent_file.exists()) {
+            qWarning() << "Torrent file " << path << "doesn't exist";
+            return;
+        }
+
+        qDebug() << "addTorrent: " << path << " save to " << save_path;
+        boost::intrusive_ptr<libtorrent::torrent_info> tiTmp
+            = new libtorrent::torrent_info(path.toStdString());
+        addParams.ti = tiTmp;
+
+        // save_path is the only mandatory parameter, rest are optional.
+        addParams.save_path = save_path.toStdString();
+        //addParams.storage_mode = libtorrent::storage_mode_allocate;
+
+        TorrentHandlePtr handle(new TorrentHandle(btSession_.add_torrent(addParams)));
+        QString hash = Hash2QStr(handle->hash());
+
+        TorrentState state;
+
+        state.hash = hash;
+        state.name = handle->name();
+        state.state = handle->state();
+        state.progress = handle->progress() * torrent_progress_max;
+        state.down_rate = handle->downloadRate();
+        state.up_rate = handle->uploadRate();
+        state.seeds = handle->numSeeds();
+        state.leeches = handle->numLeeches();
+        state.total_size = handle->getTotalSize();
+
+        torrents_[hash] = handle;
+
+        emit alert(state, ParamsMap_t());
+    }
+
+    void TorrentSession::removeTorrent(const QString &hash)
+    {
+        torrents_t::iterator p = torrents_.find(hash);
+        if (p == torrents_.end()) {
+            qDebug() << "Invalid request to remove torrent with hash " << hash;
+            return;
+        }
+        try {
+            btSession_.remove_torrent(p.value()->getHandle());
+        } catch (torrent_exception_t e) {
+            qDebug() << // e.what()
+                "exception catched"
+                ;
+        }
+    }
+
+
+} // namespace qtrapids