- TODO: Consider removing forced torrent recheck when issuing Start Daemon
git-svn-id: file:///svnroot/qtrapids/trunk@69
42ac0dd5-4c8c-4c71-bb3e-
ecdfe252ffda
<signal name="terminate">
</signal>
<signal name="terminate">
</signal>
+ <signal name="sessionTerminated">
+ </signal>
+
dlView_(NULL),
seedView_(NULL),
searchWidget_(NULL),
dlView_(NULL),
seedView_(NULL),
searchWidget_(NULL),
+ startDaemonAction_(NULL),
+ stopDaemonAction_(NULL),
preferencesDialog_(NULL),
settings_(QCoreApplication::organizationName()
, QCoreApplication::applicationName()),
preferencesDialog_(NULL),
settings_(QCoreApplication::organizationName()
, QCoreApplication::applicationName()),
QAction *openAction = tempMenu->addAction(tr("&Open"));
QAction *removeAction = tempMenu->addAction(tr("&Remove"));
removeAction->setEnabled(false);
QAction *openAction = tempMenu->addAction(tr("&Open"));
QAction *removeAction = tempMenu->addAction(tr("&Remove"));
removeAction->setEnabled(false);
- QAction *quitAction = tempMenu->addAction(tr("&Quit"));
- QAction *stopDaemonAction = tempMenu->addAction(tr("Stop &daemon"));
+ startDaemonAction_ = tempMenu->addAction(tr("S&tart daemon"));
+ stopDaemonAction_ = tempMenu->addAction(tr("Sto&p daemon"));
+ startDaemonAction_->setEnabled(false);
+
+ QAction *quitAction = tempMenu->addAction(tr("&Quit"));
tempMenu = menuBar->addMenu(tr("&View"));
QAction *columnsAction = tempMenu->addAction(tr("&Columns"));
tempMenu = menuBar->addMenu(tr("&View"));
QAction *columnsAction = tempMenu->addAction(tr("&Columns"));
connect(removeAction, SIGNAL(triggered()), this, SLOT(on_removeAction_clicked()));
connect(this, SIGNAL(itemSelected(bool)), removeAction, SLOT(setEnabled(bool)));
connect(quitAction, SIGNAL(triggered()), this, SLOT(on_quitAction_clicked()));
connect(removeAction, SIGNAL(triggered()), this, SLOT(on_removeAction_clicked()));
connect(this, SIGNAL(itemSelected(bool)), removeAction, SLOT(setEnabled(bool)));
connect(quitAction, SIGNAL(triggered()), this, SLOT(on_quitAction_clicked()));
- connect(stopDaemonAction, SIGNAL(triggered()), this, SLOT(on_stopDaemonAction_clicked()));
+ connect(startDaemonAction_, SIGNAL(triggered()), this, SLOT(on_startDaemonAction_clicked()));
+ connect(stopDaemonAction_, SIGNAL(triggered()), this, SLOT(on_stopDaemonAction_clicked()));
connect(columnsAction, SIGNAL(triggered()), this, SLOT(on_columnsAction_clicked()));
connect(preferencesAction, SIGNAL(triggered()), this, SLOT(on_preferencesAction_clicked()));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_aboutAction_clicked()));
connect(columnsAction, SIGNAL(triggered()), this, SLOT(on_columnsAction_clicked()));
connect(preferencesAction, SIGNAL(triggered()), this, SLOT(on_preferencesAction_clicked()));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_aboutAction_clicked()));
connect(&server_, SIGNAL(alert(qtrapids::TorrentState, qtrapids::ParamsMap_t)),
this, SLOT(on_alert(qtrapids::TorrentState, qtrapids::ParamsMap_t)));
connect(&server_, SIGNAL(alert(qtrapids::TorrentState, qtrapids::ParamsMap_t)),
this, SLOT(on_alert(qtrapids::TorrentState, qtrapids::ParamsMap_t)));
+
+ connect(&server_, SIGNAL(sessionTerminated()), this, SLOT(on_serverTerminated()));
+
// connect(&btSession_, SIGNAL(alert(std::auto_ptr<Alert>)),
// this, SLOT(on_alert(std::auto_ptr<Alert>)));
// connect(&btSession_, SIGNAL(alert(std::auto_ptr<Alert>)),
// this, SLOT(on_alert(std::auto_ptr<Alert>)));
+void MainWindow::on_startDaemonAction_clicked()
+{
+ server_.getState();
+ /// @todo create signal that signals server startup and
+ /// enable controls in the handler slot
+ stopDaemonAction_->setEnabled(true);
+ startDaemonAction_->setEnabled(false);
+}
+
+
void MainWindow::on_stopDaemonAction_clicked()
{
server_.terminateSession();
}
void MainWindow::on_stopDaemonAction_clicked()
{
server_.terminateSession();
}
+void MainWindow::on_serverTerminated()
+{
+ stopDaemonAction_->setEnabled(false);
+ startDaemonAction_->setEnabled(true);
+}
+
void MainWindow::on_columnsAction_clicked()
{
ColumnSelectorDialog *dialog = new ColumnSelectorDialog(dlView_);
void MainWindow::on_columnsAction_clicked()
{
ColumnSelectorDialog *dialog = new ColumnSelectorDialog(dlView_);
void on_openAction_clicked();
void on_removeAction_clicked();
void on_quitAction_clicked();
void on_openAction_clicked();
void on_removeAction_clicked();
void on_quitAction_clicked();
+ void on_startDaemonAction_clicked();
void on_stopDaemonAction_clicked();
void on_stopDaemonAction_clicked();
+ void on_serverTerminated();
void on_columnsAction_clicked();
void on_preferencesAction_clicked();
void on_aboutAction_clicked();
void on_columnsAction_clicked();
void on_preferencesAction_clicked();
void on_aboutAction_clicked();
void on_torrentFileSelected(const QString& file);
void on_alert(qtrapids::TorrentState, qtrapids::ParamsMap_t);
void on_torrentFileSelected(const QString& file);
void on_alert(qtrapids::TorrentState, qtrapids::ParamsMap_t);
private:
void LoadPlugins();
void StartTorrentFromBufferData(char const* data, int size);
private:
void LoadPlugins();
void StartTorrentFromBufferData(char const* data, int size);
DownloadView *dlView_;
SeedView *seedView_;
QWidget *searchWidget_;
DownloadView *dlView_;
SeedView *seedView_;
QWidget *searchWidget_;
+ QAction *startDaemonAction_, *stopDaemonAction_;
PreferencesDialog *preferencesDialog_;
QSettings settings_;
QList<QDir> pluginDirs_;
QStringList pluginFileNames_;
PreferencesDialog *preferencesDialog_;
QSettings settings_;
QList<QDir> pluginDirs_;
QStringList pluginFileNames_;
//std::vector< std::auto_ptr<QTorrentHandle> const > torrentHandles_;
QtRapidsServer server_;
//std::vector< std::auto_ptr<QTorrentHandle> const > torrentHandles_;
QtRapidsServer server_;
AlertWaiterThread::AlertWaiterThread(session_t *session, QObject* parent) :
QThread(parent),
AlertWaiterThread::AlertWaiterThread(session_t *session, QObject* parent) :
QThread(parent),
+ btSession_(session),
+ running_(false),
+ alertMutex_()
void AlertWaiterThread::run()
{
alert_t const *alertTemp = NULL;
void AlertWaiterThread::run()
{
alert_t const *alertTemp = NULL;
+ running_ = true;
+ while (running_) {
// wait_for_alert() call blocks. Returns libtorrent alert.
// Returns NULL, if no alerts in timeout period.
alertTemp = btSession_->wait_for_alert(ALERT_WAIT_TIMEOUT);
// wait_for_alert() call blocks. Returns libtorrent alert.
// Returns NULL, if no alerts in timeout period.
alertTemp = btSession_->wait_for_alert(ALERT_WAIT_TIMEOUT);
+
+void AlertWaiterThread::stop()
+{
+ alertMutex_.lock();
+ running_ = false;
+ alertMutex_.unlock();
+
+
+} // namespace qtrapids
#define ALERTWAITERTHREAD_H
#include <QThread>
#define ALERTWAITERTHREAD_H
#include <QThread>
#include "TorrentSession.hpp"
namespace qtrapids
#include "TorrentSession.hpp"
namespace qtrapids
void allAlerts(bool enable = true);
virtual void run(); // Overridden from QThread
void allAlerts(bool enable = true);
virtual void run(); // Overridden from QThread
+
+ virtual void stop();
+
signals:
void alert();
private:
session_t *const btSession_;
signals:
void alert();
private:
session_t *const btSession_;
+ bool running_;
+ QMutex alertMutex_;
};
} // namespace qtrapids
};
} // namespace qtrapids
+
+TorrentSession::~TorrentSession()
+{
+ alertWaiter_->stop();
+ alertWaiter_->wait();
+ emit sessionTerminated();
+}
+
+
void TorrentSession::loadState()
{
TorrentDownloadInfo info;
void TorrentSession::loadState()
{
TorrentDownloadInfo info;
void TorrentSession::terminateSession()
{
qDebug() << "Terminate called";
void TorrentSession::terminateSession()
{
qDebug() << "Terminate called";
+ // Emiting terminate() here causes the server application to quit in main()
public:
TorrentSession(QObject *parent, QSettings *);
public:
TorrentSession(QObject *parent, QSettings *);
+ virtual ~TorrentSession();
+
public slots:
void getState();
void addTorrent(const QString &path, const QString &save_path
public slots:
void getState();
void addTorrent(const QString &path, const QString &save_path
signals:
void alert(qtrapids::TorrentState info, qtrapids::ParamsMap_t other_info);
void terminate();
signals:
void alert(qtrapids::TorrentState info, qtrapids::ParamsMap_t other_info);
void terminate();
+ void sessionTerminated();
private slots:
void on_alert();
private slots:
void on_alert();