mirror of https://github.com/PurpleI2P/i2pd-qt.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
4.9 KiB
195 lines
4.9 KiB
#include <memory> |
|
|
|
#include "DaemonQT.h" |
|
#include "Daemon.h" |
|
#include "mainwindow.h" |
|
|
|
#include "Log.h" |
|
|
|
#include <QMessageBox> |
|
#include <QApplication> |
|
#include <QMutexLocker> |
|
#include <QThread> |
|
|
|
//#define DEBUG_WITH_DEFAULT_LOGGING (1) |
|
|
|
namespace i2p |
|
{ |
|
namespace qt |
|
{ |
|
Worker::Worker (DaemonQTImpl& daemon): |
|
m_Daemon (daemon) |
|
{ |
|
} |
|
|
|
void Worker::startDaemon() |
|
{ |
|
qDebug("Performing daemon start..."); |
|
try{ |
|
m_Daemon.start(); |
|
qDebug("Daemon started."); |
|
emit resultReady(false, ""); |
|
}catch(std::exception& ex){ |
|
emit resultReady(true, ex.what()); |
|
}catch(...){ |
|
emit resultReady(true, QObject::tr("Error: unknown exception")); |
|
} |
|
} |
|
void Worker::restartDaemon() |
|
{ |
|
qDebug("Performing daemon restart..."); |
|
try{ |
|
m_Daemon.restart(); |
|
qDebug("Daemon restarted."); |
|
emit resultReady(false, ""); |
|
}catch(std::exception& ex){ |
|
emit resultReady(true, ex.what()); |
|
}catch(...){ |
|
emit resultReady(true, QObject::tr("Error: unknown exception")); |
|
} |
|
} |
|
void Worker::stopDaemon() { |
|
qDebug("Performing daemon stop..."); |
|
try{ |
|
m_Daemon.stop(); |
|
qDebug("Daemon stopped."); |
|
emit resultReady(false, ""); |
|
}catch(std::exception& ex){ |
|
emit resultReady(true, ex.what()); |
|
}catch(...){ |
|
emit resultReady(true, QObject::tr("Error: unknown exception")); |
|
} |
|
} |
|
|
|
Controller::Controller(DaemonQTImpl& daemon): |
|
m_Daemon (daemon) |
|
{ |
|
Worker *worker = new Worker (m_Daemon); |
|
worker->moveToThread(&workerThread); |
|
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); |
|
connect(this, &Controller::startDaemon, worker, &Worker::startDaemon); |
|
connect(this, &Controller::stopDaemon, worker, &Worker::stopDaemon); |
|
connect(this, &Controller::restartDaemon, worker, &Worker::restartDaemon); |
|
connect(worker, &Worker::resultReady, this, &Controller::handleResults); |
|
workerThread.start(); |
|
} |
|
Controller::~Controller() |
|
{ |
|
qDebug("Closing and waiting for daemon worker thread..."); |
|
workerThread.quit(); |
|
workerThread.wait(); |
|
qDebug("Waiting for daemon worker thread finished."); |
|
if(m_Daemon.isRunning()) |
|
{ |
|
qDebug("Stopping the daemon..."); |
|
m_Daemon.stop(); |
|
qDebug("Stopped the daemon."); |
|
} |
|
} |
|
|
|
DaemonQTImpl::DaemonQTImpl (): |
|
mutex(nullptr), m_IsRunning(nullptr), m_RunningChangedCallback(nullptr) |
|
{ |
|
} |
|
|
|
DaemonQTImpl::~DaemonQTImpl () |
|
{ |
|
delete mutex; |
|
} |
|
|
|
bool DaemonQTImpl::init(int argc, char* argv[], std::shared_ptr<std::ostream> logstream) |
|
{ |
|
mutex=new QMutex(QMutex::Recursive); |
|
setRunningCallback(0); |
|
m_IsRunning=false; |
|
return Daemon.init(argc,argv,logstream); |
|
} |
|
|
|
void DaemonQTImpl::start() |
|
{ |
|
QMutexLocker locker(mutex); |
|
setRunning(true); |
|
Daemon.start(); |
|
} |
|
|
|
void DaemonQTImpl::stop() |
|
{ |
|
QMutexLocker locker(mutex); |
|
Daemon.stop(); |
|
setRunning(false); |
|
} |
|
|
|
void DaemonQTImpl::restart() |
|
{ |
|
QMutexLocker locker(mutex); |
|
stop(); |
|
start(); |
|
} |
|
|
|
void DaemonQTImpl::setRunningCallback(runningChangedCallback cb) |
|
{ |
|
m_RunningChangedCallback = cb; |
|
} |
|
|
|
bool DaemonQTImpl::isRunning() |
|
{ |
|
return m_IsRunning; |
|
} |
|
|
|
void DaemonQTImpl::setRunning(bool newValue) |
|
{ |
|
bool oldValue = m_IsRunning; |
|
if(oldValue!=newValue) |
|
{ |
|
m_IsRunning = newValue; |
|
if(m_RunningChangedCallback) |
|
m_RunningChangedCallback(); |
|
} |
|
} |
|
|
|
int RunQT (int argc, char* argv[]) |
|
{ |
|
QApplication app(argc, argv); |
|
int result; |
|
|
|
{ |
|
std::shared_ptr<std::iostream> logstreamptr= |
|
#ifdef DEBUG_WITH_DEFAULT_LOGGING |
|
nullptr |
|
#else |
|
std::make_shared<std::stringstream>() |
|
#endif |
|
; |
|
//TODO move daemon init deinit to a bg thread |
|
DaemonQTImpl daemon; |
|
if(logstreamptr) (*logstreamptr) << "Initialising the daemon..." << std::endl; |
|
bool daemonInitSuccess = daemon.init(argc, argv, logstreamptr); |
|
if(!daemonInitSuccess) |
|
{ |
|
QMessageBox::critical(0, "Error", "Daemon init failed"); |
|
return 1; |
|
} |
|
LogPrint(eLogDebug, "Initialised, creating the main window..."); |
|
MainWindow w(logstreamptr); |
|
LogPrint(eLogDebug, "Before main window.show()..."); |
|
w.show (); |
|
|
|
{ |
|
i2p::qt::Controller daemonQtController(daemon); |
|
w.setI2PController(&daemonQtController); |
|
LogPrint(eLogDebug, "Starting the daemon..."); |
|
emit daemonQtController.startDaemon(); |
|
//daemon.start (); |
|
LogPrint(eLogDebug, "Starting GUI event loop..."); |
|
result = app.exec(); |
|
//daemon.stop (); |
|
} |
|
} |
|
|
|
//QMessageBox::information(&w, "Debug", "demon stopped"); |
|
LogPrint(eLogDebug, "Exiting the application"); |
|
return result; |
|
} |
|
} |
|
} |
|
|
|
|