aboutsummaryrefslogtreecommitdiff
path: root/src/session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.cpp')
-rw-r--r--src/session.cpp320
1 files changed, 103 insertions, 217 deletions
diff --git a/src/session.cpp b/src/session.cpp
index a524afe..25a8512 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -26,194 +26,60 @@
#include "session.h"
-Session::Session(QObject *parent, MainQMLAdaptor* main_gui, RWAHost *host) : QObject(parent) {
- Q_ASSERT(main_gui != nullptr);
+Session::Session(DBusAPI *dbus_api, RWAHost *host) : QObject() {
Q_ASSERT(host != nullptr);
+ Q_ASSERT(dbus_api != nullptr);
- _dbus_api = new DBusAPI();
- _main_gui = main_gui;
+ _dbus_api = dbus_api;
_host = host;
- // QML -> MainQMLAdaptor::handleConnectButtonClick --onConnectButtonClick--> this::handleConnectButtonClick
- QObject::connect(_main_gui,
- 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)));
-
- // session::setURL --urlChanged--> MainQMLAdaptor::setURL --urlChanged--> QML
- QObject::connect(this,
- 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)));
-
- // QML -> MainQMLAdaptor::onCloseHandler --onCloseSignal--> session::onCloseHandler
- QObject::connect(main_gui,
- 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 got triggered just now.";
- this->status();
-}
-
-void Session::init_vars() {
setPin("-----");
setSessionID("-----");
setURL(tr("Not available yet"));
setStatus("unknown");
-
- _main_gui->setConnectButtonChecked(false);
- _main_gui->setConnectButtonEnabled(true);
- _main_gui->setStatusIndicator(false);
-
- _minimizedBefore = false;
+ started = false;
}
-QString Session::getStatus() {
- return _status;
+Session::~Session() {
+ qDebug().noquote() << QString("Session #'%0' on host '%1' will be deconstructed.")
+ .arg(getSessionID())
+ .arg(getHost()->alias());
+ stop();
+ disconnect();
}
-QString Session::getURL() {
- return _url;
-}
-
-QString Session::getSessionID() {
- return QString(_session_id);
-}
+void Session::statusTimerEvent() {
+ qDebug() << "Status timer event triggered";
-QString Session::getPin() {
- return _pin;
+ refresh_status();
}
-bool Session::isSessionAliveOrRunning(QString status) {
- if (status == "running" || status == "active") {
+bool Session::isSessionAliveOrRunning() {
+ if (getStatus() == "running" || getStatus() == "active") {
return true;
} else {
return false;
}
}
-void Session::minimizeWindow() {
- if (!_minimizedBefore) {
- qDebug() << "Minimizing window now...";
- emit _main_gui->minimizeWindow();
- _minimizedBefore = true;
- }
+RWAHost* Session::getHost() {
+ return _host;
}
-void Session::setStatus(QString status) {
- _status = status;
+QString Session::getStatus() {
+ return _status;
+}
- QString guiString = tr("Unknown state of service");
- _main_gui->setStatusIndicator(false);
-
- qDebug() << "setStatus(): Setting status to " << status;
-
- if (status == "running") {
- /* Session is running but no one is connected yet */
- guiString = tr("Remote Support session is ready to be connected to");
- _main_gui->setStatusIndicator(true, QColor(255, 255, 0, 127));
- } else if (status == "dead") {
- /* Session died */
- guiString = tr("Remote Support session was stopped ungracefully");
-
- // Clear current variables
- this->init_vars();
- _main_gui->setStatusIndicator(true, QColor(255, 0, 0, 127));
-
- emit _main_gui->showWindow();
-
- _main_gui->showToast(tr("Remote Support session was "
- "stopped ungracefully"), 5000);
- } else if (status == "stopped") {
- /* Session is stopped */
- guiString = tr("Remote Support session was stopped");
-
- // Clear current variables
- this->init_vars();
-
- emit _main_gui->showWindow();
-
- _main_gui->showToast(tr("Remote Support session was stopped"), 5000);
- } else if (status == "active") {
- /* Partner is connected */
- QTimer::singleShot(1000, this, &Session::minimizeWindow);
- guiString = tr("Your partner is connected to the Remote Support session");
- _main_gui->setStatusIndicator(true, QColor(0, 255, 0, 127));
-
- } else if (status == "waiting_start_request_answer") {
- /* When pressing on start button display following message while waiting */
- guiString = tr("Trying to reach session service...");
- } else if (status == "start_session_error") {
- /* Session couldn't be started */
- guiString = tr("Remote Support session couldn't be started!");
- _main_gui->setStatusIndicator(true, QColor(255, 0, 0, 127));
-
- _main_gui->showToast(tr("An error occured while trying "
- "to start a session!"), 5000);
- } else if (status == "start_session_success") {
- /* Session successfully started */
- guiString = tr("Remote Support session successfully started!");
- _main_gui->setStatusIndicator(true, QColor(255, 255, 0, 127));
-
- _main_gui->showToast(QString(tr("Session was started "
- "on '%0' successfully"))
- .arg(_host->alias()));
- } else if (status == "status_session_error") {
- /* Session's status couldn't be refreshed */
- _main_gui->showToast(tr("Session status could not be refreshed!"), 5000);
- guiString = tr("Session status could not be refreshed!") + "\n" +
- tr("remote support partner could still be connected!");
- _main_gui->setStatusIndicator(true, QColor(255, 0, 0, 127));
-
- emit _main_gui->showWindow();
- } else if (status == "stop_session_error") {
- /* Session couldn't be stopped */
- _main_gui->showToast(tr("Session could not be stopped!"), 5000);
- guiString = tr("Session could not be stopped!") + "\n" +
- tr("remote support partner could still be connected!");
- _main_gui->setStatusIndicator(true, QColor(255, 0, 0, 127));
-
- emit _main_gui->showWindow();
- }
+QString Session::getURL() {
+ return _url;
+}
- _main_gui->setStatus(guiString);
+QString Session::getSessionID() {
+ return _session_id;
+}
- emit statusChanged(_status);
+QString Session::getPin() {
+ return _pin;
}
void Session::setURL(QString url) {
@@ -231,49 +97,62 @@ void Session::setPin(QString pin) {
emit pinChanged(pin);
}
-void Session::handleConnectButtonClick(bool checked) {
- qDebug() << "-----Connect button handler-----" <<
- "\nCurrent session #" << this->getSessionID();
-
- // Stopping even if nothing is running
- _dbus_api->stop_request(_host, this->getSessionID());
+void Session::setHost(RWAHost *host) {
+ _host = host;
+ emit hostChanged(host);
+}
- if (checked) {
- // Start the Session again
- _dbus_api->start_request(_host);
- }
- qDebug() << "-----\\Connect button handler-----";
+void Session::setStatus(QString status) {
+ _status = status;
+ emit statusChanged(status);
}
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");
-
_dbus_api->start_request(_host);
}
void Session::start_response(QJsonDocument *doc) {
- Q_ASSERT(doc != nullptr);
+ // Q_ASSERT lets the program crash immediatly after method call
+ // when the session service is not started.
+ // Don't use Q_ASSERT(doc != nullptr); instead use:
+ if (doc == nullptr) {
+ emit startFailed(tr("Can't connect to underlying session service! "
+ "Is the session service started?"));
+ return;
+ }
// Get the QJsonObject
QJsonObject jObject = doc->object();
QVariantMap mainMap = jObject.toVariantMap();
// Status of request
- QString request_status = mainMap["status"].toString();
- if (request_status == "success") {
- qDebug() << "Successfully started a Session.";
- this->setStatus("start_session_success");
-
- // Immediately ask for the status of the session
- QTimer::singleShot(0, this, &Session::statusTimerEvent);
- } else {
- qCritical() << "An error occured while creating a new session!";
- this->init_vars();
- this->setStatus("start_session_error");
+ QString status = mainMap["status"].toString();
+ if (status != "success") {
+ QString type = mainMap["type"].toString();
+ QString error_message = tr("An error occured while creating a new session!");
+
+ if (type == "multiple") {
+ // TODO: Ask to stop other session via a message dialog.
+ error_message = tr("The session service is configured "
+ "to not support multiple sessions "
+ "and there is already a session running.");
+ } else if (type == "connection") {
+ error_message = tr("Couldn't connect to host '%0'.")
+ .arg(getHost()->alias());
+ } else if (type == "host_not_found") {
+ error_message = tr("The RWA host '%0' couldn't be found.")
+ .arg(getHost()->alias());
+ } else if (type == "permission_denid") {
+ error_message = tr("The RWA host '%0' doesn't grant access.")
+ .arg(getHost()->alias());
+ } else if (type == "unsupported_server") {
+ error_message = tr("The RWA host '%0' is not supported.")
+ .arg(getHost()->alias());
+ }
+
+ setStatus("start_session_error");
+ qCritical().noquote() << error_message;
+ emit startFailed(error_message);
return;
}
@@ -285,23 +164,25 @@ void Session::start_response(QJsonDocument *doc) {
// PIN
long long pin = mainMap["pin"].toLongLong(&ok);
- this->setPin(QString::number(pin));
// Sanity Check
if(ok == false){
- qErrnoWarning("Unable to parse <pin> out of dbus answer!");
- init_vars();
+ QString error_message = "Unable to parse <pin> into longo long out of dbus answer!";
+ qCritical().noquote() << error_message;
+ emit startFailed(error_message);
return;
}
+ this->setPin(QString::number(pin));
// session_id = remote support id from the rwa-server
long long session_id = mainMap["session_id"].toLongLong();
- this->setSessionID(QString::number(session_id));
// Sanity Check
if(ok == false){
- qErrnoWarning("Unable to parse <pin> out of dbus answer!");
- init_vars();
+ QString error_message = "Unable to parse <session_id> into long long out of dbus answer!";
+ qCritical().noquote() << error_message;
+ emit startFailed(error_message);
return;
}
+ this->setSessionID(QString::number(session_id));
qDebug() << "Got session_id:" << session_id <<
"\nGot url:" << url <<
@@ -347,39 +228,44 @@ void Session::stop_response(QJsonDocument *doc) {
QString new_status = mainMap["status"].toString();
qDebug() << "stop_response() retrieved json. Status now:" << new_status;
- // Clear current variables
- this->init_vars();
+ started = false;
- // But the status indicator should display that the Session has stopped
this->setStatus(new_status);
+
+ emit stopSucceeded();
}
void Session::status() {
- _dbus_api->status_request(_host, this->getSessionID());
+ _dbus_api->status_request(getHost(), this->getSessionID());
+}
+
+void Session::refresh_status() {
+ _dbus_api->refresh_status_request(getHost(), this->getSessionID());
}
void Session::status_response(QJsonDocument *doc) {
- Q_ASSERT(doc != nullptr);
+ // Q_ASSERT lets the program crash immediatly after method call,
+ // when the session service is not started.
+ // Don't use Q_ASSERT(doc != nullptr); instead use:
+ if (doc == nullptr) {
+ if (!_emitted_status_error_already) {
+ emit statusFailed(tr("Can't connect to underlying session service! "
+ "Is the session service started?"));
+
+ _emitted_status_error_already = true;
+ }
+
+ return;
+ }
+
+ _emitted_status_error_already = false;
QJsonObject jObject = doc->object();
QVariantMap mainMap = jObject.toVariantMap();
QString new_status = mainMap["status"].toString();
qDebug() << "status_response() retrieved json. Status:" << new_status;
- // Enable (dis)connect button
- _main_gui->setConnectButtonEnabled(true);
-
- this->setStatus(new_status);
-
- if (this->isSessionAliveOrRunning(new_status)) {
- qDebug() << "Session is still alive or running. -> Restarting the status timer.";
-
- // Ask status every 1000 millisecond
- QTimer::singleShot(1000, this, &Session::statusTimerEvent);
- }
-}
+ setStatus(new_status);
-void Session::onCloseHandler() {
- // To cleanup things here
- _dbus_api->stop_request(_host, this->getSessionID());
+ emit statusSucceeded();
}