aboutsummaryrefslogtreecommitdiff
path: root/src/main_qmladaptor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main_qmladaptor.cpp')
-rw-r--r--src/main_qmladaptor.cpp350
1 files changed, 262 insertions, 88 deletions
diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp
index 8a54eb3..688b993 100644
--- a/src/main_qmladaptor.cpp
+++ b/src/main_qmladaptor.cpp
@@ -1,8 +1,8 @@
/*
* This file is part of Remote Support Desktop
* https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
- * Copyright 2020-2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
- * Copyright 2020-2021 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+ * Copyright 2020, 2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+ * Copyright 2020, 2021 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
* SPDX-License-Identifier: GPL-2.0-or-later
*
* This program is free software; you can redistribute it and/or modify
@@ -26,53 +26,280 @@
#include "main_qmladaptor.h"
-MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent)
-{
+MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine,
+ DBusAPI *dbus_api) : QObject(parent) {
+ Q_ASSERT(engine != nullptr);
+ Q_ASSERT(dbus_api != nullptr);
+
_engine = engine;
+ _dbus_api = dbus_api;
+ _selected_rwa_host = nullptr;
+ _rwaHostModel = new QList<QObject*>;
+
+ QTimer *timer = new QTimer(this);
+ connect(timer, &QTimer::timeout, _dbus_api,
+ QOverload<>::of(&DBusAPI::get_web_app_hosts_request));
+ timer->start(10000);
+
+ qmlRegisterUncreatableMetaObject(
+ Toast::staticMetaObject, // meta object created by Q_NAMESPACE macro
+ "rwa.toast.type", // import statement (can be any string)
+ 1, 0, // major and minor version of the import
+ "ToastType", // name in QML (does not have to match C++ name)
+ "Error: only enums" // error if someone tries to create a ToastType object
+ );
+
}
-bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) {
- // Find item via 'objectName'
- QQuickItem *item = _engine->rootObjects().at(0)->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"));
+void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) {
+ Q_ASSERT(host_uuid != "");
+
+ RWAHost *_host = nullptr;
+ for (int i = 0; i < getRWAHostModel().size(); i++) {
+ QObject *obj = _rwaHostModel->value(i);
+ RWAHost *host = qobject_cast<RWAHost *>(obj);
+ Q_ASSERT(host != nullptr);
+
+ if (host->uuid() == host_uuid) {
+ _host = host;
}
- } else {
- qWarning() << "Unable to find 'start_support_button' Item!";
- return false;
}
+ Q_ASSERT(_host != nullptr);
- return true;
+ _selected_rwa_host = _host;
+ qDebug() << "RWAHost was selected!" <<
+ _selected_rwa_host->uuid() <<
+ "aka" <<
+ _selected_rwa_host->alias();
+
+ setRWAHostSelected(true);
+}
+
+RWAHost* MainQMLAdaptor::getSelectedRWAHost() {
+ return _selected_rwa_host;
+}
+
+void MainQMLAdaptor::setRWAHostModel(QList<QObject*> *rwa_hosts) {
+ _rwaHostModel = rwa_hosts;
+ emit rwaHostModelChanged(*rwa_hosts);
+}
+
+void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) {
+ _rwaHostModel->append(rwa_host);
+ emit rwaHostModelChanged(*_rwaHostModel);
+}
+
+void MainQMLAdaptor::removeRWAHost(RWAHost *rwa_host) {
+ _rwaHostModel->removeOne(rwa_host);
+ emit rwaHostModelChanged(*_rwaHostModel);
+}
+
+QList<QObject*> MainQMLAdaptor::getRWAHostModel() {
+ return *_rwaHostModel;
}
-bool MainQMLAdaptor::setConnectButtonChecked(bool checked) {
+void MainQMLAdaptor::setRWAHostSelected(bool value) {
// Find item via 'objectName'
- QQuickItem *item = _engine->rootObjects().at(0)->findChild<QQuickItem*>("start_support_button");
- if (item) {
- item->setProperty("checked", checked);
+ QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->
+ findChild<QObject*>("sidebar_drawer");
+ if (sidebar_drawer) {
+ sidebar_drawer->setProperty("rwaHostIsSelected", value);
} else {
- qWarning() << "Unable to find 'start_support_button' Item!";
- return false;
+ qWarning() << "Unable to find 'sidebar_drawer' Item!";
}
- return true;
+ QObject *server_chooser = _engine->rootObjects().takeFirst()->
+ findChild<QObject*>("server_chooser");
+ if (server_chooser) {
+ server_chooser->setProperty("displayText", value ?
+ server_chooser->property("currentText") :
+ tr("No RWA host available!"));
+ server_chooser->setProperty("enabled", value);
+ } else {
+ qWarning() << "Unable to find 'server_chooser' Item!";
+ }
}
-bool MainQMLAdaptor::setStatus(QString status) {
- // Find item via 'objectName'
- QQuickItem *item = _engine->rootObjects().at(0)->findChild<QQuickItem*>("dbus_api_status_text");
- if (item) {
- item->setProperty("text", status);
+void MainQMLAdaptor::get_web_app_hosts_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) {
+ setRWAHostSelected(false);
+
+ showToast(tr("Can't connect to underlying session service!"),
+ 9800,
+ Toast::ToastError);
+
+ // Go to the first page on the stack.
+ main_content_pop(nullptr);
+
+ return;
+ }
+
+
+ bool atLeastOneHostAvailable = false;
+
+ // Get the QJsonObject
+ QJsonObject jObject = doc->object();
+ QVariantMap mainMap = jObject.toVariantMap();
+
+ // Status of request
+ QString request_status = mainMap["status"].toString();
+ if (request_status == "success") {
+ // Building host_objects
+ QJsonArray host_objects = jObject.value("hosts").toArray();
+
+ QList<RWAHost*> *all_rwa_hosts = new QList<RWAHost*>;
+ foreach (const QJsonValue &host_object, host_objects) {
+ QString host_uuid = host_object["uuid"].toString();
+ QString host_alias = host_object["alias"].toString();
+ QString host_url = host_object["url"].toString();
+
+ if (host_url == "" || host_uuid == "") {
+ // This two values are required and can't be omitted.
+ QString reason = tr("A host object in the response of D-Bus service lacks"
+ " a necessary value. (host_url or host_uuid)");
+ qCritical().noquote() << tr("An error occured while adding a new host:")
+ << reason;
+
+ return;
+ }
+
+ if (host_alias == "") {
+ qDebug().noquote() << QString("An alias for the host wasn't delivered "
+ "so just use '%0' as alias.").arg(host_url);
+ host_alias = host_url;
+ }
+
+
+ // Now built RWAHost object.
+ RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url);
+ all_rwa_hosts->append(rwa_host);
+
+ bool found = false;
+ for (int i = 0; i < this->_rwaHostModel->size(); i++) {
+ RWAHost* old_host = qobject_cast<RWAHost*>(_rwaHostModel->value(i));
+ Q_ASSERT(old_host != nullptr);
+
+ if (rwa_host->uuid() == old_host->uuid()) {
+ found = true;
+ break;
+ }
+ }
+
+ atLeastOneHostAvailable = true;
+
+ if (!found) {
+ qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'"))
+ .arg(rwa_host->alias());
+ addRWAHost(rwa_host);
+ }
+ }
+
+ for (int i = 0; i < this->_rwaHostModel->size(); i++) {
+ RWAHost* old_host = qobject_cast<RWAHost*>(_rwaHostModel->value(i));
+ Q_ASSERT(old_host != nullptr);
+
+ bool found = false;
+ for (RWAHost *host : *all_rwa_hosts) {
+ if (host->uuid() == old_host->uuid()) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ removeRWAHost(old_host);
+ qInfo().noquote() << QString(tr("Removed RWAHost '%0'")).arg(old_host->alias());
+ }
+ }
} else {
- qWarning() << "Unable to find 'dbus_api_status_text' Item!";
- return false;
+ QString reason = tr("An error occured while adding a new host:");
+ qCritical().noquote() << reason;
+
+ QString type = mainMap["type"].toString();
+ if (type != "") {
+ reason = QString(tr("The error is not clear. The session service "
+ "responded with status type '%0'")).arg(type);
+ qCritical().noquote() << reason;
+ } else {
+ reason = QString(tr("The error is not clear. The session service "
+ "responded with no status type!"));
+ qCritical().noquote() << reason;
+ }
+
+ return;
}
- return true;
+ if (!atLeastOneHostAvailable) {
+ main_content_replace("scenes/Scene_no_server_available.qml");
+ }
+
+ setRWAHostSelected(atLeastOneHostAvailable);
+}
+
+void MainQMLAdaptor::main_content_push(QString scene) {
+ // Find item via 'objectName'
+ QObject *window = _engine->rootObjects().takeFirst();
+ Q_ASSERT(window != nullptr);
+
+ QObject *main_content = _engine->rootObjects().takeFirst()->findChild<QObject*>("main_content");
+ Q_ASSERT(main_content != nullptr);
+
+ QVariant to_cast = main_content->property("currentItem");
+ QObject *obj = qvariant_cast<QObject *>(to_cast);
+ if (obj) {
+ if (!(scene.contains(obj->objectName()))) {
+ QVariant arg = QVariant::fromValue(scene);
+ if(!QMetaObject::invokeMethod(window, "main_content_push", Q_ARG(QVariant, arg)))
+ qDebug() << "Failed to invoke push";
+ }
+ }
+}
+
+void MainQMLAdaptor::main_content_pop(QString scene) {
+ // Find item via 'objectName'
+ QObject *window = _engine->rootObjects().takeFirst();
+ Q_ASSERT(window != nullptr);
+
+ QObject *main_content = _engine->rootObjects().takeFirst()->
+ findChild<QObject*>("main_content");
+ Q_ASSERT(main_content != nullptr);
+
+ QVariant to_cast = main_content->property("currentItem");
+ QObject *obj = qvariant_cast<QObject *>(to_cast);
+ if (obj) {
+ if (!(scene.contains(obj->objectName()))) {
+ QVariant arg = QVariant::fromValue(scene);
+ if(!QMetaObject::invokeMethod(window, "main_content_pop", Q_ARG(QVariant, arg)))
+ qDebug() << "Failed to invoke pop";
+ }
+ }
+}
+
+void MainQMLAdaptor::main_content_replace(QString scene) {
+ // Find item via 'objectName'
+ QObject *window = _engine->rootObjects().takeFirst();
+ Q_ASSERT(window != nullptr);
+
+ QObject *main_content = _engine->rootObjects().takeFirst()->
+ findChild<QObject*>("main_content");
+ Q_ASSERT(main_content != nullptr);
+
+ QVariant to_cast = main_content->property("currentItem");
+ QObject *obj = qvariant_cast<QObject *>(to_cast);
+ if (obj) {
+ QString scene_add_rwahost_wizard = "Scene_step_1";
+ if (!(scene.contains(obj->objectName()) ||
+ scene_add_rwahost_wizard.contains(obj->objectName()))) {
+ QVariant arg = QVariant::fromValue(scene);
+ if (!QMetaObject::invokeMethod(window, "main_content_replace",
+ Q_ARG(QVariant, arg))) {
+ qDebug() << "Failed to invoke replace";
+ }
+ }
+ }
}
bool MainQMLAdaptor::openMessageDialog(QString title, QString text, QMessageBox::Icon icon) {
@@ -106,65 +333,12 @@ bool MainQMLAdaptor::getShowMessageDialog() {
return _showMessageDialog;
}
-bool MainQMLAdaptor::setStatusIndicator(bool active, QColor color) {
- // Find item via 'objectName'
- QQuickItem *item = _engine->rootObjects().at(0)->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 MainQMLAdaptor::handleCopyToClipboardButtonClick(QString copy_data) {
- QClipboard *clipboard = QApplication::clipboard();
- QString originalText = clipboard->text();
- clipboard->setText(copy_data);
- qDebug() << "Copied into clipboard:" << copy_data;
-}
-
-void MainQMLAdaptor::handleConnectButtonClick(bool checked) {
- emit onConnectButtonClick(checked);
-}
-
-void MainQMLAdaptor::setPin(QString pin) {
- _pin = pin;
- emit pinChanged(pin);
-}
-void MainQMLAdaptor::setURL(QString URL) {
- _url = URL;
- emit urlChanged(URL);
-}
-void MainQMLAdaptor::setSessionID(QString session_id) {
- _session_id = session_id;
- emit sessionIDChanged(session_id);
-}
-QString MainQMLAdaptor::getURL() {
- return _url;
-}
-QString MainQMLAdaptor::getPin() {
- return _pin;
-}
-QString MainQMLAdaptor::getSessionID() {
- return _session_id;
-}
-
void MainQMLAdaptor::onCloseHandler() {
// Do cleanup things here...
emit onCloseSignal();
}
-void MainQMLAdaptor::showToast(QString text, uint durationMs) {
- emit showToastSignal(text, QString::number(durationMs));
+void MainQMLAdaptor::showToast(QString text, uint durationMs, uint type) {
+ // type is actually Toast::ToastType
+ emit showToastSignal(text, QString::number(durationMs), type);
}
-
-//void MainQMLAdaptor::onCloseHandler() {
-// qDebug() << "Inside MainQMLAdaptor::onCloseHandler()";
-
-// // Sending onClose signal to main and there to Session::onCloseHandler()
-// emit MainQMLAdaptor::onCloseSignal();
-//}