aboutsummaryrefslogtreecommitdiff
path: root/src/scenes
diff options
context:
space:
mode:
authorDaniel Teichmann <daniel.teichmann@das-netzwerkteam.de>2021-08-09 12:34:48 +0000
committerDaniel Teichmann <daniel.teichmann@das-netzwerkteam.de>2021-08-09 12:34:48 +0000
commit607edbcd8689ea71ec57340204ed3d908a7cadbb (patch)
tree91961406adb5143e0c5072094d2d1a4846e6b6b0 /src/scenes
parent34abe223f7648929f0c6b9132fbdc83e0353b51a (diff)
parentfd5e881fdee35d21fd3e0728e5b927d04e64f459 (diff)
downloadRWA.Support.DesktopApp-607edbcd8689ea71ec57340204ed3d908a7cadbb.tar.gz
RWA.Support.DesktopApp-607edbcd8689ea71ec57340204ed3d908a7cadbb.tar.bz2
RWA.Support.DesktopApp-607edbcd8689ea71ec57340204ed3d908a7cadbb.zip
Merge branch 'mr/feature/gitlab-ci' into 'master'
Add .gitlab-ci.yml See merge request remotewebapp/rwa.support.desktopapp!2
Diffstat (limited to 'src/scenes')
-rw-r--r--src/scenes/Scene_no_server_available.qml71
-rw-r--r--src/scenes/Scene_placeholder.qml5
-rw-r--r--src/scenes/Scene_remote_view.qml5
-rw-r--r--src/scenes/Scene_settings.qml5
-rw-r--r--src/scenes/add_rwahost_wizard/Scene_step_1.qml (renamed from src/scenes/add_server_wizard/Scene_step_1.qml)127
-rw-r--r--src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp124
-rw-r--r--src/scenes/add_rwahost_wizard/add_rwahost_wizard.h61
-rw-r--r--src/scenes/add_server_wizard/Scene_step_2.qml70
-rw-r--r--src/scenes/add_server_wizard/add_server_wizard.cpp100
-rw-r--r--src/scenes/add_server_wizard/add_server_wizard.h35
-rw-r--r--src/scenes/remote_control/Scene_remote_control.qml (renamed from src/scenes/Scene_remote_control.qml)78
-rw-r--r--src/scenes/remote_control/remote_control_manager.cpp511
-rw-r--r--src/scenes/remote_control/remote_control_manager.h78
13 files changed, 1016 insertions, 254 deletions
diff --git a/src/scenes/Scene_no_server_available.qml b/src/scenes/Scene_no_server_available.qml
new file mode 100644
index 0000000..7b99b55
--- /dev/null
+++ b/src/scenes/Scene_no_server_available.qml
@@ -0,0 +1,71 @@
+import QtQuick 2.9
+import QtQuick.Window 2.2
+import QtQuick.Extras 1.4
+import QtQuick.Controls 2.2
+import QtQuick.Dialogs 1.2
+import QtQuick.Controls.Material 2.3
+
+/*!
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
+ */
+
+Item {
+ id: scene_no_server_available
+ objectName: "Scene_no_server_available"
+
+ Rectangle {
+ id: rectangle
+ anchors.fill: parent
+ color: Material.background
+
+ Text {
+ color: Material.foreground
+ id: title
+
+ text: qsTr("Welcome!")
+ font.pointSize: 20
+ font.bold: true
+ wrapMode: Text.WordWrap
+
+ horizontalAlignment: Text.AlignLeft
+
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 15
+ }
+
+ Text {
+ color: Material.foreground
+ anchors.top: title.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 15
+
+ horizontalAlignment: Text.AlignLeft
+ wrapMode: Text.WordWrap
+ /*: 'Add RWA-Server' has to be replaced with the correct translation in file main.qml .*/
+ font.pointSize: 13
+ text: qsTr("You need to add and select the remote \
+web app server to which you want to connect. \
+You can see a button to the left in the menu \
+which says 'Add RWA-Server'. Follow the steps \
+listed there and you can start your remote \
+support session afterwards using the buttons \
+above 'Add RWA-Server'.")
+ }
+ }
+}
+
+
+
+
+
+
+
+/*##^## Designer {
+ D{i:0;autoSize:true;height:480;width:640}
+}
+ ##^##*/
diff --git a/src/scenes/Scene_placeholder.qml b/src/scenes/Scene_placeholder.qml
index a5ceac9..f492e00 100644
--- a/src/scenes/Scene_placeholder.qml
+++ b/src/scenes/Scene_placeholder.qml
@@ -6,7 +6,8 @@ import QtQuick.Dialogs 1.2
import QtQuick.Controls.Material 2.3
/*!
- This .qml file is a Scene which can be loaded through for example a StackView (main_content in main.qml).
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
*/
Item {
@@ -43,7 +44,7 @@ Item {
anchors.right: parent.right
wrapMode: Text.WordWrap
- text: qsTr("The feature you expected here are not yet implemented.")
+ text: qsTr("The features you expected here are not yet implemented.")
horizontalAlignment: Text.AlignHCenter
}
}
diff --git a/src/scenes/Scene_remote_view.qml b/src/scenes/Scene_remote_view.qml
index cea5ccf..436d8aa 100644
--- a/src/scenes/Scene_remote_view.qml
+++ b/src/scenes/Scene_remote_view.qml
@@ -5,6 +5,11 @@ import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Material 2.3
+/*!
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
+ */
+
Item {
id: scene_remote_view
objectName: "Scene_remote_view"
diff --git a/src/scenes/Scene_settings.qml b/src/scenes/Scene_settings.qml
index 5a29071..e2f89da 100644
--- a/src/scenes/Scene_settings.qml
+++ b/src/scenes/Scene_settings.qml
@@ -5,6 +5,11 @@ import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Material 2.3
+/*!
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
+ */
+
Item {
id: scene_settings
objectName: "Scene_settings"
diff --git a/src/scenes/add_server_wizard/Scene_step_1.qml b/src/scenes/add_rwahost_wizard/Scene_step_1.qml
index e76462a..873e0fd 100644
--- a/src/scenes/add_server_wizard/Scene_step_1.qml
+++ b/src/scenes/add_rwahost_wizard/Scene_step_1.qml
@@ -3,9 +3,11 @@ import QtQuick.Window 2.2
import QtQuick.Extras 1.4
import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.3
+import rwa.toast.type 1.0
/*!
- This .qml file is a Scene which can be loaded through for example a StackView (main_content in main.qml).
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
*/
Item {
@@ -13,18 +15,22 @@ Item {
objectName: "Scene_step_1"
Connections {
- target: add_server_wizard
- onStep1Success: {
- //main_content_push("scenes/add_server_wizard/Scene_step_2.qml", StackView.Transition)
+ target: add_rwahost_wizard
+ function onStep1Success() {
+ // Go onto the first page of the stack.
main_content_pop(null)
- mainqmladaptor.showToast(qsTr("Successfully added server address."), 5000);
+ mainqmladaptor.showToast(qsTr("Successfully added remote web app host."),
+ 5000,
+ ToastType.ToastSuccess);
}
}
Connections {
- target: add_server_wizard
- onStep1Failed: {
- mainqmladaptor.showToast(reason, 3000);
+ target: add_rwahost_wizard
+ function onStep1Failed(reason, toast_type) {
+ mainqmladaptor.showToast(reason,
+ 5000,
+ toast_type)
}
}
@@ -42,11 +48,11 @@ Item {
anchors.rightMargin: 15
onClicked: {
- add_server_wizard.processStep1(host_url.text)
+ add_rwahost_wizard.processStep1(host_url.text, host_alias.text)
}
}
- Text {
+ /*Text {
color: Material.foreground
id: step_indicator
@@ -61,7 +67,7 @@ Item {
horizontalAlignment: Text.AlignHCenter
anchors.left: parent.left
anchors.margins: 5
- }
+ }*/
Text {
color: Material.foreground
@@ -74,12 +80,12 @@ Item {
"administrator about it please.\nBefore you can "+
"start any remote sessions you will have to "+
"be approved for remote support.")
- font.pointSize: 13
+ font.pointSize: 12
anchors.right: parent.right
anchors.rightMargin: 15
anchors.leftMargin: 15
- anchors.top: step_indicator.bottom
- anchors.topMargin: 30
+ anchors.top: parent.top //step_indicator.bottom
+ anchors.topMargin: 15
wrapMode: Text.WordWrap
anchors.left: parent.left
@@ -160,7 +166,7 @@ Item {
Text {
color: Material.foreground
- text: qsTr("RWA-server address")
+ text: qsTr("RWA host address")
anchors.left: parent.left
anchors.leftMargin: 15
anchors.verticalCenterOffset: - host_url.height / 2
@@ -176,6 +182,97 @@ Item {
}
}
}
+
+ TextField {
+ id: host_alias
+ selectByMouse: true
+ placeholderText: qsTr("My example host")
+
+ font.pixelSize: 16
+ color: Material.foreground
+
+ padding: 15
+ topPadding: 15
+
+ anchors.top: host_url.bottom
+ anchors.topMargin: 30
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.right: parent.right
+ anchors.margins: 30
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ onHoveredChanged: {
+ if (containsMouse) {
+ host_alias_background.state = "hovered"
+ } else if (!host_alias.focus) {
+ host_alias_background.state = "unhovered"
+ }
+ }
+ onClicked: {
+ host_alias.forceActiveFocus();
+ }
+ }
+
+ onFocusChanged: {
+ host_alias_background.state = host_alias.focus ? "hovered" : "unhovered"
+ }
+
+ background: Rectangle {
+ id: host_alias_background
+ color: Material.background
+ border.color: Material.foreground
+ border.width: 1
+ radius: 4
+
+ states: [
+ State {
+ name: "hovered"
+ PropertyChanges {
+ target: host_alias_background
+ border.color: "#0178EF"
+ }
+ },
+ State {
+ name: "unhovered"
+ PropertyChanges {
+ target: host_alias_background
+ border.color: Material.foreground
+ }
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "*"
+ to: "*"
+ PropertyAnimation {
+ property: "border.color"
+ duration: 100
+ easing.type: Easing.Linear
+ }
+ }
+ ]
+
+ Text {
+ color: Material.foreground
+ text: qsTr("RWA host alias")
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.verticalCenterOffset: - host_alias.height / 2
+ anchors.verticalCenter: parent.verticalCenter
+ leftPadding: 5
+
+ Rectangle {
+ color: Material.background
+ width: parent.width + 5 + 3
+ height: parent.height
+ z: -1
+ }
+ }
+ }
+ }
}
}
diff --git a/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp
new file mode 100644
index 0000000..7adbdf9
--- /dev/null
+++ b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp
@@ -0,0 +1,124 @@
+/*
+ * This file is part of Remote Support Desktop
+ * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
+ * Copyright 2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "add_rwahost_wizard.h"
+#include "../../RWADBusAdaptor.h"
+#include "../../RWAHost.h"
+
+AddRWAHostWizard::AddRWAHostWizard(QObject *parent,
+ MainQMLAdaptor *main_gui, DBusAPI *dbus_api) : QObject(parent) {
+ Q_ASSERT(main_gui != nullptr);
+ Q_ASSERT(dbus_api != nullptr);
+
+ _dbus_api = dbus_api;
+ _main_gui = main_gui;
+
+ // _dbus_api --serviceAddWebAppHostResponse-> this.add_web_app_host_response()
+ QObject::connect(_dbus_api,
+ SIGNAL(serviceAddWebAppHostResponse(QJsonDocument*)),
+ this,
+ SLOT(add_web_app_host_response(QJsonDocument*)));
+}
+
+void AddRWAHostWizard::processStep1(QString host_url, QString host_alias) {
+ qDebug() << "Processing Step 1 with args: " << host_url << host_alias;
+
+ if(host_alias == "" || host_url == "") {
+ QString reason = tr("Both textfields can't be empty!");
+ emit step1Failed(reason, Toast::ToastType::ToastWarning);
+ qDebug().noquote() << reason;
+ return;
+ }
+
+ return add_server(host_url, host_alias);
+}
+
+void AddRWAHostWizard::processStep2() {
+ qDebug() << "Processing Step 2 with args: No Args.";
+ emit step2Failed(tr("The features you expected here are not yet implemented."), Toast::ToastType::ToastWarning);
+ // Just show placeholder scene now.
+ emit step2Success();
+}
+
+void AddRWAHostWizard::add_server(QString host_url, QString host_alias) {
+ _dbus_api->add_web_app_host_request(host_url, host_alias);
+}
+
+void AddRWAHostWizard::add_web_app_host_response(QJsonDocument *doc) {
+ // Q_ASSERT lets the program crash immediatly at startup,
+ // when the session service is not started.
+ // Don't use Q_ASSERT(doc != nullptr); instead use:
+ if (doc == nullptr) {
+ _main_gui->setRWAHostSelected(false);
+ _main_gui->showToast(tr("Can't connect to underlying session service!"),
+ 9800,
+ Toast::ToastType::ToastError);
+ 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") {
+ _dbus_api->get_web_app_hosts_request();
+
+ qInfo() << "Successfully added a new RWAHost.";
+ emit step1Success();
+ } else {
+ qCritical().noquote() << tr("An error occured while adding a new host!");
+
+ uint toast_type = Toast::ToastType::ToastStandard;
+ QString reason = tr("An error occured while adding a new host!");
+ QString type = mainMap["type"].toString();
+
+ if(type == "connection"){
+ reason = tr("Couldn't connect to the specified host!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ } else if (type == "duplicate") {
+ reason = tr("The specified host was already added!");
+ toast_type = Toast::ToastType::ToastWarning;
+ qCritical().noquote() << reason;
+ } else if (type == "invalid_url") {
+ reason = tr("The specified host address is not valid!");
+ toast_type = Toast::ToastType::ToastWarning;
+ qCritical().noquote() << reason;
+ } else if (type == "permission_denied") {
+ reason = tr("The specified host address does not grant access!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ } else if (type == "unsupported_server") {
+ reason = tr("The specified host address is not supported!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ }
+ emit step1Failed(reason, toast_type);
+
+ return;
+ }
+}
diff --git a/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h
new file mode 100644
index 0000000..f019be1
--- /dev/null
+++ b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h
@@ -0,0 +1,61 @@
+/*
+ * This file is part of Remote Support Desktop
+ * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
+ * Copyright 2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef ADD_RWAHOST_WIZARD_H
+#define ADD_RWAHOST_WIZARD_H
+
+#include <QObject>
+
+#include "../../RWADBusAdaptor.h"
+#include "../../DBusAPI.h"
+#include "../../main_qmladaptor.h"
+
+class AddRWAHostWizard : public QObject
+{
+ Q_OBJECT
+public:
+ explicit AddRWAHostWizard(QObject *parent = nullptr,
+ MainQMLAdaptor *main_gui = nullptr,
+ DBusAPI *dbus_api = nullptr);
+ void add_server(QString host_url, QString host_alias);
+
+private:
+ DBusAPI *_dbus_api;
+ MainQMLAdaptor *_main_gui;
+
+signals:
+ void step1Success();
+ void step1Failed(QString reason, uint toast_type);
+ void step2Success();
+ void step2Failed(QString reason, uint toast_type);
+
+public slots:
+ void processStep1(QString host_url, QString host_alias);
+ void processStep2();
+
+ void add_web_app_host_response(QJsonDocument *doc);
+};
+
+#endif // ADD_SERVER_WIZARD_H
diff --git a/src/scenes/add_server_wizard/Scene_step_2.qml b/src/scenes/add_server_wizard/Scene_step_2.qml
deleted file mode 100644
index 5cfbe46..0000000
--- a/src/scenes/add_server_wizard/Scene_step_2.qml
+++ /dev/null
@@ -1,70 +0,0 @@
-import QtQuick 2.9
-import QtQuick.Window 2.2
-import QtQuick.Extras 1.4
-import QtQuick.Controls 2.2
-import QtQuick.Dialogs 1.2
-import QtQuick.Controls.Material 2.3
-
-/*!
- This .qml file is a Scene which can be loaded through for example a StackView (main_content in main.qml).
- */
-
-Item {
- id: scene_server_wizard_step_2
- objectName: "Scene_step_2"
-
- Connections {
- target: add_server_wizard
- onStep2Success: {
- main_content_pop(null, StackView.Transition)
- //main_content_replace("scenes/Scene_placeholder.qml", StackView.Transition)
- }
- }
-
- Connections {
- target: add_server_wizard
- onStep2Failed: {
- mainqmladaptor.showToast(reason, 3000);
- }
- }
-
- Rectangle {
- id: rectangle
- anchors.fill: parent
- color: Material.background
-
- Text {
- color: Material.foreground
- id: title
-
- text: qsTr("Step 2")
- font.pointSize: 18
- wrapMode: Text.WordWrap
-
- font.bold: true
- horizontalAlignment: Text.AlignHCenter
- anchors.verticalCenter: parent.verticalCenter
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.margins: 5
- }
-
- Button {
- id: next_step2_button
- text: qsTr("Next Step")
- anchors.bottom: parent.bottom
- anchors.bottomMargin: 10
- anchors.right: parent.right
- anchors.rightMargin: 10
-
- onClicked: {
- add_server_wizard.processStep2()
- }
- }
- }
-}
-
-/*##^## Designer {
- D{i:0;autoSize:true;height:480;width:640}
-}
- ##^##*/
diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp
deleted file mode 100644
index f8d4b7b..0000000
--- a/src/scenes/add_server_wizard/add_server_wizard.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "add_server_wizard.h"
-#include "../../RWADBusAdaptor.h"
-#include <QDebug>
-#include <QtDBus>
-#include <QDBusPendingCallWatcher>
-
-Add_Server_wizard::Add_Server_wizard(QObject *parent) : QObject(parent) {
- _initDBus();
-
-
-}
-
-bool Add_Server_wizard::processStep1(QString host_url) {
- qDebug() << "Processing Step 1 with args: " << host_url;
-
- if(host_url == "") {
- emit step1Failed(tr("This field can't be empty!"));
- return false;
- }
-
- return _add_server(host_url);
-}
-
-bool Add_Server_wizard::processStep2() {
- qDebug() << "Processing Step 2 with args: No Args.";
- emit step2Failed(tr("The feature you expected here are not yet implemented."));
- // Just show placeholder scene now.
- emit step2Success();
- return false;
-}
-
-bool Add_Server_wizard::_add_server(QString host_url) {
- return _add_web_app_host(host_url);
-}
-
-void Add_Server_wizard::_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!");
-}
-
-bool Add_Server_wizard::_add_web_app_host(QString host_url) {
- qDebug() << "Requesting D-Bus session service to add a new host: " << host_url;
-
- // Make an asynchrous 'add_web_app_host' call (Response will be sent to '_add_web_app_host_dbus_replied')
- QDBusPendingCall async = _dbus_rwa->asyncCall("add_web_app_host", host_url);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);
-
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- this, SLOT(_add_web_app_host_dbus_replied(QDBusPendingCallWatcher*)));
-
- return true;
-}
-
-void Add_Server_wizard::_add_web_app_host_dbus_replied(QDBusPendingCallWatcher *call) {
- QString result = "";
-
- QDBusPendingReply<QString> reply = *call;
- if (reply.isError()) {
- qDebug() << "D-Bus 'add_web_app_host' request failed, this was the reply:";
- qDebug() << reply.error();
- return;
- } else {
- result = reply.argumentAt<0>();
- }
- call->deleteLater();
-
- qDebug() << "Raw JSON from starting session is:" << result.toUtf8().replace('"', "");
- QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8());
-
- // 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.";
- emit step1Success();
- } else {
- qCritical() << "An error occured while adding a new host!";
-
- QString reason = "An error occured while adding a new host!";
- QString type = mainMap["type"].toString();
- if(type == "connection"){
- reason = tr("Couldn't connect to the specified host!");
- } else if (type == "duplicate") {
- reason = tr("The specified host was already added!");
- } else if (type == "invalid_url") {
- reason = tr("The specified host address is not valid!");
- }
- emit step1Failed(reason);
- }
-}
diff --git a/src/scenes/add_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h
deleted file mode 100644
index 1feec9b..0000000
--- a/src/scenes/add_server_wizard/add_server_wizard.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef ADD_SERVER_WIZARD_H
-#define ADD_SERVER_WIZARD_H
-
-#include "../../RWADBusAdaptor.h"
-#include <QObject>
-
-class Add_Server_wizard : public QObject
-{
- Q_OBJECT
-public:
- explicit Add_Server_wizard(QObject *parent = nullptr);
-
-private:
- bool _add_server(QString host_url);
- bool _add_web_app_host(QString host_url);
-
- OrgArcticaProjectRWASupportSessionServiceInterface *_dbus_rwa;
- void _initDBus();
-
-signals:
- void step1Success();
- void step1Failed(QString reason);
- void step2Success();
- void step2Failed(QString reason);
-
-public slots:
- bool processStep1(QString host_url);
- bool processStep2();
-
- void _add_web_app_host_dbus_replied(QDBusPendingCallWatcher *call);
- //void _get_web_app_hosts_dbus_replied(QDBusPendingCallWatcher *call);
- //void _remove_web_app_host_dbus_replied(QDBusPendingCallWatcher *call);
-};
-
-#endif // ADD_SERVER_WIZARD_H
diff --git a/src/scenes/Scene_remote_control.qml b/src/scenes/remote_control/Scene_remote_control.qml
index ea59ea7..dc152ef 100644
--- a/src/scenes/Scene_remote_control.qml
+++ b/src/scenes/remote_control/Scene_remote_control.qml
@@ -5,27 +5,34 @@ import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Material 2.3
+/*!
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
+ */
+
Item {
id: scene_remote_control
objectName: "Scene_remote_control"
Label {
id: dbus_api_status_text
- text: "Unknown state of Service"
+ text: qsTr("Unknown state of session service.")
anchors.leftMargin: 10 + 5 + dbus_api_status_indicator.width
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ wrapMode: Text.WordWrap
+ anchors.rightMargin: 10
verticalAlignment: Text.AlignVCenter
font.pointSize: 11
fontSizeMode: Text.Fit
objectName: "dbus_api_status_text"
anchors.left: parent.left
+ anchors.right: parent.right
StatusIndicator {
id: dbus_api_status_indicator
width: height
- height: parent.height
+ height: 20
objectName: "dbus_api_status_indicator"
color: "#73d216"
anchors.verticalCenter: parent.verticalCenter
@@ -37,25 +44,25 @@ Item {
Label {
id: explain_function_label
- text: qsTr("Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer.")
- font.pixelSize: 18
- fontSizeMode: Text.VerticalFit
+ text: qsTr("Please tell your remote support \
+partner your access address and \
+your access-PIN to let your partner \
+connect to this computer.")
wrapMode: Text.WordWrap
- anchors.left: parent.left
+ font.pixelSize: 18
+ anchors.topMargin: 10
anchors.leftMargin: 10
+ anchors.rightMargin: 10
anchors.top: parent.top
- anchors.topMargin: 10
+ anchors.left: parent.left
anchors.right: parent.right
- anchors.rightMargin: 10
horizontalAlignment: Text.AlignLeft
- enabled: false
color: Material.theme == Material.Light ? "#000000" : "#FFFFFF"
}
Rectangle {
id: dbus_api_status_line
- y: 379
height: 1
radius: 1
anchors.right: parent.right
@@ -113,7 +120,7 @@ Item {
TextEdit {
id: url_text
height: parent.height/2
- text: mainqmladaptor.url
+ text: remote_control_manager.url
anchors.rightMargin: 10 + copy_url_to_clipboard_button.width
anchors.right: parent.right
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
@@ -155,19 +162,21 @@ Item {
y: -26
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
- source: "../../images/into-clipboard.svg"
+ source: "../../../images/into-clipboard.svg"
opacity: 0.65
}
onClicked: {
- mainqmladaptor.handleCopyToClipboardButtonClick(url_text.text);
- toast.show(qsTr("Copied access address into clipboard!"), "1000");
+ remote_control_manager.handleCopyToClipboardButtonClick(url_text.text);
+ toast.show(qsTr("Copied access address into clipboard!"),
+ "5000",
+ mainqmladaptor.ToastInfo);
}
ToolTip.text: qsTr("Copy the access address into the clipboard")
hoverEnabled: true
- ToolTip.delay: 1000
+ ToolTip.delay: 600
ToolTip.timeout: 5000
ToolTip.visible: hovered
}
@@ -200,7 +209,7 @@ Item {
objectName: "session_id_text"
id: session_id_text
height: parent.height/2
- text: mainqmladaptor.session_id
+ text: remote_control_manager.session_id
font.letterSpacing: 10
anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width
anchors.right: parent.right
@@ -214,9 +223,9 @@ Item {
Rectangle {
radius: 5
color: Material.theme == Material.Light ? "#F0F0F0" : "#383838"
- height: url_text.height
+ height: session_id_text.height
// whole line + copy-into-clipboard button + some margin
- width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5
+ width: session_id_text.width + copy_session_id_to_clipboard_button.width + 5 + 5
x: 0; y: 0
z: -1
}
@@ -241,19 +250,21 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
opacity: 0.65
anchors.verticalCenter: parent.verticalCenter
- source: "../../images/into-clipboard.svg"
+ source: "../../../images/into-clipboard.svg"
fillMode: Image.PreserveAspectFit
}
onClicked: {
- mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text);
- toast.show(qsTr("Copied session-ID into clipboard!"), "1000");
+ remote_control_manager.handleCopyToClipboardButtonClick(session_id_text.text);
+ toast.show(qsTr("Copied session-ID into clipboard!"),
+ "5000",
+ mainqmladaptor.ToastInfo);
}
ToolTip.text: qsTr("Copy the session-ID into the clipboard")
hoverEnabled: true
- ToolTip.delay: 1000
+ ToolTip.delay: 600
ToolTip.timeout: 5000
ToolTip.visible: hovered
}
@@ -285,7 +296,7 @@ Item {
objectName: "pin_text"
id: pin_text
height: parent.height/2
- text: mainqmladaptor.pin
+ text: remote_control_manager.pin
anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width
anchors.right: parent.right
font.pointSize: 15
@@ -326,19 +337,21 @@ Item {
anchors.verticalCenter: parent.verticalCenter
opacity: 0.65
anchors.horizontalCenter: parent.horizontalCenter
- source: "../../images/into-clipboard.svg"
+ source: "../../../images/into-clipboard.svg"
fillMode: Image.PreserveAspectFit
}
onClicked: {
- mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text);
- toast.show(qsTr("Copied PIN into clipboard!"), "1000");
+ remote_control_manager.handleCopyToClipboardButtonClick(pin_text.text);
+ toast.show(qsTr("Copied PIN into clipboard!"),
+ "5000",
+ mainqmladaptor.ToastInfo);
}
ToolTip.text: qsTr("Copy the pin into the clipboard")
hoverEnabled: true
- ToolTip.delay: 1000
+ ToolTip.delay: 600
ToolTip.timeout: 5000
ToolTip.visible: hovered
}
@@ -351,18 +364,19 @@ Item {
id: start_support_button
height: Math.min(50)
objectName: "start_support_button"
- text: qsTr("Start remote support session")
+ text: checked ? qsTr("Stop remote support session") : qsTr("Start remote support session")
anchors.rightMargin: column.anchors.leftMargin
anchors.bottom: dbus_api_status_line.top
anchors.bottomMargin: 10
anchors.right: parent.right
checkable: true
- onClicked: mainqmladaptor.handleConnectButtonClick(checked);
+ onClicked: remote_control_manager.handleConnectButtonClick(checked);
}
}
-/*##^## Designer {
+/*##^##
+Designer {
D{i:0;autoSize:true;height:480;width:640}
}
- ##^##*/
+##^##*/
diff --git a/src/scenes/remote_control/remote_control_manager.cpp b/src/scenes/remote_control/remote_control_manager.cpp
new file mode 100644
index 0000000..b76ea2a
--- /dev/null
+++ b/src/scenes/remote_control/remote_control_manager.cpp
@@ -0,0 +1,511 @@
+#include "remote_control_manager.h"
+
+#ifndef QT_NO_DEBUG
+#define CHECK_TRUE(instruction) Q_ASSERT(instruction)
+#else
+#define CHECK_TRUE(instruction) (instruction)
+#endif
+
+RemoteControlManager::RemoteControlManager(QQmlApplicationEngine *engine,
+ MainQMLAdaptor *main_gui,
+ DBusAPI *dbus_api) : QObject() {
+ Q_ASSERT(dbus_api != nullptr);
+ Q_ASSERT(main_gui != nullptr);
+ Q_ASSERT(engine != nullptr);
+
+ _current_session = nullptr;
+ _sessions = new QSet<Session*>;
+ _dbus_api = dbus_api;
+ _main_gui = main_gui;
+ _engine = engine;
+}
+
+bool RemoteControlManager::setConnectButtonEnabled(bool enabled) {
+ // Find item via 'objectName'
+ QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->
+ findChild<QQuickItem*>("Scene_remote_control");
+ QQuickItem *item = scene_remote_control->
+ findChild<QQuickItem*>("start_support_button");
+ if (item) {
+ item->setProperty("enabled", enabled);
+ if (item->property("checked").toBool()) {
+ item->setProperty("text", tr("Stop remote support session"));
+ } else {
+ item->setProperty("text", tr("Start remote support session"));
+ }
+ } else {
+ qWarning() << "Unable to find 'start_support_button' Item!";
+ return false;
+ }
+
+ return true;
+}
+
+bool RemoteControlManager::setConnectButtonChecked(bool checked) {
+ // Find item via 'objectName'
+ QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->
+ findChild<QQuickItem*>("Scene_remote_control");
+ QQuickItem *item = scene_remote_control->
+ findChild<QQuickItem*>("start_support_button");
+ if (item) {
+ item->setProperty("checked", checked);
+ } else {
+ qWarning() << "Unable to find 'start_support_button' Item!";
+ return false;
+ }
+
+ return true;
+}
+
+bool RemoteControlManager::setStatusIndicatorText(QString status_text) {
+ // Find item via 'objectName'
+ QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->
+ findChild<QQuickItem*>("Scene_remote_control");
+ QQuickItem *item = scene_remote_control->
+ findChild<QQuickItem*>("dbus_api_status_text");
+ if (item) {
+ item->setProperty("text", status_text);
+ } else {
+ qWarning() << "Unable to find 'dbus_api_status_text' Item!";
+ return false;
+ }
+
+ return true;
+}
+
+bool RemoteControlManager::setStatusIndicatorColor(bool active, QColor color) {
+ // Find item via 'objectName'
+ QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->
+ findChild<QQuickItem*>("Scene_remote_control");
+ QQuickItem *item = scene_remote_control->
+ findChild<QQuickItem*>("dbus_api_status_indicator");
+ if (item) {
+ item->setProperty("active", active);
+ item->setProperty("color", color);
+ } else {
+ qWarning() << "Unable to find 'dbus_api_status_indicator' Item!";
+ return false;
+ }
+
+ return true;
+}
+
+void RemoteControlManager::handleCopyToClipboardButtonClick(QString copy_data) {
+ QClipboard *clipboard = QApplication::clipboard();
+ QString originalText = clipboard->text();
+ clipboard->setText(copy_data);
+ qDebug() << "Copied into clipboard:" << copy_data;
+}
+
+QString RemoteControlManager::getURL() {
+ if (getCurrentSession() == nullptr) {
+ return tr("Not available yet");
+ }
+ return getCurrentSession()->getURL();
+}
+
+QString RemoteControlManager::getPin() {
+ if (getCurrentSession() == nullptr) {
+ return "-----";
+ }
+ return getCurrentSession()->getPin();
+}
+
+QString RemoteControlManager::getSessionID() {
+ if (getCurrentSession() == nullptr) {
+ return "-----";
+ }
+ return getCurrentSession()->getSessionID();
+}
+
+Session* RemoteControlManager::getCurrentSession() {
+ return _current_session;
+}
+
+void RemoteControlManager::addSession(Session *session) {
+ _sessions->insert(session);
+}
+
+bool RemoteControlManager::removeSession(Session *session) {
+ if (getCurrentSession() == session) {
+ setCurrentSession(nullptr);
+ }
+
+ bool ok = _sessions->remove(session);
+
+ if (session != nullptr) {
+ session->disconnect();
+ session->deleteLater();
+ }
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+
+ currentSessionUrlChanged(tr("Not available yet"));
+ currentSessionPinChanged("-----");
+ currentSessionSessionIDChanged("-----");
+
+ return ok;
+}
+
+void RemoteControlManager::setCurrentSession(Session *session) {
+ if (session == nullptr) {
+ qDebug() << "Deselecting currentSession.";
+ _current_session = nullptr;
+
+ return;
+ }
+
+ if (_sessions->contains(session)) {
+ qDebug() << "Set currentSession to new session.";
+ _current_session = session;
+
+ connectSession(_current_session);
+ } else {
+ qDebug() << "Given session was not in _sessions!";
+ }
+}
+
+void RemoteControlManager::connectSession(Session *session) {
+ // session --statusChanged-> this.currentSessionStatusChanged()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::statusChanged,
+ this,
+ &RemoteControlManager::currentSessionStatusChanged));
+
+ // session --pinChanged-> this.currentSessionPinChanged()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::pinChanged,
+ this,
+ &RemoteControlManager::currentSessionPinChanged));
+
+ // session --urlChanged-> this.currentSessionUrlChanged()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::urlChanged,
+ this,
+ &RemoteControlManager::currentSessionUrlChanged));
+
+ // session --sessionIDChanged-> this.currentSessionSessionIDChanged()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::sessionIDChanged,
+ this,
+ &RemoteControlManager::currentSessionSessionIDChanged));
+
+
+ // session --startSucceeded -> this.currentSessionStartSucceeded()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::startSucceeded,
+ this,
+ &RemoteControlManager::currentSessionStartSucceeded));
+
+ // session --startFailed-> this.currentSessionStartFailed()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::startFailed,
+ this,
+ &RemoteControlManager::currentSessionStartFailed));
+
+
+ // session --stopSucceeded-> this.currentSessionStopSucceeded()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::stopSucceeded,
+ this,
+ &RemoteControlManager::currentSessionStopSucceeded));
+
+ // session --stopFailed-> this.currentSessionStopFailed()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::stopFailed,
+ this,
+ &RemoteControlManager::currentSessionStopFailed));
+
+
+ // session --statusSucceeded-> this.currentSessionStatusSucceeded()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::statusSucceeded,
+ this,
+ &RemoteControlManager::currentSessionStatusSucceeded));
+
+ // session --statusFailed-> this.currentSessionStatusFailed()
+ CHECK_TRUE(QObject::connect(session,
+ &Session::statusFailed,
+ this,
+ &RemoteControlManager::currentSessionStatusFailed));
+}
+
+void RemoteControlManager::currentSessionStartFailed(QString error_message) {
+ _main_gui->showToast(error_message, 6000, Toast::ToastType::ToastError);
+
+ // Start failed. No need to stop session, so remove it directly.
+ removeSession(getCurrentSession());
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+
+ emit _main_gui->showWindow();
+}
+
+void RemoteControlManager::currentSessionStopFailed(QString error_message) {
+ _main_gui->showToast(error_message, 6000, Toast::ToastType::ToastError);
+
+ // Stop failed, so don't do anything! The user should try again.
+
+ // Set status indicator to the corresponding error message.
+ QString translated = translateStatusIndicatorText("stop_session_error");
+ setStatusIndicatorText(translated);
+
+ setConnectButtonChecked(true);
+ setConnectButtonEnabled(true);
+
+ emit _main_gui->showWindow();
+}
+
+void RemoteControlManager::currentSessionStatusFailed(QString error_message) {
+ _main_gui->showToast(error_message, 6000, Toast::ToastType::ToastError);
+
+ // Set status indicator to the corresponding error message.
+ QString translated = translateStatusIndicatorText("status_session_error");
+ setStatusIndicatorText(translated);
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+
+ currentSessionUrlChanged(tr("Not available yet"));
+ currentSessionPinChanged("-----");
+ currentSessionSessionIDChanged("-----");
+
+ emit _main_gui->showWindow();
+}
+
+void RemoteControlManager::currentSessionStartSucceeded() {
+ Session *current_session = getCurrentSession();
+ if (current_session != nullptr) {
+ _main_gui->showToast(
+ tr("Session was started on '%0' successfully")
+ .arg(current_session->getHost()->alias()),
+ 6000,
+ Toast::ToastType::ToastSuccess
+ );
+ } else {
+ qCritical().noquote() << tr("currentSessionStartSucceeded(): "
+ "Current Session is nullptr!");
+ _engine->exit(1);
+ }
+
+ // Set status indicator to the corresponding error message.
+ QString translated = translateStatusIndicatorText("start_session_success");
+ setStatusIndicatorText(translated);
+
+ setConnectButtonChecked(true);
+ setConnectButtonEnabled(true);
+}
+
+void RemoteControlManager::currentSessionStopSucceeded() {
+ qDebug() << "Session stop succeeded: Delete current session object now.";
+ bool ok = removeSession(getCurrentSession());
+ if (!ok) {
+ qWarning() << tr("Couldn't remove current session out of '_sessions' list.");
+ }
+
+ _main_gui->showToast(tr("Remote support session was stopped."),
+ 6000,
+ Toast::ToastType::ToastSuccess);
+
+ // Set status indicator to the corresponding error message.
+ QString translated = translateStatusIndicatorText("stop_session_success");
+ setStatusIndicatorText(translated);
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+}
+
+void RemoteControlManager::currentSessionUnexpectedStop(QString error_message) {
+ _main_gui->showToast(error_message, 6000, Toast::ToastType::ToastError);
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+
+ qDebug() << "Delete current session object now.";
+ bool ok = removeSession(getCurrentSession());
+ if (!ok) {
+ qWarning() << tr("Couldn't remove current session out of '_sessions' list.");
+ }
+}
+
+void RemoteControlManager::currentSessionStatusSucceeded() {
+ // Nothing to do.
+}
+
+void RemoteControlManager::currentSessionStatusChanged(QString new_status_code) {
+ Session *current_session = getCurrentSession();
+ if (current_session == nullptr || !current_session->started) {
+ qDebug() << "RemoteControlManager::currentSessionStatusChanged(QString): "
+ "got called even though the session isn't even started.";
+ return;
+ }
+ QString translated = translateStatusIndicatorText(new_status_code);
+ setStatusIndicatorText(translated);
+}
+
+QString RemoteControlManager::translateStatusIndicatorText(QString status_code) {
+ QString guiString = tr("Unknown state of service");
+ setStatusIndicatorColor(false);
+
+ if (status_code == "dead") {
+
+ /* Session died */
+ guiString = tr("Remote Support session was stopped ungracefully");
+
+ // Red color
+ setStatusIndicatorColor(true, QColor(255, 0, 0, 127));
+
+ currentSessionUnexpectedStop(guiString);
+
+ } else if (status_code == "stopped") {
+
+ /* Session was stopped normally somehow other than the users request.
+ * Remote support partner could have clicked exit for example */
+ guiString = tr("Remote Support session was stopped");
+
+ // Green color
+ setStatusIndicatorColor(true, QColor(0, 255, 0, 127));
+
+ currentSessionUnexpectedStop(guiString);
+
+ } else if (status_code == "active") {
+
+ /* Partner is connected */
+ guiString = tr("Your partner is connected to the Remote Support session");
+
+ // Green color
+ setStatusIndicatorColor(true, QColor(0, 255, 0, 127));
+
+ } else if (status_code == "start_session_success" || status_code == "running") {
+
+ /* Session successfully started */
+ guiString = tr("Remote Support session successfully started! "
+ "Waiting for your remote support partner to connect.");
+
+ // yellow color (will be green when partner is connected)
+ setStatusIndicatorColor(true, QColor(255, 255, 0, 127));
+
+ } else if (status_code == "start_session_error") {
+
+ /* Session couldn't be started */
+ guiString = tr("Remote Support session couldn't be started!");
+
+ // Red color
+ setStatusIndicatorColor(true, QColor(255, 0, 0, 127));
+
+ } else if (status_code == "stop_session_success") {
+
+ /* Session was successfully stopped by the users request */
+ guiString = tr("Session stopped successfully.");
+
+ // Green color
+ setStatusIndicatorColor(true, QColor(0, 255, 0, 127));
+
+ } else if (status_code == "stop_session_error") {
+
+ /* Session couldn't be stopped */
+ guiString = tr("Session could not be stopped!") + "\n" +
+ tr("remote support partner could still be connected!");
+
+ // Red color
+ setStatusIndicatorColor(true, QColor(255, 0, 0, 127));
+
+ } else if (status_code == "status_session_error") {
+
+ /* Session's status couldn't be refreshed */
+ guiString = tr("Session status could not be refreshed! "
+ "Your remote support partner could still be connected!");
+
+ // Red color
+ setStatusIndicatorColor(true, QColor(255, 0, 0, 127));
+
+ }
+
+ qDebug().noquote() << QString("Translating status code '%0' to '%1'")
+ .arg(status_code)
+ .arg(guiString);
+ return guiString;
+}
+
+void RemoteControlManager::currentSessionPinChanged(QString pin) {
+ emit pinChanged(pin);
+}
+
+void RemoteControlManager::currentSessionUrlChanged(QString url) {
+ emit urlChanged(url);
+}
+
+void RemoteControlManager::currentSessionSessionIDChanged(QString session_id) {
+ emit sessionIDChanged(session_id);
+}
+
+void RemoteControlManager::connectToDBusAPI(Session *session) {
+ // _dbus_api --sessionStartResponse-> this.start_response()
+ CHECK_TRUE(QObject::connect(_dbus_api,
+ &DBusAPI::serviceStartResponse,
+ session,
+ &Session::start_response));
+
+ // _dbus_api --serviceStopResponse-> this.stop_response()
+ CHECK_TRUE(QObject::connect(_dbus_api,
+ &DBusAPI::serviceStopResponse,
+ session,
+ &Session::stop_response,
+ Qt::DirectConnection));
+
+ // _dbus_api --sessionStatusResponse-> this.status_response()
+ CHECK_TRUE(QObject::connect(_dbus_api,
+ &DBusAPI::serviceStatusResponse,
+ session,
+ &Session::status_response));
+}
+
+void RemoteControlManager::handleConnectButtonClick(bool checked) {
+ if (checked) {
+ // Create a Session object and start it.
+ qDebug() << "Creating and starting a new session object now.";
+ RWAHost *selected_host = _main_gui->getSelectedRWAHost();
+ if (selected_host) {
+ qInfo() << tr("Creating a new session object.");
+ Session *new_session = new Session(_dbus_api, selected_host);
+
+ connectToDBusAPI(new_session);
+
+ qDebug() << "Adding session to QSet";
+ addSession(new_session);
+
+ qDebug() << "Setting session as current session.";
+ setCurrentSession(new_session);
+
+ qInfo().noquote() << tr("Starting a remote support session on host '%0' "
+ "using the new session object.")
+ .arg(selected_host->uuid());
+ new_session->start();
+ } else {
+ qCritical().noquote() << tr("Can't start a remote support session. "
+ "There is no RWA host is selected!");
+ }
+
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(false);
+ } else {
+ Session *current_session = getCurrentSession();
+ if (current_session != nullptr) {
+ emit current_session->stop();
+ } else {
+ qCritical().noquote() << tr("RemoteControlManager::"
+ "handleConnectButtonClick(): Current Session "
+ "is nullptr!");
+ setConnectButtonChecked(false);
+ setConnectButtonEnabled(true);
+ }
+ }
+}
+
+/*void RemoteControlManager::onCloseHandler() {
+ // To cleanup things here
+ // check current session nullptr
+ getCurrentSession()->stop();
+}*/
diff --git a/src/scenes/remote_control/remote_control_manager.h b/src/scenes/remote_control/remote_control_manager.h
new file mode 100644
index 0000000..4554724
--- /dev/null
+++ b/src/scenes/remote_control/remote_control_manager.h
@@ -0,0 +1,78 @@
+#ifndef REMOTE_CONTROL_MANAGER_H
+#define REMOTE_CONTROL_MANAGER_H
+
+#include <QObject>
+
+#include "../../main_qmladaptor.h"
+#include "../../DBusAPI.h"
+#include "../../session.h"
+
+class RemoteControlManager : public QObject {
+
+ Q_OBJECT
+ // this makes url available as a QML property
+ Q_PROPERTY(QString url READ getURL NOTIFY urlChanged)
+ // this makes pin available as a QML property
+ Q_PROPERTY(QString pin READ getPin NOTIFY pinChanged)
+ // this makes session_id available as a QML property
+ Q_PROPERTY(QString session_id READ getSessionID NOTIFY sessionIDChanged)
+
+public:
+ explicit RemoteControlManager(QQmlApplicationEngine *engine = nullptr,
+ MainQMLAdaptor *main_gui = nullptr,
+ DBusAPI *dbus_api = nullptr);
+
+ bool setConnectButtonEnabled(bool enabled);
+ bool setConnectButtonChecked(bool checked);
+ bool setStatusIndicatorColor(bool active, QColor color = QColor(255,255,255));
+
+ QString translateStatusIndicatorText(QString status_code);
+ bool setStatusIndicatorText(QString status_text);
+
+private:
+ DBusAPI *_dbus_api;
+ MainQMLAdaptor *_main_gui;
+ QQmlApplicationEngine *_engine;
+ Session *_current_session;
+ QSet<Session*> *_sessions;
+
+ void connectSession(Session *session);
+ void connectToDBusAPI(Session *session);
+
+ bool refreshTimerIsRunning;
+
+signals:
+ void onConnectButtonClick(bool checked);
+ void pinChanged(QString pin);
+ void urlChanged(QString URL);
+ void sessionIDChanged(QString session_id);
+
+public slots:
+ void handleCopyToClipboardButtonClick(QString copy_data);
+ void handleConnectButtonClick(bool checked);
+
+ void setCurrentSession(Session *session);
+ void addSession(Session *session);
+ bool removeSession(Session *session);
+
+ void currentSessionStatusChanged(QString);
+ void currentSessionPinChanged(QString);
+ void currentSessionSessionIDChanged(QString);
+ void currentSessionUrlChanged(QString);
+
+ QString getURL();
+ QString getPin();
+ QString getSessionID();
+ Session* getCurrentSession();
+
+ void currentSessionStartFailed(QString error_message);
+ void currentSessionStopFailed(QString error_message);
+ void currentSessionStatusFailed(QString error_message);
+ void currentSessionUnexpectedStop(QString error_message);
+
+ void currentSessionStartSucceeded();
+ void currentSessionStopSucceeded();
+ void currentSessionStatusSucceeded();
+};
+
+#endif // REMOTECONTROLMANAGER_H