aboutsummaryrefslogtreecommitdiff
path: root/src/session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.cpp')
-rw-r--r--src/session.cpp270
1 files changed, 66 insertions, 204 deletions
diff --git a/src/session.cpp b/src/session.cpp
index f3aa168..1ee4eef 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -26,51 +26,74 @@
#include "session.h"
-Session::Session(QObject *parent, MainQMLAdaptor* main_gui) : QObject(parent) {
- _initDBus();
+Session::Session(QObject *parent, MainQMLAdaptor* main_gui, RWAHost *host) : QObject(parent) {
+ Q_ASSERT(main_gui != nullptr);
+ Q_ASSERT(host != nullptr);
+ _dbus_api = new DBusAPI();
_main_gui = main_gui;
+ _host = host;
// QML -> MainQMLAdaptor::handleConnectButtonClick --onConnectButtonClick--> this::handleConnectButtonClick
QObject::connect(_main_gui,
- SIGNAL(onConnectButtonClick(bool)),
- this,
- SLOT(handleConnectButtonClick(bool)));
+ SIGNAL(onConnectButtonClick(bool)),
+ this,
+ SLOT(handleConnectButtonClick(bool)));
// session::setPin --pinChanged--> MainQMLAdaptor::setPin --pinChanged--> QML
QObject::connect(this,
- SIGNAL(pinChanged(QString)),
- main_gui,
- SLOT(setPin(QString)));
+ SIGNAL(pinChanged(QString)),
+ main_gui,
+ SLOT(setPin(QString)));
+
// session::setURL --urlChanged--> MainQMLAdaptor::setURL --urlChanged--> QML
QObject::connect(this,
- SIGNAL(urlChanged(QString)),
- main_gui,
- SLOT(setURL(QString)));
+ SIGNAL(urlChanged(QString)),
+ main_gui,
+ SLOT(setURL(QString)));
+
// session::setSessionID --sessionIDChanged--> MainQMLAdaptor::setSessionID --sessionIDChanged--> QML
QObject::connect(this,
- SIGNAL(sessionIDChanged(QString)),
- main_gui,
- SLOT(setSessionID(QString)));
+ SIGNAL(sessionIDChanged(QString)),
+ main_gui,
+ SLOT(setSessionID(QString)));
// QML -> MainQMLAdaptor::onCloseHandler --onCloseSignal--> session::onCloseHandler
QObject::connect(main_gui,
- SIGNAL(onCloseSignal()),
- this,
- SLOT(onCloseHandler()));
+ SIGNAL(onCloseSignal()),
+ this,
+ SLOT(onCloseHandler()));
+
+ // _dbus_api --sessionStartResponse-> this.start_response()
+ QObject::connect(_dbus_api,
+ SIGNAL(serviceStartResponse(QJsonDocument*)),
+ this,
+ SLOT(start_response(QJsonDocument*)));
+
+ // _dbus_api --sessionStopResponse-> this.stop_response()
+ QObject::connect(_dbus_api,
+ SIGNAL(serviceStopResponse(QJsonDocument*)),
+ this,
+ SLOT(stop_response(QJsonDocument*)));
+
+ // _dbus_api --sessionStatusResponse-> this.status_response()
+ QObject::connect(_dbus_api,
+ SIGNAL(serviceStatusResponse(QJsonDocument*)),
+ this,
+ SLOT(status_response(QJsonDocument*)));
+
this->init_vars();
}
void Session::statusTimerEvent() {
- qDebug() << "Status timer event triggered";
- this->refresh_status_request_dbus(this->getHostID(), this->getID());
+ qDebug() << "Status timer event got triggered just now.";
+ this->status();
}
void Session::init_vars() {
setPin("-----");
setSessionID("-----");
- setID("-----");
setURL(tr("Not available yet"));
setStatus("unknown");
@@ -89,18 +112,10 @@ QString Session::getURL() {
return _url;
}
-QString Session::getID() {
- return QString(_id);
-}
-
QString Session::getSessionID() {
return QString(_session_id);
}
-QString Session::getHostID() {
- return QString(_host_id);
-}
-
QString Session::getPin() {
return _pin;
}
@@ -201,11 +216,6 @@ void Session::setURL(QString url) {
emit urlChanged(url);
}
-void Session::setID(QString id) {
- _id = id;
- emit idChanged(id);
-}
-
void Session::setSessionID(QString session_id) {
_session_id = session_id;
emit sessionIDChanged(session_id);
@@ -218,79 +228,33 @@ void Session::setPin(QString pin) {
void Session::handleConnectButtonClick(bool checked) {
qDebug() << "-----Connect button handler-----" <<
- "\nCurrent service-session #" << this->getID() <<
- "\nCurrent support-session #" << this->getSessionID();
+ "\nCurrent session #" << this->getSessionID();
// Stopping even if nothing is running
- this->stop_request_dbus(this->getID());
+ _dbus_api->stop_request(_host, this->getSessionID());
if (checked) {
// Start the Session again
- this->start_request_dbus(getHostID());
+ _dbus_api->start_request(_host);
}
qDebug() << "-----\\Connect button handler-----";
}
-void Session::_initDBus() {
- if (!QDBusConnection::sessionBus().isConnected()) {
- qCritical() << "Cannot connect to the D-Bus session bus.";
- }
-
- // Create DBus object
- _dbus_rwa = new OrgArcticaProjectRWASupportSessionServiceInterface("org.ArcticaProject.RWASupportSessionService", "/RWASupportSessionService",
- QDBusConnection::sessionBus(), this->parent());
-
- qDebug("Initialized DBus object!");
-}
-
-void Session::start_request_dbus(QString host_id) {
- qDebug() << "Requesting D-Bus session service to start a new session on host: " << host_id;
- bool ok;
- host_id.toLongLong(&ok);
- if(ok == false){
- qErrnoWarning("Unable to convert <QString> id to <long long>");
- return;
- }
-
- // Make an asynchrous 'start' call (Response will be sent to 'start_dbus_replied')
- QDBusPendingCall async = _dbus_rwa->asyncCall("start", host_id);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
-
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(start_dbus_replied(QDBusPendingCallWatcher*)));
-
+void Session::start() {
// Disable connect button to reduce spam.
// And don't enable it as long there is no status update.
// (Or something fails)
_main_gui->setConnectButtonEnabled(false);
this->setStatus("waiting_start_request_answer");
-}
-void Session::start_dbus_replied(QDBusPendingCallWatcher *call) {
- QString result = "";
-
- QDBusPendingReply<QString> reply = *call;
- if (reply.isError()) {
- qDebug() << "D-Bus 'start' request failed, this was the reply:";
- qDebug() << reply.error();
-
- // The user should have the oportunity to try again.
- this->init_vars();
-
- qCritical() << "An error occured while creating a new session!";
- this->setStatus("start_session_error");
-
- return;
- } else {
- result = reply.argumentAt<0>();
- }
- call->deleteLater();
+ _dbus_api->start_request(_host);
+}
- qDebug() << "Raw JSON from starting session is:" << result;
- QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8());
+void Session::start_response(QJsonDocument *doc) {
+ Q_ASSERT(doc != nullptr);
// Get the QJsonObject
- QJsonObject jObject = doc.object();
+ QJsonObject jObject = doc->object();
QVariantMap mainMap = jObject.toVariantMap();
// Status of request
@@ -308,16 +272,7 @@ void Session::start_dbus_replied(QDBusPendingCallWatcher *call) {
return;
}
- // Service ID == PID
bool ok;
- long long service_id = mainMap["id"].toLongLong(&ok);
- this->setID(QString::number(service_id));
- // Sanity Check
- if(ok == false){
- qErrnoWarning("Unable to parse <service_id> out of dbus answer!");
- init_vars();
- return;
- }
// URL of remote web app frontend
QString url = mainMap["url"].toString();
@@ -343,37 +298,17 @@ void Session::start_dbus_replied(QDBusPendingCallWatcher *call) {
return;
}
- qDebug() << "Got service_id:" << service_id <<
- "\nGot session_id:" << session_id <<
+ qDebug() << "Got session_id:" << session_id <<
"\nGot url:" << url <<
"\nGot pin:" << pin;
emit pinChanged(QString::number(pin));
emit urlChanged(url);
- emit idChanged(QString::number(service_id));
emit sessionIDChanged(QString::number(session_id));
}
-void Session::stop_request_dbus(QString id) {
- bool ok;
- if (id.toLongLong(&ok) == 0 ){
- qDebug() << "Won't send a request to D-Bus service to stop a session when session ID == 0";
- return;
- }
- if(ok == false){
- qErrnoWarning("Unable to convert <QString> id to <long long>");
- return;
- }
-
- // Stopping now.
- qDebug() << "Requesting D-Bus session service to stop session #" << id;
-
- // Make an asynchrous 'stop' call (Response will be sent to 'stop_dbus_replied')
- QDBusPendingCall async = _dbus_rwa->asyncCall("stop", id);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
-
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(stop_dbus_replied(QDBusPendingCallWatcher*)));
+void Session::stop() {
+ _dbus_api->stop_request(_host, this->getSessionID());
// Clear current variables
this->init_vars();
@@ -384,30 +319,14 @@ void Session::stop_request_dbus(QString id) {
_main_gui->setConnectButtonEnabled(false);
}
-void Session::stop_dbus_replied(QDBusPendingCallWatcher *call) {
- QString result = "";
-
- QDBusPendingReply<QString> reply = *call;
- if (reply.isError()) {
- qDebug() << "D-Bus 'stop' request failed, this was the reply:";
- qDebug() << reply.error();
-
- this->init_vars();
- this->setStatus("stop_session_error");
-
- return;
- } else {
- result = reply.argumentAt<0>();
- }
- call->deleteLater();
+void Session::stop_response(QJsonDocument *doc) {
+ Q_ASSERT(doc != nullptr);
- // Get the QJsonObject
- QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8());
- QJsonObject jObject = doc.object();
+ QJsonObject jObject = doc->object();
QVariantMap mainMap = jObject.toVariantMap();
QString new_status = mainMap["status"].toString();
- qDebug() << "stop_dbus_replied(): Refreshed status:" << new_status;
+ qDebug() << "stop_response() retrieved json. Status now:" << new_status;
// Clear current variables
this->init_vars();
@@ -416,74 +335,17 @@ void Session::stop_dbus_replied(QDBusPendingCallWatcher *call) {
this->setStatus(new_status);
}
-void Session::status_request_dbus(QString id) {
- bool ok;
- if (id.toLongLong(&ok) == 0 ){
- qDebug() << "Won't send a request to D-Bus service of a session's status when session ID == 0";
- return;
- }
- if(ok == false){
- qErrnoWarning("Unable to convert <QString> id to <long long>");
- return;
- }
-
- // Requesting status now.
- qDebug() << "Requesting status for session #" << id;
-
- // Make an asynchrous 'status' call (Response will be sent to 'status_dbus_replied')
- QDBusPendingCall async = _dbus_rwa->asyncCall("status", id);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
-
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(stop_dbus_replied(QDBusPendingCallWatcher*)));
+void Session::status() {
+ _dbus_api->status_request(_host, this->getSessionID());
}
-void Session::refresh_status_request_dbus(QString host_id, QString id) {
- bool ok;
- if (id.toLongLong(&ok) == 0){
- qDebug() << "Won't send a request to D-Bus service to refresh the status of a session when session ID == 0";
- return;
- }
- if(ok == false){
- qErrnoWarning("Unable to convert <QString> id to <long long>");
- return;
- }
-
- // Refreshing status
- qDebug() << "Requesting status refresh for session #" << id;
-
- // Make an asynchrous 'refresh_status' call (Response will be sent to 'status_dbus_replied')
- QDBusPendingCall async = _dbus_rwa->asyncCall("refresh_status", host_id, id);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
-
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(status_dbus_replied(QDBusPendingCallWatcher*)));
-}
+void Session::status_response(QJsonDocument *doc) {
+ Q_ASSERT(doc != nullptr);
-void Session::status_dbus_replied(QDBusPendingCallWatcher *call) {
- QString result = "";
-
- QDBusPendingReply<QString> reply = *call;
- if (reply.isError()) {
- qDebug() << "D-Bus '(refresh_)status' request failed, this was the reply:";
- qDebug() << reply.error();
-
- this->init_vars();
-
- this->setStatus("status_session_error");
-
- return;
- } else {
- result = reply.argumentAt<0>();
- }
- call->deleteLater();
-
- // Get the QJsonObject
- QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8());
- QJsonObject jObject = doc.object();
+ QJsonObject jObject = doc->object();
QVariantMap mainMap = jObject.toVariantMap();
QString new_status = mainMap["status"].toString();
- qDebug() << "status_dbus_replied(): Refreshed status:" << new_status;
+ qDebug() << "status_response() retrieved json. Status:" << new_status;
// Enable (dis)connect button
_main_gui->setConnectButtonEnabled(true);
@@ -498,5 +360,5 @@ void Session::status_dbus_replied(QDBusPendingCallWatcher *call) {
void Session::onCloseHandler() {
// To cleanup things here
- this->stop_request_dbus(this->getID());
+ _dbus_api->stop_request(_host, this->getSessionID());
}