--- /dev/null
+#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