Server methods to store/get options
[qtrapids] / src / server / TorrentSession.cpp
index 514b2c9..b5d6e9d 100644 (file)
 #include "TorrentSession.hpp"
 #include "TorrentHandle.hpp"
 #include "AlertWaiterThread.hpp"
-
+#include "ServerDb.hpp"
+#include <qtrapids/error.hpp>
 
 namespace qtrapids
 {
 
 
 
-    TorrentSession::TorrentSession(QObject *parent, QSettings *settings)
-        : QObject(parent)
-        , btSession_()
+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"
-                ;
-        }
-    }
+               , settings_(new ServerSettings(*settings))
+               , db_(new ServerDb(settings_.get()))
+{
+       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();
+
+       loadState();
+}
+
+void TorrentSession::loadState()
+{
+       TorrentDownloadInfo info;
+       TorrentsStorage storage(*db_);
+       while (storage.nextTorrent(info)) {
+               qDebug() << "adding " << info.path;
+               addTorrent_(info.path, info.download_path, ParamsMap_t(), true);
+       }
+       btSession_.listen_on(settings_->getListenPorts());
+}
+
+void TorrentSession::on_alert()
+{
+       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) {
+                       if (!ta->handle.is_valid()) {
+                               qDebug() << "handle is invalid";
+                               return;
+                       }
+
+                       TorrentHandle handle(ta->handle);
+                       TorrentState state;
+
+                       state.hash = Hash2QStr(handle.hash());
+                       state.action = TorrentState::action_update;
+                       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.action = TorrentState::action_add;
+               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)
+{
+       return addTorrent_(path, save_path, other_params, false);
+}
+
+void TorrentSession::addTorrent_(const QString &path, const QString &save_path
+                                 , const qtrapids::ParamsMap_t &other_params
+                                 , bool is_restore_session)
+{
+       add_torrent_params_t addParams;
+       QFile torrent_file(path);
+       QDir::home().mkdir(settings_->getTorrentsSubDir());
+
+       if (!torrent_file.exists()) {
+               qWarning() << "Torrent file " << path << "doesn't exist";
+               return;
+       }
+
+       QString new_torrent_fname(QDir(settings_->getTorrentsDir())
+                                 .filePath(QFileInfo(path).fileName()));
+       qDebug() << "copy to " << new_torrent_fname;
+       torrent_file.copy(new_torrent_fname);
+
+       qDebug() << "addTorrent: " << path << " save to " << save_path;
+       boost::intrusive_ptr<libtorrent::torrent_info> tiTmp
+       = new libtorrent::torrent_info
+       (boost::filesystem::path(new_torrent_fname.toStdString()));
+       addParams.ti = tiTmp;
+
+       QString download_dir;
+       if (!save_path.isEmpty()) {
+               download_dir = save_path;
+       } else {
+               download_dir = settings_->getDownloadDir();
+       }
+       // save_path is the only mandatory parameter, rest are optional.
+       addParams.save_path = boost::filesystem::path(download_dir.toStdString());
+       //addParams.storage_mode = libtorrent::storage_mode_allocate;
+
+       TorrentHandlePtr handle(new TorrentHandle(btSession_.add_torrent(addParams)));
+       QString hash = Hash2QStr(handle->hash());
+
+       if (!is_restore_session) {
+               db_->addTorrent(hash, path, save_path);
+       }
+
+       TorrentState state;
+
+       state.hash = hash;
+       state.name = handle->name();
+       state.action = TorrentState::action_add;
+       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"
+               ;
+       }
+
+       TorrentState state;
+       state.hash = hash;
+       state.action = TorrentState::action_remove;
+       emit alert(state, ParamsMap_t());
+       torrents_.erase(p);
+       db_->removeTorrent(hash);
+}
+
+void TorrentSession::setOptions(qtrapids::ParamsMap_t options)
+{
+       settings_->setOptions(options);
+}
+
+qtrapids::ParamsMap_t TorrentSession::getOptions()
+{
+       return settings_->getOptions();
+}
 
 
 } // namespace qtrapids