#include "TorrentSession.hpp"
#include "TorrentHandle.hpp"
#include "AlertWaiterThread.hpp"
-
+#include "ServerDb.hpp"
+#include <qtrapids/error.hpp>
namespace qtrapids
{
: QObject(parent)
, btSession_()
, alertWaiter_(new AlertWaiterThread(&btSession_, this))
+ , settings_(new ServerSettings(*settings))
+ , db_(new ServerDb(settings_.get()))
{
qDBusRegisterMetaType<qtrapids::TorrentState>();
qDBusRegisterMetaType<qtrapids::ParamsMap_t>();
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()
-//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) {
<< "QBittorrentSession::on_alert(): "
<< QString::fromStdString(alertPtr->message());
-
if (ta) {
-
if (!ta->handle.is_valid()) {
qDebug() << "handle is invalid";
return;
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(path.toStdString()));
+ (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(save_path.toStdString());
+ 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.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();
}