From 11787ea278bc6ff6d5bc797b597df3f26e2ec9b4 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 19:55:13 +0200 Subject: Introduce DBusAPI and RWAHost classes --- qml.qrc | 4 + rwa-support-desktopapp.pro | 12 +- src/DBusAPI.cpp | 351 +++++++++++++++++++++ src/DBusAPI.h | 63 ++++ src/RWAHost.cpp | 71 +++++ src/RWAHost.h | 56 ++++ src/main.cpp | 1 + src/scenes/add_server_wizard/add_server_wizard.cpp | 133 ++++---- src/scenes/add_server_wizard/add_server_wizard.h | 44 ++- src/session.cpp | 270 ++++------------ src/session.h | 57 ++-- 11 files changed, 754 insertions(+), 308 deletions(-) create mode 100644 src/DBusAPI.cpp create mode 100644 src/DBusAPI.h create mode 100644 src/RWAHost.cpp create mode 100644 src/RWAHost.h diff --git a/qml.qrc b/qml.qrc index 3e9d682..e7bf198 100644 --- a/qml.qrc +++ b/qml.qrc @@ -15,6 +15,10 @@ src/RWADBusAdaptor.h src/session.cpp src/session.h + src/RWAHost.h + src/RWAHost.cpp + src/DBusAPI.h + src/DBusAPI.cpp src/ListItem.qml src/ToastManager.qml src/Toast.qml diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index 095db2d..5c3f24d 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -47,13 +47,17 @@ SOURCES += src/main.cpp \ src/main_qmladaptor.cpp \ src/RWADBusAdaptor.cpp \ src/session.cpp \ - src/scenes/add_server_wizard/add_server_wizard.cpp + src/scenes/add_server_wizard/add_server_wizard.cpp \ + src/RWAHost.cpp \ + src/DBusAPI.cpp HEADERS += src/RWADBusAdaptor.h \ src/main_qmladaptor.h \ src/RWADBusAdaptor.h \ src/session.h \ - src/scenes/add_server_wizard/add_server_wizard.h + src/scenes/add_server_wizard/add_server_wizard.h \ + src/RWAHost.h \ + src/DBusAPI.h RESOURCES += qml.qrc @@ -68,4 +72,6 @@ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -DISTFILES += +#DISTFILES += + +CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp new file mode 100644 index 0000000..0809a51 --- /dev/null +++ b/src/DBusAPI.cpp @@ -0,0 +1,351 @@ +#include "DBusAPI.h" + +/*! + * \class DBusAPI + * \brief The DBusAPI class provides all necessary D-Bus methods and distributes the response via signals. + */ +DBusAPI::DBusAPI() { + _initDBus(); +} + +/*! + * \brief Initializes private _dbus_rwa object. + */ +void DBusAPI::_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!"); +} + +/*! + * \brief Ask the session service to start a session. + * + * \a host RWAHost object which includes all necessary information about a RWA host. + */ +void DBusAPI::start_request(RWAHost *host) { + qDebug() << "Requesting D-Bus service to start a new session on host:" << host->alias(); + + // Make an asynchrous 'start' call (Response will be sent to 'start_reply') + QDBusPendingCall async = _dbus_rwa->asyncCall("start", host->uuid()); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(start_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::start_reply(QDBusPendingCallWatcher *call) { + QString result = ""; + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus 'start' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceStartResponse(nullptr); + return; + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + qDebug() << "Raw JSON from starting session is:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceStartResponse(&doc); +} + +/*! + * \brief Ask the session service to stop session #. + * + * \a host RWAHost object which includes all necessary information about a RWA host. + * + * \a session_id Unique identifier for a session in a specific host. + */ +void DBusAPI::stop_request(RWAHost *host, QString session_id) { + bool ok; + long long session_id_number = session_id.toLongLong(&ok); + + // Sanity Check + if(ok == false){ + qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + return; + } + + qDebug().noquote() << QString("Requesting D-Bus service to stop " + "session #'%0' on host '%1'") + .arg(session_id) + .arg(host->alias()); + + // Make an asynchrous 'start' call (Response will be sent to 'stop_reply') + QDBusPendingCall async = _dbus_rwa->asyncCall("stop", host->uuid(), session_id_number); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(stop_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::stop_reply(QDBusPendingCallWatcher *call) { + QString result = ""; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus 'stop' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceStopResponse(nullptr); + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + qDebug() << "Raw JSON from stopping a session is:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceStopResponse(&doc); +} + +/*! + * \brief Ask the session service for status of . + * + * \a host RWAHost object which includes all necessary information about a RWA host. + * + * \a session_id Unique identifier for a session in a specific host. + */ +void DBusAPI::status_request(RWAHost *host, QString session_id) { + bool ok; + long long session_id_number = session_id.toLongLong(&ok); + + // Sanity Check + if(ok == false){ + qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + return; + } + + qDebug().noquote() << QString("Requesting D-Bus service for status of session " + "#'%0' on host '%1'").arg(session_id).arg(host->alias()); + + // Make an asynchrous 'start' call (Response will be sent to 'status_reply') + QDBusPendingCall async = _dbus_rwa->asyncCall("status", host->uuid(), session_id_number); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(status_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief Forces the session service to refresh it's status of and tell us about it then. + * + * \a host RWAHost object which includes all necessary information about a RWA host. + * + * \a session_id Unique identifier for a session in a specific host. + */ +void DBusAPI::refresh_status_request(RWAHost *host, QString session_id) { + bool ok; + long long session_id_number = session_id.toLongLong(&ok); + + // Sanity Check + if(ok == false){ + qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + return; + } + + qDebug().noquote() << QString("Requesting D-Bus service for refresh_status of session " + "#'%0' on host '%1'").arg(session_id).arg(host->alias()); + + // Make an asynchrous 'start' call (Response will be sent to 'status_reply') + QDBusPendingCall async = _dbus_rwa->asyncCall("refresh_status", host->uuid(), session_id_number); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(status_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::status_reply(QDBusPendingCallWatcher *call){ + QString result = ""; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus '(refresh_)status' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceStatusResponse(nullptr); + return; + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + // Get the QJsonObject + qDebug() << "Raw JSON from a status request for a session is:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceStatusResponse(&doc); +} + +/*! + * \brief This method requests the session service to list all RWAHosts. + */ +void DBusAPI::get_web_app_hosts_request() { + qDebug().noquote() << QString("Requesting D-Bus service to list " + "all remote web app hosts"); + + // Make an asynchrous 'get_web_app_hosts' call + // Response will be sent to 'get_web_app_hosts_reply' + QDBusPendingCall async = _dbus_rwa->asyncCall("get_web_app_hosts"); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(get_web_app_hosts_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief This method requests the session service to add a RWAHost to its configuration files. + * + * \a host_url is the remote web app adress which will be used by the session service to coordinate + * sessions, connections, settings and such. + */ +void DBusAPI::add_web_app_host_request(QString host_url) { + qDebug().noquote() << QString("Requesting D-Bus service to register new " + "remote web app host with url '%0'").arg(host_url); + + // Make an asynchrous 'add_web_app_host' call + // Response will be sent to 'add_web_app_host_reply' + 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_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief This method requests the session service to remove a RWAHost from its configuration files. + * + * \a host_uuid Unique identifier which all hosts have. + */ +void DBusAPI::remove_web_app_host_request(QString host_uuid) { + qDebug().noquote() << QString("Requesting D-Bus service to list " + "all remote web app hosts"); + + // Make an asynchrous 'remove_web_app_host' call + // Response will be sent to 'remove_web_app_host_reply' + QDBusPendingCall async = _dbus_rwa->asyncCall("remove_web_app_host", host_uuid); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); + + QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(remove_web_app_host_reply(QDBusPendingCallWatcher*))); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::get_web_app_hosts_reply(QDBusPendingCallWatcher *call){ + QString result = ""; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus 'get_web_app_hosts' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceGetWebAppHostsResponse(nullptr); + return; + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + // Get the QJsonObject + qDebug() << "Raw JSON from the remote web app host listing request:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceGetWebAppHostsResponse(&doc); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::add_web_app_host_reply(QDBusPendingCallWatcher *call){ + QString result = ""; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus 'add_web_app_host' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceAddWebAppHostResponse(nullptr); + return; + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + // Get the QJsonObject + qDebug() << "Raw JSON from the remote web app host register request:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceAddWebAppHostResponse(&doc); +} + +/*! + * \brief Method gets called when a D-Bus response is ready. + * + * \a call contains the D-Bus response (session service or for example maybe just a error message). + * + * TODO: Example of json input + */ +void DBusAPI::remove_web_app_host_reply(QDBusPendingCallWatcher *call){ + QString result = ""; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qDebug() << "D-Bus 'remove_web_app_host' request failed, this was the reply:"; + qDebug() << reply.error(); + + emit serviceRemoveWebAppHostResponse(nullptr); + return; + } else { + result = reply.argumentAt<0>(); + } + call->deleteLater(); + + // Get the QJsonObject + qDebug() << "Raw JSON from the remote web app host deletion request:" << result.toUtf8().replace('"', ""); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + + emit serviceRemoveWebAppHostResponse(&doc); +} diff --git a/src/DBusAPI.h b/src/DBusAPI.h new file mode 100644 index 0000000..1564f57 --- /dev/null +++ b/src/DBusAPI.h @@ -0,0 +1,63 @@ +#ifndef DBUSAPI_H +#define DBUSAPI_H + +#include +#include + +#include "RWAHost.h" +#include "RWADBusAdaptor.h" + +class DBusAPI : public QObject +{ + Q_OBJECT +public: + explicit DBusAPI(); + +signals: + void serviceStartResponse(QJsonDocument*); + void serviceStopResponse(QJsonDocument*); + void serviceStatusResponse(QJsonDocument*); + + void serviceGetWebAppHostsResponse(QJsonDocument*); + void serviceAddWebAppHostResponse(QJsonDocument*); + void serviceRemoveWebAppHostResponse(QJsonDocument*); + +public slots: + void start_reply(QDBusPendingCallWatcher *call); + void stop_reply(QDBusPendingCallWatcher *call); + void status_reply(QDBusPendingCallWatcher *call); + + void get_web_app_hosts_reply(QDBusPendingCallWatcher *call); + void add_web_app_host_reply(QDBusPendingCallWatcher *call); + void remove_web_app_host_reply(QDBusPendingCallWatcher *call); + + + // Starts a remote web app session + void start_request(RWAHost *host); + + // Stop a remote web app session + void stop_request(RWAHost *host, QString session_id); + + // Refreshes a remote web app session's status + void refresh_status_request(RWAHost *host, QString session_id); + + // Gets a remote web app session's status + void status_request(RWAHost *host, QString session_id); + + // Gets all remote web app hosts deposited in the session server + void get_web_app_hosts_request(); + + // Add a specific remote web app host using a url to make sure its contactable + void add_web_app_host_request(QString host_url); + + // Removes a specific remote web app host using the uuid of a host + void remove_web_app_host_request(QString host_uuid); + +private: + OrgArcticaProjectRWASupportSessionServiceInterface* _dbus_rwa; + + void _initDBus(); + +}; + +#endif // DBUSAPI_H diff --git a/src/RWAHost.cpp b/src/RWAHost.cpp new file mode 100644 index 0000000..006ecd9 --- /dev/null +++ b/src/RWAHost.cpp @@ -0,0 +1,71 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + +#include "RWAHost.h" + +RWAHost::RWAHost(QString uuid, QString alias, QString url) { + assert(uuid != ""); + assert(alias != ""); + assert(url != ""); + + qDebug() << "Created new RWAHost object.\n\t" + << QString("uuid: '%0'").arg(uuid) << "\n\t" + << QString("alias: '%0'").arg(alias) << "\n\t" + << QString("url: '%0'").arg(url); + + _url = url; + _alias = alias; + _uuid = uuid; +} + +QString RWAHost::url() const +{ + return _url; +} + +void RWAHost::setUrl(const QString &url) +{ + _url = url; +} + +QString RWAHost::alias() const +{ + return _alias; +} + +void RWAHost::setAlias(const QString &alias) +{ + _alias = alias; +} + +QString RWAHost::uuid() const +{ + return _uuid; +} + +void RWAHost::setUuid(const QString &uuid) +{ + _uuid = uuid; +} diff --git a/src/RWAHost.h b/src/RWAHost.h new file mode 100644 index 0000000..c78ef5f --- /dev/null +++ b/src/RWAHost.h @@ -0,0 +1,56 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + +#ifndef RWAHOST_H +#define RWAHOST_H + +#include +#include + +class RWAHost : public QObject +{ + Q_OBJECT +public: + explicit RWAHost(QString uuid = "", QString alias = "", QString url = ""); + + QString uuid() const; + QString alias() const; + QString url() const; + + void setUuid(const QString &uuid); + void setAlias(const QString &alias); + void setUrl(const QString &url); + +private: + QString _uuid; + QString _alias; + QString _url; + +signals: + +public slots: +}; + +#endif // RWAHOST_H diff --git a/src/main.cpp b/src/main.cpp index f6408b3..f23e2c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,6 +39,7 @@ #include "RWADBusAdaptor.cpp" #include "session.h" #include "scenes/add_server_wizard/add_server_wizard.h" +#include "RWAHost.h" #define BUILD_TIME __DATE__ " " __TIME__ diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index f8d4b7b..bd1dd3c 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -1,100 +1,121 @@ -#include "add_server_wizard.h" -#include "../../RWADBusAdaptor.h" +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + #include #include #include -Add_Server_wizard::Add_Server_wizard(QObject *parent) : QObject(parent) { - _initDBus(); +#include "add_server_wizard.h" +#include "../../RWADBusAdaptor.h" +#include "../../RWAHost.h" +Add_Server_wizard::Add_Server_wizard(QObject *parent) : QObject(parent) { + _dbus_api = new DBusAPI(); + // _dbus_api --serviceAddWebAppHostResponse-> this.add_web_app_host_response() + QObject::connect(_dbus_api, + SIGNAL(serviceAddWebAppHostResponse(QJsonDocument*)), + this, + SLOT(add_web_app_host_response(QJsonDocument*))); } -bool Add_Server_wizard::processStep1(QString host_url) { +void 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; } - return _add_server(host_url); + return add_server(host_url); } -bool Add_Server_wizard::processStep2() { +void Add_Server_wizard::processStep2() { qDebug() << "Processing Step 2 with args: No Args."; - emit step2Failed(tr("The feature you expected here are not yet implemented.")); + emit step2Failed(tr("The features 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::add_server(QString host_url) { + _dbus_api->add_web_app_host_request(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); +void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { + // Get the QJsonObject + QJsonObject jObject = doc->object(); + QVariantMap mainMap = jObject.toVariantMap(); - QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), - this, SLOT(_add_web_app_host_dbus_replied(QDBusPendingCallWatcher*))); + // Status of request + QString request_status = mainMap["status"].toString(); + if (request_status == "success") { + // Building host_object + QJsonObject host_object = jObject.value(QString("host")).toObject(); - return true; -} + QString host_uuid = host_object["uuid"].toString(); + QString host_alias = host_object["alias"].toString(); + QString host_url = host_object["url"].toString(); -void Add_Server_wizard::_add_web_app_host_dbus_replied(QDBusPendingCallWatcher *call) { - QString result = ""; + if (host_url == "" || host_uuid == "") { + // This two values are required and can't be omitted. + QString reason = tr("Response of D-Bus service lacks necessary host object."); + qCritical().noquote() << tr("An error occured while adding a new host:") + << reason; + emit step1Failed(reason); - QDBusPendingReply 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(); + return; + } - qDebug() << "Raw JSON from starting session is:" << result.toUtf8().replace('"', ""); - QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + 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; + } - // Get the QJsonObject - QJsonObject jObject = doc.object(); - QVariantMap mainMap = jObject.toVariantMap(); + // Now built RWAHost object. + QScopedPointer rwa_host (new RWAHost(host_uuid, host_alias, host_url)); - // Status of request - QString request_status = mainMap["status"].toString(); - if (request_status == "success") { - qDebug() << "Successfully started a Session."; + qInfo() << "Successfully added a new RWAHost."; emit step1Success(); } else { - qCritical() << "An error occured while adding a new host!"; + qCritical().noquote() << tr("An error occured while adding a new host!"); - QString reason = "An error occured while adding a new host!"; + 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!"); + qCritical().noquote() << reason; } else if (type == "duplicate") { reason = tr("The specified host was already added!"); + qCritical().noquote() << reason; } else if (type == "invalid_url") { reason = tr("The specified host address is not valid!"); + qCritical().noquote() << reason; } emit step1Failed(reason); + + return; } } diff --git a/src/scenes/add_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h index 1feec9b..554f6af 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.h +++ b/src/scenes/add_server_wizard/add_server_wizard.h @@ -1,21 +1,45 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + #ifndef ADD_SERVER_WIZARD_H #define ADD_SERVER_WIZARD_H -#include "../../RWADBusAdaptor.h" #include +#include "../../RWADBusAdaptor.h" +#include "../../DBusAPI.h" + class Add_Server_wizard : public QObject { Q_OBJECT public: explicit Add_Server_wizard(QObject *parent = nullptr); + void add_server(QString host_url); private: - bool _add_server(QString host_url); - bool _add_web_app_host(QString host_url); - - OrgArcticaProjectRWASupportSessionServiceInterface *_dbus_rwa; - void _initDBus(); + DBusAPI *_dbus_api; signals: void step1Success(); @@ -24,12 +48,10 @@ signals: void step2Failed(QString reason); public slots: - bool processStep1(QString host_url); - bool processStep2(); + void processStep1(QString host_url); + void 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); + void add_web_app_host_response(QJsonDocument *doc); }; #endif // ADD_SERVER_WIZARD_H 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 id to "); - 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 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 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 id to "); - 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 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 id to "); - 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 id to "); - 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 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()); } diff --git a/src/session.h b/src/session.h index 1b8b2d6..2c534f4 100644 --- a/src/session.h +++ b/src/session.h @@ -24,26 +24,24 @@ * along with this program. If not, see . */ -#pragma once +#ifndef SESSION_H +#define SESSION_H #include #include #include #include #include -#include -#include "RWADBusAdaptor.h" #include "main_qmladaptor.h" +#include "RWAHost.h" +#include "DBusAPI.h" class Session : public QObject { Q_OBJECT - Q_PROPERTY(QString host_id READ getHostID NOTIFY hostIDChanged) // this makes status available as a QML property Q_PROPERTY(QString status READ getStatus NOTIFY statusChanged) - // this makes service id available as a QML property - Q_PROPERTY(QString id READ getID NOTIFY idChanged) // this makes session_id available as a QML property Q_PROPERTY(QString session_id READ getSessionID NOTIFY sessionIDChanged) // this makes url available as a QML property @@ -52,32 +50,23 @@ class Session : public QObject Q_PROPERTY(QString pin READ getPin NOTIFY pinChanged) public: - explicit Session(QObject *parent, MainQMLAdaptor *main_gui = nullptr); + explicit Session(QObject *parent, MainQMLAdaptor *main_gui = nullptr, + RWAHost *host = nullptr); QString getStatus(); QString getURL(); - QString getID(); - QString getHostID(); QString getSessionID(); QString getPin(); void setStatus(QString status); void setURL(QString url); - void setID(QString id); - void setHostID(QString host_id); void setSessionID(QString session_id); void setPin(QString pin); - // Starts a VNC Session - void start_request_dbus(QString host_id); - // Refreshes a VNC Session's status - void refresh_status_request_dbus(QString host_id, QString id); - // Stop the Session - void stop_request_dbus(QString id); - // Gets a VNC Session's status - void status_request_dbus(QString id); - // Returns true if Session is somewhat usable (Running, Alive, etc..) - bool isSessionAliveOrRunning(QString status); + void start(); + void stop(); + void status(); + void refresh_status(); protected: QString _status; @@ -85,33 +74,33 @@ protected: void init_vars(); private: - MainQMLAdaptor* _main_gui; - QString _id; + MainQMLAdaptor *_main_gui; + RWAHost *_host; + DBusAPI *_dbus_api; + QString _session_id; - QString _host_id; QString _url; QString _pin; - OrgArcticaProjectRWASupportSessionServiceInterface* _dbus_rwa; - void _initDBus(); + + // Returns true if a session is somewhat usable (Running, Alive, etc..) + bool isSessionAliveOrRunning(QString status); bool _minimizedBefore = false; void minimizeWindow(); - signals: void finished(); void statusChanged(QString); - void idChanged(QString); void sessionIDChanged(QString); void urlChanged(QString); void pinChanged(QString); - void hostIDChanged(QString); public slots: void handleConnectButtonClick(bool checked); - - void start_dbus_replied(QDBusPendingCallWatcher *call); - void stop_dbus_replied(QDBusPendingCallWatcher *call); - void status_dbus_replied(QDBusPendingCallWatcher *call); - void onCloseHandler(); + + void start_response(QJsonDocument *doc); + void stop_response(QJsonDocument *doc); + void status_response(QJsonDocument *doc); }; + +#endif // SESSION_H -- cgit v1.2.3 From 98049d1507a6f2ae232782fd79f4f753ad53eead Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:02:31 +0200 Subject: Fix copyright headers --- qtquickcontrols2.conf | 4 ++-- src/DBusAPI.cpp | 25 +++++++++++++++++++++++++ src/DBusAPI.h | 25 +++++++++++++++++++++++++ src/ListItem.qml | 25 +++++++++++++++++++++++++ src/RWADBusAdaptor.cpp | 25 +++++++++++++++++++++++++ src/RWADBusAdaptor.h | 25 +++++++++++++++++++++++++ src/Toast.qml | 4 ++-- src/ToastManager.qml | 4 ++-- src/main.cpp | 4 ++-- src/main.qml | 4 ++-- src/main_qmladaptor.cpp | 4 ++-- src/main_qmladaptor.h | 4 ++-- src/session.cpp | 4 ++-- src/session.h | 4 ++-- 14 files changed, 143 insertions(+), 18 deletions(-) diff --git a/qtquickcontrols2.conf b/qtquickcontrols2.conf index e646650..8bcc85b 100644 --- a/qtquickcontrols2.conf +++ b/qtquickcontrols2.conf @@ -1,7 +1,7 @@ # This file is part of Remote Support Desktop # https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp -# Copyright 2020-2021 Daniel Teichmann -# Copyright 2020-2021 Mike Gabriel +# Copyright 2020, 2021 Daniel Teichmann +# Copyright 2020, 2021 Mike Gabriel # SPDX-License-Identifier: GPL-2.0-or-later # # This program is free software; you can redistribute it and/or modify diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index 0809a51..c133910 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -1,3 +1,28 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + #include "DBusAPI.h" /*! diff --git a/src/DBusAPI.h b/src/DBusAPI.h index 1564f57..632a90b 100644 --- a/src/DBusAPI.h +++ b/src/DBusAPI.h @@ -1,3 +1,28 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + #ifndef DBUSAPI_H #define DBUSAPI_H diff --git a/src/ListItem.qml b/src/ListItem.qml index c69af4b..fa83f4b 100644 --- a/src/ListItem.qml +++ b/src/ListItem.qml @@ -1,3 +1,28 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2021 Daniel Teichmann + * 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 . + */ + import QtQuick 2.0 import QtQuick.Controls.Material 2.3 import QtQuick.Controls 2.2 diff --git a/src/RWADBusAdaptor.cpp b/src/RWADBusAdaptor.cpp index 381faca..6c1504e 100644 --- a/src/RWADBusAdaptor.cpp +++ b/src/RWADBusAdaptor.cpp @@ -1,3 +1,28 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2020, 2021 Daniel Teichmann + * 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 . + */ + /* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -i src/RWADBusAdaptor.h -p :src/RWADBusAdaptor.cpp rwa.xml diff --git a/src/RWADBusAdaptor.h b/src/RWADBusAdaptor.h index 741687f..77f4b6c 100644 --- a/src/RWADBusAdaptor.h +++ b/src/RWADBusAdaptor.h @@ -1,3 +1,28 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp + * Copyright 2020, 2021 Daniel Teichmann + * 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 . + */ + /* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p src/RWADBusAdaptor.h: rwa.xml diff --git a/src/Toast.qml b/src/Toast.qml index eb65b20..a427d10 100644 --- a/src/Toast.qml +++ b/src/Toast.qml @@ -1,8 +1,8 @@ /* * This file is part of Remote Support Desktop * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * Copyright 2020-2021 Daniel Teichmann - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/ToastManager.qml b/src/ToastManager.qml index b448905..1acf8d5 100644 --- a/src/ToastManager.qml +++ b/src/ToastManager.qml @@ -1,8 +1,8 @@ /* * This file is part of Remote Support Desktop * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * Copyright 2020-2021 Daniel Teichmann - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/main.cpp b/src/main.cpp index f23e2c9..213a591 100644 --- a/src/main.cpp +++ b/src/main.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 - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/main.qml b/src/main.qml index 1981f4f..a9bbed7 100644 --- a/src/main.qml +++ b/src/main.qml @@ -1,8 +1,8 @@ /* * This file is part of Remote Support Desktop * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * Copyright 2020-2021 Daniel Teichmann - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 8a54eb3..731efaf 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 - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 4619968..3c6e75b 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -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 - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/session.cpp b/src/session.cpp index 1ee4eef..4640786 100644 --- a/src/session.cpp +++ b/src/session.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 - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify diff --git a/src/session.h b/src/session.h index 2c534f4..5935919 100644 --- a/src/session.h +++ b/src/session.h @@ -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 - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify -- cgit v1.2.3 From 61b4ee3b8f1d4c5d85b7a561551167fa41b12400 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:04:48 +0200 Subject: Tidy up some debug statements or long strings --- src/Toast.qml | 1 - src/main.cpp | 14 +++++++------- src/main.qml | 9 +++++++-- src/scenes/Scene_placeholder.qml | 2 +- src/session.cpp | 18 +++++++++++++----- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Toast.qml b/src/Toast.qml index a427d10..60e238c 100644 --- a/src/Toast.qml +++ b/src/Toast.qml @@ -58,7 +58,6 @@ Control { else { time = defaultTime; } - console.log("Showing a new toast with display time: " + time); animation.start(); } diff --git a/src/main.cpp b/src/main.cpp index 213a591..3339840 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,12 +55,12 @@ int main(int argc, char *argv[]) { tmpDir.mkpath("."); } QLockFile lockFile(tmpFilePath); - qDebug() << "Checking for a lockfile at: " + tmpFilePath; + qDebug().noquote() << QString("Checking for a lockfile at: '%0'").arg(tmpFilePath); if(!lockFile.tryLock(100)){ - qDebug() << QObject::tr("You already have this app running."); - qDebug() << QObject::tr("Only one instance is allowed."); - qDebug() << QObject::tr("Closing application now with an error."); + qDebug().noquote() << "You already have this app running.\n" + << "Only one instance is allowed.\n" + << "Closing application now with an error."; return 1; } @@ -71,12 +71,12 @@ int main(int argc, char *argv[]) { QQuickStyle::setStyle("Material"); QTranslator translator; - qDebug() << "Loading locale: qrc:/locales/bin/" + QLocale::system().name(); + qDebug().noquote() << QString("Locales: Loading locale: qrc:/locales/bin/%0").arg(QLocale::system().name()); if(translator.load(":/locales/bin/" + QLocale::system().name())) { app.installTranslator(&translator); - qDebug() << "Loaded: " + QLocale::system().name() + " locale!"; + qDebug().noquote() << "Locales: Loaded: " + QLocale::system().name() + " locale!"; } else { - qDebug() << "Unable to load translation"; + qWarning() << "Locales: Unable to load translation!"; } QQmlApplicationEngine engine(&app); diff --git a/src/main.qml b/src/main.qml index a9bbed7..3574a8c 100644 --- a/src/main.qml +++ b/src/main.qml @@ -32,7 +32,6 @@ import QtQuick.Controls.Styles 1.4 import QtQuick.Dialogs 1.2 import QtQuick.Controls.Material 2.3 import "scenes" as Scenes -//import "ListItem.qml" /*! The main.qml file contains the window, with its header, sidebar, toast and main_content. @@ -59,7 +58,7 @@ ApplicationWindow { function minimizeWindow() { showMinimized(); - console.log("Miniming window now..."); + console.log("Minimizing window now..."); } function showWindow() { @@ -225,6 +224,7 @@ ApplicationWindow { VisualItemModel { id: mainModel + ListItem { text: " " + qsTr("Remote Control") scene_url: "scenes/Scene_remote_control.qml" @@ -362,3 +362,8 @@ ApplicationWindow { } } } + +/*##^## Designer { + D{i:14;anchors_width:650} +} + ##^##*/ diff --git a/src/scenes/Scene_placeholder.qml b/src/scenes/Scene_placeholder.qml index a5ceac9..29e15a9 100644 --- a/src/scenes/Scene_placeholder.qml +++ b/src/scenes/Scene_placeholder.qml @@ -43,7 +43,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/session.cpp b/src/session.cpp index 4640786..14b6575 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -158,7 +158,8 @@ void Session::setStatus(QString status) { emit _main_gui->showWindow(); - _main_gui->showToast(tr("Remote Support session was stopped ungracefully"), 5000); + _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"); @@ -183,24 +184,29 @@ void Session::setStatus(QString status) { 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); + _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(tr("Session was started successfully")); + _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!"); + 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!"); + 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(); @@ -353,6 +359,8 @@ void Session::status_response(QJsonDocument *doc) { 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); } -- cgit v1.2.3 From d30e51002393f48c271fc4109f1b6b71ea1d0440 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:07:01 +0200 Subject: MainQMLAdaptor: engine can't be nullptr in constructor --- src/main_qmladaptor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 731efaf..b34c9d4 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -26,8 +26,9 @@ #include "main_qmladaptor.h" -MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent) -{ +MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent) { + Q_ASSERT(engine != nullptr); + _engine = engine; } -- cgit v1.2.3 From d0d6402c46b3fc074002849f4e8071407d06df4f Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:21:46 +0200 Subject: Drop add_server_wizard/Scene_step_2.qml --- qml.qrc | 1 - src/scenes/add_server_wizard/Scene_step_1.qml | 4 +- src/scenes/add_server_wizard/Scene_step_2.qml | 70 --------------------------- 3 files changed, 2 insertions(+), 73 deletions(-) delete mode 100644 src/scenes/add_server_wizard/Scene_step_2.qml diff --git a/qml.qrc b/qml.qrc index e7bf198..5c8d030 100644 --- a/qml.qrc +++ b/qml.qrc @@ -28,7 +28,6 @@ src/scenes/Scene_settings.qml src/scenes/Scene_placeholder.qml src/scenes/add_server_wizard/Scene_step_1.qml - src/scenes/add_server_wizard/Scene_step_2.qml src/scenes/add_server_wizard/add_server_wizard.cpp src/scenes/add_server_wizard/add_server_wizard.h diff --git a/src/scenes/add_server_wizard/Scene_step_1.qml b/src/scenes/add_server_wizard/Scene_step_1.qml index e76462a..a80e4f4 100644 --- a/src/scenes/add_server_wizard/Scene_step_1.qml +++ b/src/scenes/add_server_wizard/Scene_step_1.qml @@ -15,9 +15,9 @@ Item { Connections { target: add_server_wizard onStep1Success: { - //main_content_push("scenes/add_server_wizard/Scene_step_2.qml", StackView.Transition) + // 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); } } 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} -} - ##^##*/ -- cgit v1.2.3 From 3b2c865566aea43ab21afadcd34f58db0a5d5ab8 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:25:45 +0200 Subject: DBusAPI: Change critical error to qCritical instead of qDebug. --- src/DBusAPI.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index c133910..7f14e4f 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -77,8 +77,8 @@ void DBusAPI::start_reply(QDBusPendingCallWatcher *call) { QString result = ""; QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus 'start' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus 'start' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceStartResponse(nullptr); return; @@ -135,8 +135,8 @@ void DBusAPI::stop_reply(QDBusPendingCallWatcher *call) { QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus 'stop' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus 'stop' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceStopResponse(nullptr); } else { @@ -218,8 +218,8 @@ void DBusAPI::status_reply(QDBusPendingCallWatcher *call){ QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus '(refresh_)status' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus '(refresh_)status' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceStatusResponse(nullptr); return; @@ -300,8 +300,8 @@ void DBusAPI::get_web_app_hosts_reply(QDBusPendingCallWatcher *call){ QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus 'get_web_app_hosts' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus 'get_web_app_hosts' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceGetWebAppHostsResponse(nullptr); return; @@ -329,8 +329,8 @@ void DBusAPI::add_web_app_host_reply(QDBusPendingCallWatcher *call){ QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus 'add_web_app_host' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus 'add_web_app_host' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceAddWebAppHostResponse(nullptr); return; @@ -358,8 +358,8 @@ void DBusAPI::remove_web_app_host_reply(QDBusPendingCallWatcher *call){ QDBusPendingReply reply = *call; if (reply.isError()) { - qDebug() << "D-Bus 'remove_web_app_host' request failed, this was the reply:"; - qDebug() << reply.error(); + qCritical() << "D-Bus 'remove_web_app_host' request failed, this was the reply:"; + qCritical() << reply.error(); emit serviceRemoveWebAppHostResponse(nullptr); return; -- cgit v1.2.3 From 54249d9c37ce3994b03123ee6367c7f5519d3b40 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Wed, 7 Jul 2021 15:03:13 +0200 Subject: Introduce RWAHostModel. RWAHost's are now loaded on start. Scene_remote_{view, control} are no longer available if no host is selected. --- qml.qrc | 2 + rwa-support-desktopapp.pro | 4 +- src/RWAHostModel.cpp | 37 +++++++++ src/RWAHostModel.h | 23 ++++++ src/main.cpp | 14 +++- src/main.qml | 27 ++++++- src/main_qmladaptor.cpp | 94 ++++++++++++++++++++++ src/main_qmladaptor.h | 18 +++++ src/scenes/add_server_wizard/add_server_wizard.cpp | 10 +-- src/scenes/add_server_wizard/add_server_wizard.h | 5 +- src/session.cpp | 1 - 11 files changed, 225 insertions(+), 10 deletions(-) create mode 100644 src/RWAHostModel.cpp create mode 100644 src/RWAHostModel.h diff --git a/qml.qrc b/qml.qrc index 5c8d030..07b6bd2 100644 --- a/qml.qrc +++ b/qml.qrc @@ -17,6 +17,8 @@ src/session.h src/RWAHost.h src/RWAHost.cpp + src/RWAHostModel.h + src/RWAHostModel.cpp src/DBusAPI.h src/DBusAPI.cpp src/ListItem.qml diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index 5c3f24d..a15c4bd 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -48,14 +48,16 @@ SOURCES += src/main.cpp \ src/RWADBusAdaptor.cpp \ src/session.cpp \ src/scenes/add_server_wizard/add_server_wizard.cpp \ + src/RWAHostModel.cpp \ src/RWAHost.cpp \ - src/DBusAPI.cpp + src/DBusAPI.cpp \ HEADERS += src/RWADBusAdaptor.h \ src/main_qmladaptor.h \ src/RWADBusAdaptor.h \ src/session.h \ src/scenes/add_server_wizard/add_server_wizard.h \ + src/RWAHostModel.h \ src/RWAHost.h \ src/DBusAPI.h diff --git a/src/RWAHostModel.cpp b/src/RWAHostModel.cpp new file mode 100644 index 0000000..5f62adc --- /dev/null +++ b/src/RWAHostModel.cpp @@ -0,0 +1,37 @@ +#include "RWAHostModel.h" + +RWAHostModel::RWAHostModel(QObject *parent) { + Q_UNUSED(parent) +} + +int RWAHostModel::rowCount(const QModelIndex& parent) const { + Q_UNUSED(parent); + return mDatas.size(); +} + +int RWAHostModel::columnCount(const QModelIndex& parent) const { + Q_UNUSED(parent); + return 1; +} + +QVariant RWAHostModel::data(const QModelIndex &index, int role) const + { + if (!index.isValid()) + return QVariant(); + if ( role == Qt::DisplayRole) { + return mDatas[index.row()]; + } + return QVariant(); +} + +void RWAHostModel::populate() { + beginResetModel(); + mDatas.clear(); + RWAHost *host1 = new RWAHost("uuid-1", "Erster Server", "url1"); + RWAHost *host2 = new RWAHost("uuid-2", "Zweiter Server", "url2"); + RWAHost *host3 = new RWAHost("uuid-3", "Dritter Server", "url3"); + mDatas.append(host1->alias()); + mDatas.append(host2->alias()); + mDatas.append(host3->alias()); + endResetModel(); +} diff --git a/src/RWAHostModel.h b/src/RWAHostModel.h new file mode 100644 index 0000000..8697df2 --- /dev/null +++ b/src/RWAHostModel.h @@ -0,0 +1,23 @@ +#ifndef RWAHOSTMODEL_H +#define RWAHOSTMODEL_H + +#include +#include + +#include "RWAHost.h" + +class RWAHostModel : public QAbstractListModel { + Q_OBJECT + +public: + explicit RWAHostModel(QObject * parent = nullptr); + int rowCount(const QModelIndex& parent = QModelIndex()) const; + int columnCount(const QModelIndex& parent = QModelIndex()) const; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; + void populate(); + +private: + QStringList mDatas; +}; + +#endif // RWAHOSTMODEL_H diff --git a/src/main.cpp b/src/main.cpp index 3339840..b85c3fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,6 +39,7 @@ #include "RWADBusAdaptor.cpp" #include "session.h" #include "scenes/add_server_wizard/add_server_wizard.h" +#include "RWAHostModel.h" #include "RWAHost.h" #define BUILD_TIME __DATE__ " " __TIME__ @@ -86,6 +87,13 @@ int main(int argc, char *argv[]) { // Make mainqmladaptor available to QML engine.rootContext()->setContextProperty("mainqmladaptor", main_gui.data()); + QScopedPointer _dbus_api (new DBusAPI()); + QObject::connect(_dbus_api.data(), + SIGNAL(serviceGetWebAppHostsResponse(QJsonDocument*)), + main_gui.data(), + SLOT(get_web_app_hosts_response(QJsonDocument*))); + _dbus_api.data()->get_web_app_hosts_request(); + engine.load(QUrl(QStringLiteral("qrc:/src/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; @@ -102,9 +110,13 @@ int main(int argc, char *argv[]) { engine.rootObjects().takeFirst(), SLOT(showWindow())); - QScopedPointer wizard (new Add_Server_wizard(&app)); + QObject::connect(engine.rootObjects().takeFirst()->findChild("sidebar_drawer"), + SIGNAL(rwaHostSelected(QString)), + main_gui.data(), + SLOT(onRwaHostSelected(QString))); // Make add_server_wizard available to QML + QScopedPointer wizard (new Add_Server_wizard(&app, main_gui.data())); engine.rootContext()->setContextProperty("add_server_wizard", wizard.data()); return app.exec(); diff --git a/src/main.qml b/src/main.qml index 3574a8c..8a19d54 100644 --- a/src/main.qml +++ b/src/main.qml @@ -182,8 +182,9 @@ ApplicationWindow { */ Drawer { id: sidebar_drawer - y: top_menu_bar_frame.height + objectName: "sidebar_drawer" + y: top_menu_bar_frame.height width: !inPortrait ? Math.min(300, Math.max(200, window.width * 0.333)) : (window.width * 0.5) height: window.height - top_menu_bar_frame.height @@ -194,6 +195,9 @@ ApplicationWindow { margins: -2 visible: !inPortrait + signal rwaHostSelected(string host_uuid) + property bool rwaHostIsSelected: false + ListView { id: sidebar_listview boundsBehavior: Flickable.StopAtBounds @@ -202,6 +206,21 @@ ApplicationWindow { anchors.fill: parent model: mainModel + header: ComboBox { + id: server_chooser + objectName: "server_chooser" + width: parent.width + height: 50 + model: mainqmladaptor.rwaHostModel + + textRole: "alias" + onCurrentIndexChanged: { + var rwa_host = mainqmladaptor.rwaHostModel + sidebar_drawer.rwaHostSelected(rwa_host[currentIndex].uuid) + sidebar_drawer.rwaHostIsSelected = true + } + } + footer: ItemDelegate { id: footer text: " " + qsTr("Settings") @@ -234,6 +253,9 @@ ApplicationWindow { main_content_replace(scene_url, StackView.Transition) } + + // Disabled till a RWAHost object is selected. + enabled: sidebar_drawer.rwaHostIsSelected } ListItem { text: " " + qsTr("Remote View") @@ -244,6 +266,9 @@ ApplicationWindow { main_content_replace(scene_url, StackView.Transition) } + + // Disabled till a RWAHost object is selected. + enabled: sidebar_drawer.rwaHostIsSelected } ListItem { text: " " + qsTr("Add RWA-Server") diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index b34c9d4..d75b15c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -30,6 +30,100 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : Q_ASSERT(engine != nullptr); _engine = engine; + _rwaHostModel = new QList; +} + +void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { + Q_ASSERT(host_uuid != ""); + + RWAHost *_host = nullptr; + for (int i = 0; i < getRWAHostModel().size(); i++) { + QObject *obj = getRWAHostModel().value(i); + RWAHost *host = qobject_cast(obj); + Q_ASSERT(host != nullptr); + + if (host->uuid() == host_uuid) { + _host = host; + } + } + Q_ASSERT(_host != nullptr); + + qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); +} + +void MainQMLAdaptor::setRWAHostModel(QList rwa_hosts) { + + _rwaHostModel = &rwa_hosts; + emit rwaHostModelChanged(rwa_hosts); +} + +void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { + _rwaHostModel->append(rwa_host); + emit rwaHostModelChanged(*_rwaHostModel); +} + +QList MainQMLAdaptor::getRWAHostModel() { + return *_rwaHostModel; +} + +void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { + Q_ASSERT(doc != nullptr); + + // 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(); + + 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; + //emit step1Failed(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); + addRWAHost(rwa_host); + + qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + } + } else { + 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; + } } bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 3c6e75b..8701fc9 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -32,11 +32,18 @@ #include #include #include +#include +#include +#include + +#include "RWAHost.h" class MainQMLAdaptor : public QObject { Q_OBJECT // this makes url available as a QML property + Q_PROPERTY(QList rwaHostModel READ getRWAHostModel WRITE setRWAHostModel NOTIFY rwaHostModelChanged) + // this makes url available as a QML property Q_PROPERTY(QString url READ getURL WRITE setURL NOTIFY urlChanged) // this makes pin available as a QML property Q_PROPERTY(QString pin READ getPin WRITE setPin NOTIFY pinChanged) @@ -67,6 +74,7 @@ public: QString getMessageDialogText(); QMessageBox::Icon getMessageDialogIcon(); bool getShowMessageDialog(); + signals: void showMessageDialogChanged(bool show); void messageDialogTextChanged(QString text); @@ -82,6 +90,8 @@ signals: void urlChanged(QString URL); void sessionIDChanged(QString session_id); + void rwaHostModelChanged(QList); + void onCloseSignal(); void showToastSignal(QString text, QString durationMs); @@ -90,6 +100,8 @@ protected: QString _url; QString _pin; QString _session_id; + QList* _rwaHostModel; + private: QQmlApplicationEngine* _engine; @@ -102,13 +114,19 @@ public slots: void handleCopyToClipboardButtonClick(QString copy_data); void handleConnectButtonClick(bool checked); + void get_web_app_hosts_response(QJsonDocument *doc); + void setPin(QString pin); void setURL(QString URL); void setSessionID(QString session_id); + void setRWAHostModel(QList); + void addRWAHost(RWAHost *rwa_host); QString getURL(); QString getPin(); QString getSessionID(); + QList getRWAHostModel(); + void onRwaHostSelected(QString host_uuid); void onCloseHandler(); void showToast(QString text, uint durationMs = 3000); diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index bd1dd3c..d06108c 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -23,16 +23,15 @@ * along with this program. If not, see . */ -#include -#include -#include - #include "add_server_wizard.h" #include "../../RWADBusAdaptor.h" #include "../../RWAHost.h" -Add_Server_wizard::Add_Server_wizard(QObject *parent) : QObject(parent) { +Add_Server_wizard::Add_Server_wizard(QObject *parent, MainQMLAdaptor *main_gui) : QObject(parent) { + Q_ASSERT(main_gui != nullptr); + _dbus_api = new DBusAPI(); + _main_gui = main_gui; // _dbus_api --serviceAddWebAppHostResponse-> this.add_web_app_host_response() QObject::connect(_dbus_api, @@ -96,6 +95,7 @@ void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { // Now built RWAHost object. QScopedPointer rwa_host (new RWAHost(host_uuid, host_alias, host_url)); + _main_gui->addRWAHost(rwa_host.data()); qInfo() << "Successfully added a new RWAHost."; emit step1Success(); diff --git a/src/scenes/add_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h index 554f6af..e4d62df 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.h +++ b/src/scenes/add_server_wizard/add_server_wizard.h @@ -30,16 +30,19 @@ #include "../../RWADBusAdaptor.h" #include "../../DBusAPI.h" +#include "../../main_qmladaptor.h" class Add_Server_wizard : public QObject { Q_OBJECT public: - explicit Add_Server_wizard(QObject *parent = nullptr); + explicit Add_Server_wizard(QObject *parent = nullptr, + MainQMLAdaptor *main_gui = nullptr); void add_server(QString host_url); private: DBusAPI *_dbus_api; + MainQMLAdaptor *_main_gui; signals: void step1Success(); diff --git a/src/session.cpp b/src/session.cpp index 14b6575..32aca7d 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -82,7 +82,6 @@ Session::Session(QObject *parent, MainQMLAdaptor* main_gui, RWAHost *host) : QOb this, SLOT(status_response(QJsonDocument*))); - this->init_vars(); } -- cgit v1.2.3 From 9d3405f5e94e21e4401c30808dc3c93f6fbd3283 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Wed, 7 Jul 2021 15:40:58 +0200 Subject: RWAHost is now an QObject available to QML. --- src/RWAHost.cpp | 33 +++++++++++++++------------------ src/RWAHost.h | 28 +++++++++++++++++----------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/RWAHost.cpp b/src/RWAHost.cpp index 006ecd9..cc25b57 100644 --- a/src/RWAHost.cpp +++ b/src/RWAHost.cpp @@ -40,32 +40,29 @@ RWAHost::RWAHost(QString uuid, QString alias, QString url) { _uuid = uuid; } -QString RWAHost::url() const -{ - return _url; +QString RWAHost::uuid() const { + return _uuid; } -void RWAHost::setUrl(const QString &url) -{ - _url = url; +QString RWAHost::alias() const { + return _alias; } -QString RWAHost::alias() const -{ - return _alias; +QString RWAHost::url() const { + return _url; } -void RWAHost::setAlias(const QString &alias) -{ - _alias = alias; +void RWAHost::setUuid(const QString &uuid) { + _uuid = uuid; + emit uuidChanged(uuid); } -QString RWAHost::uuid() const -{ - return _uuid; +void RWAHost::setAlias(const QString &alias) { + _alias = alias; + emit aliasChanged(alias); } -void RWAHost::setUuid(const QString &uuid) -{ - _uuid = uuid; +void RWAHost::setUrl(const QString &url) { + _url = url; + emit urlChanged(url); } diff --git a/src/RWAHost.h b/src/RWAHost.h index c78ef5f..58b6d45 100644 --- a/src/RWAHost.h +++ b/src/RWAHost.h @@ -29,19 +29,14 @@ #include #include -class RWAHost : public QObject -{ +class RWAHost : public QObject { Q_OBJECT -public: - explicit RWAHost(QString uuid = "", QString alias = "", QString url = ""); - - QString uuid() const; - QString alias() const; - QString url() const; + Q_PROPERTY(QString uuid READ uuid WRITE setUuid NOTIFY uuidChanged) + Q_PROPERTY(QString alias READ alias WRITE setAlias NOTIFY aliasChanged) + Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged) - void setUuid(const QString &uuid); - void setAlias(const QString &alias); - void setUrl(const QString &url); +public: + RWAHost(QString uuid = "", QString alias = "", QString url = ""); private: QString _uuid; @@ -49,8 +44,19 @@ private: QString _url; signals: + void uuidChanged(QString uuid); + void aliasChanged(QString alias); + void urlChanged(QString url); public slots: + QString uuid() const; + QString alias() const; + QString url() const; + + void setUuid(const QString &uuid); + void setAlias(const QString &alias); + void setUrl(const QString &url); + }; #endif // RWAHOST_H -- cgit v1.2.3 From 0ed25cd9cd46ba4c3f64eb5e8866becaa07f5344 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Wed, 7 Jul 2021 15:42:42 +0200 Subject: Various small improvements to readability --- src/main.cpp | 4 ++-- src/main.qml | 2 +- src/main_qmladaptor.cpp | 19 ++++++++----------- src/main_qmladaptor.h | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b85c3fc..a72e42b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,6 +36,7 @@ #include #include +#include "DBusAPI.h" #include "RWADBusAdaptor.cpp" #include "session.h" #include "scenes/add_server_wizard/add_server_wizard.h" @@ -82,9 +83,8 @@ int main(int argc, char *argv[]) { QQmlApplicationEngine engine(&app); - QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine)); - // Make mainqmladaptor available to QML + QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine)); engine.rootContext()->setContextProperty("mainqmladaptor", main_gui.data()); QScopedPointer _dbus_api (new DBusAPI()); diff --git a/src/main.qml b/src/main.qml index 8a19d54..12c4668 100644 --- a/src/main.qml +++ b/src/main.qml @@ -212,8 +212,8 @@ ApplicationWindow { width: parent.width height: 50 model: mainqmladaptor.rwaHostModel - textRole: "alias" + onCurrentIndexChanged: { var rwa_host = mainqmladaptor.rwaHostModel sidebar_drawer.rwaHostSelected(rwa_host[currentIndex].uuid) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index d75b15c..5fcce5f 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -128,7 +128,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("start_support_button"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("enabled", enabled); if (item->property("checked").toBool()) { @@ -146,7 +147,8 @@ bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { bool MainQMLAdaptor::setConnectButtonChecked(bool checked) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("start_support_button"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("checked", checked); } else { @@ -159,7 +161,8 @@ bool MainQMLAdaptor::setConnectButtonChecked(bool checked) { bool MainQMLAdaptor::setStatus(QString status) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("dbus_api_status_text"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("dbus_api_status_text"); if (item) { item->setProperty("text", status); } else { @@ -203,7 +206,8 @@ bool MainQMLAdaptor::getShowMessageDialog() { bool MainQMLAdaptor::setStatusIndicator(bool active, QColor color) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("dbus_api_status_indicator"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("dbus_api_status_indicator"); if (item) { item->setProperty("active", active); item->setProperty("color", color); @@ -256,10 +260,3 @@ void MainQMLAdaptor::onCloseHandler() { void MainQMLAdaptor::showToast(QString text, uint durationMs) { emit showToastSignal(text, QString::number(durationMs)); } - -//void MainQMLAdaptor::onCloseHandler() { -// qDebug() << "Inside MainQMLAdaptor::onCloseHandler()"; - -// // Sending onClose signal to main and there to Session::onCloseHandler() -// emit MainQMLAdaptor::onCloseSignal(); -//} diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 8701fc9..05de1fd 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -61,7 +61,7 @@ class MainQMLAdaptor : public QObject public: explicit MainQMLAdaptor(QObject *parent, QQmlApplicationEngine *engine = nullptr); -// void setSession(Session session); +// void setSession(Session session); bool setConnectButtonEnabled(bool enabled); bool setConnectButtonChecked(bool checked); -- cgit v1.2.3 From dc3b77a1e3c8b8ff9a9299fd17c13b0428f1fa14 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:50:22 +0200 Subject: Add: 'Scene_no_server_available.qml' --- qml.qrc | 1 + src/main.qml | 56 ++++++++++++++++--------- src/main_qmladaptor.cpp | 50 ++++++++++++++++++++--- src/main_qmladaptor.h | 15 +++++-- src/scenes/Scene_no_server_available.qml | 70 ++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 src/scenes/Scene_no_server_available.qml diff --git a/qml.qrc b/qml.qrc index 07b6bd2..b472fe7 100644 --- a/qml.qrc +++ b/qml.qrc @@ -29,6 +29,7 @@ src/scenes/Scene_remote_view.qml src/scenes/Scene_settings.qml src/scenes/Scene_placeholder.qml + src/scenes/Scene_no_server_available.qml src/scenes/add_server_wizard/Scene_step_1.qml src/scenes/add_server_wizard/add_server_wizard.cpp src/scenes/add_server_wizard/add_server_wizard.h diff --git a/src/main.qml b/src/main.qml index 12c4668..4494526 100644 --- a/src/main.qml +++ b/src/main.qml @@ -66,25 +66,25 @@ ApplicationWindow { console.log("Opening window now..."); } - function main_content_pop(item, operation) { + function main_content_pop(item) { if(item) { if(item.search(main_content.currentItem.objectName) >= 0) return } - return main_content.pop(item, operation) + return main_content.pop(item) } - function main_content_push(item, operation) { + function main_content_push(item) { if(item) { if(item.search(main_content.currentItem.objectName) >= 0) return } - return main_content.push(item, operation) + return main_content.push(item) } - function main_content_replace(item, operation) { + function main_content_replace(item) { if(item) { if(item.search(main_content.currentItem.objectName) >= 0) return } - return main_content.replace(item, operation) + return main_content.replace(item) } MessageDialog { @@ -206,18 +206,29 @@ ApplicationWindow { anchors.fill: parent model: mainModel - header: ComboBox { - id: server_chooser - objectName: "server_chooser" - width: parent.width + header: Rectangle { height: 50 - model: mainqmladaptor.rwaHostModel - textRole: "alias" + width: parent.width + color: Material.background + + ComboBox { + id: server_chooser + objectName: "server_chooser" + + padding: 0 + width: parent.width + height: 56 - y + y: -6 + clip: false + + model: mainqmladaptor.rwaHostModel + textRole: "alias" - onCurrentIndexChanged: { - var rwa_host = mainqmladaptor.rwaHostModel - sidebar_drawer.rwaHostSelected(rwa_host[currentIndex].uuid) - sidebar_drawer.rwaHostIsSelected = true + onCurrentIndexChanged: { + var rwa_host = mainqmladaptor.rwaHostModel + if (rwa_host[currentIndex] !== undefined) + sidebar_drawer.rwaHostSelected(rwa_host[currentIndex].uuid) + } } } @@ -225,13 +236,15 @@ ApplicationWindow { id: footer text: " " + qsTr("Settings") width: parent.width + enabled: false onClicked: { var scene_url = "scenes/Scene_placeholder.qml" header_text.text = qsTr("Settings") if(inPortrait) sidebar_drawer.close() - main_content_replace(scene_url, StackView.Transition) + if(scene_url.search(main_content.currentItem.objectName) >= 0) return + main_content.replace(scene_url, StackView.Transition) } MenuSeparator { @@ -251,7 +264,8 @@ ApplicationWindow { header_text.text = qsTr("Allow remote control") if(inPortrait) sidebar_drawer.close() - main_content_replace(scene_url, StackView.Transition) + if(scene_url.search(main_content.currentItem.objectName) >= 0) return + main_content.replace(scene_url, StackView.Transition) } // Disabled till a RWAHost object is selected. @@ -264,7 +278,8 @@ ApplicationWindow { header_text.text = qsTr("Allow remote view") if(inPortrait) sidebar_drawer.close() - main_content_replace(scene_url, StackView.Transition) + if(scene_url.search(main_content.currentItem.objectName) >= 0) return + main_content.replace(scene_url, StackView.Transition) } // Disabled till a RWAHost object is selected. @@ -277,7 +292,8 @@ ApplicationWindow { header_text.text = qsTr("Server addition wizard") if(inPortrait) sidebar_drawer.close() - main_content_push(scene_url, StackView.ReplaceTransition) + if(scene_url.search(main_content.currentItem.objectName) >= 0) return + main_content.push(scene_url, StackView.ReplaceTransition) } } } diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 5fcce5f..c1d3f14 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -49,12 +49,19 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { Q_ASSERT(_host != nullptr); qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); -} -void MainQMLAdaptor::setRWAHostModel(QList rwa_hosts) { + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", true); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } +} - _rwaHostModel = &rwa_hosts; - emit rwaHostModelChanged(rwa_hosts); +void MainQMLAdaptor::setRWAHostModel(QList *rwa_hosts) { + _rwaHostModel = rwa_hosts; + emit rwaHostModelChanged(*rwa_hosts); } void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { @@ -69,6 +76,10 @@ QList MainQMLAdaptor::getRWAHostModel() { void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { Q_ASSERT(doc != nullptr); + delete _rwaHostModel; + setRWAHostModel(new QList); + bool atLeastOneHostAvailable = false; + // Get the QJsonObject QJsonObject jObject = doc->object(); QVariantMap mainMap = jObject.toVariantMap(); @@ -90,7 +101,6 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { "service lacks a necessary value. (host_url or host_uuid)"); qCritical().noquote() << tr("An error occured while adding a new host:") << reason; - //emit step1Failed(reason); return; } @@ -104,6 +114,7 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { // Now built RWAHost object. RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url); addRWAHost(rwa_host); + atLeastOneHostAvailable = true; qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); } @@ -124,6 +135,35 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { return; } + + if (!atLeastOneHostAvailable) { + main_content_replace("scenes/Scene_no_server_available.qml"); + //addRWAHost(new RWAHost("-","Kein Server verfügbar!","-")); + } +} + +void MainQMLAdaptor::main_content_push(QString scene) { + // Find item via 'objectName' + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + QMetaObject::invokeMethod(main_content, "push", Q_ARG(QString, scene)); +} + +void MainQMLAdaptor::main_content_pop(QString scene) { + // Find item via 'objectName' + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + QMetaObject::invokeMethod(main_content, "pop", Q_ARG(QString, scene)); +} + +void MainQMLAdaptor::main_content_replace(QString scene) { + // Find item via 'objectName' + QObject *window = _engine->rootObjects().takeFirst(); + Q_ASSERT(window != nullptr); + + QVariant arg = QVariant::fromValue(scene); + if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) + qDebug() << "Failed to invoke push"; } bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 05de1fd..a289a74 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -42,7 +42,7 @@ class MainQMLAdaptor : public QObject { Q_OBJECT // this makes url available as a QML property - Q_PROPERTY(QList rwaHostModel READ getRWAHostModel WRITE setRWAHostModel NOTIFY rwaHostModelChanged) + Q_PROPERTY(QList rwaHostModel READ getRWAHostModel NOTIFY rwaHostModelChanged) // this makes url available as a QML property Q_PROPERTY(QString url READ getURL WRITE setURL NOTIFY urlChanged) // this makes pin available as a QML property @@ -61,11 +61,15 @@ class MainQMLAdaptor : public QObject public: explicit MainQMLAdaptor(QObject *parent, QQmlApplicationEngine *engine = nullptr); -// void setSession(Session session); + void setRWAHostModel(QList *rwa_hosts); bool setConnectButtonEnabled(bool enabled); bool setConnectButtonChecked(bool checked); + void main_content_push(QString); + void main_content_pop(QString); + void main_content_replace(QString); + bool setStatusIndicator(bool active, QColor color = QColor(255,255,255)); bool setStatus(QString status); @@ -100,7 +104,8 @@ protected: QString _url; QString _pin; QString _session_id; - QList* _rwaHostModel; + DBusAPI *_dbus_api; + QList *_rwaHostModel; private: QQmlApplicationEngine* _engine; @@ -119,11 +124,13 @@ public slots: void setPin(QString pin); void setURL(QString URL); void setSessionID(QString session_id); - void setRWAHostModel(QList); void addRWAHost(RWAHost *rwa_host); QString getURL(); QString getPin(); QString getSessionID(); + + // No pointer because QML doesn't + // like this type much with pointer QList getRWAHostModel(); void onRwaHostSelected(QString host_uuid); diff --git a/src/scenes/Scene_no_server_available.qml b/src/scenes/Scene_no_server_available.qml new file mode 100644 index 0000000..112c6e0 --- /dev/null +++ b/src/scenes/Scene_no_server_available.qml @@ -0,0 +1,70 @@ +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} +} + ##^##*/ -- cgit v1.2.3 From 0f73c7ff3f8a84bcacf077644d6a199301f58945 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:54:20 +0200 Subject: User can decide on host_alias now. --- src/DBusAPI.cpp | 22 ++++- src/DBusAPI.h | 2 +- src/scenes/add_server_wizard/Scene_step_1.qml | 105 +++++++++++++++++++-- src/scenes/add_server_wizard/add_server_wizard.cpp | 43 ++------- src/scenes/add_server_wizard/add_server_wizard.h | 7 +- 5 files changed, 132 insertions(+), 47 deletions(-) diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index 7f14e4f..18c5974 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -56,6 +56,8 @@ void DBusAPI::_initDBus() { * \a host RWAHost object which includes all necessary information about a RWA host. */ void DBusAPI::start_request(RWAHost *host) { + Q_ASSERT(host != nullptr); + qDebug() << "Requesting D-Bus service to start a new session on host:" << host->alias(); // Make an asynchrous 'start' call (Response will be sent to 'start_reply') @@ -101,6 +103,9 @@ void DBusAPI::start_reply(QDBusPendingCallWatcher *call) { * \a session_id Unique identifier for a session in a specific host. */ void DBusAPI::stop_request(RWAHost *host, QString session_id) { + Q_ASSERT(host != nullptr); + Q_ASSERT(session_id != ""); + bool ok; long long session_id_number = session_id.toLongLong(&ok); @@ -158,6 +163,9 @@ void DBusAPI::stop_reply(QDBusPendingCallWatcher *call) { * \a session_id Unique identifier for a session in a specific host. */ void DBusAPI::status_request(RWAHost *host, QString session_id) { + Q_ASSERT(host != nullptr); + Q_ASSERT(session_id != ""); + bool ok; long long session_id_number = session_id.toLongLong(&ok); @@ -186,6 +194,9 @@ void DBusAPI::status_request(RWAHost *host, QString session_id) { * \a session_id Unique identifier for a session in a specific host. */ void DBusAPI::refresh_status_request(RWAHost *host, QString session_id) { + Q_ASSERT(host != nullptr); + Q_ASSERT(session_id != ""); + bool ok; long long session_id_number = session_id.toLongLong(&ok); @@ -257,13 +268,16 @@ void DBusAPI::get_web_app_hosts_request() { * \a host_url is the remote web app adress which will be used by the session service to coordinate * sessions, connections, settings and such. */ -void DBusAPI::add_web_app_host_request(QString host_url) { +void DBusAPI::add_web_app_host_request(QString host_url, QString host_alias) { + Q_ASSERT(host_url != ""); + Q_ASSERT(host_alias != ""); + qDebug().noquote() << QString("Requesting D-Bus service to register new " - "remote web app host with url '%0'").arg(host_url); + "remote web app host '%0' with url '%1'").arg(host_alias).arg(host_url); // Make an asynchrous 'add_web_app_host' call // Response will be sent to 'add_web_app_host_reply' - QDBusPendingCall async = _dbus_rwa->asyncCall("add_web_app_host", host_url); + QDBusPendingCall async = _dbus_rwa->asyncCall("add_web_app_host", host_url, host_alias); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), @@ -276,6 +290,8 @@ void DBusAPI::add_web_app_host_request(QString host_url) { * \a host_uuid Unique identifier which all hosts have. */ void DBusAPI::remove_web_app_host_request(QString host_uuid) { + Q_ASSERT(host_uuid != ""); + qDebug().noquote() << QString("Requesting D-Bus service to list " "all remote web app hosts"); diff --git a/src/DBusAPI.h b/src/DBusAPI.h index 632a90b..a25fb64 100644 --- a/src/DBusAPI.h +++ b/src/DBusAPI.h @@ -73,7 +73,7 @@ public slots: void get_web_app_hosts_request(); // Add a specific remote web app host using a url to make sure its contactable - void add_web_app_host_request(QString host_url); + void add_web_app_host_request(QString host_url, QString host_alias); // Removes a specific remote web app host using the uuid of a host void remove_web_app_host_request(QString host_uuid); diff --git a/src/scenes/add_server_wizard/Scene_step_1.qml b/src/scenes/add_server_wizard/Scene_step_1.qml index a80e4f4..abd761d 100644 --- a/src/scenes/add_server_wizard/Scene_step_1.qml +++ b/src/scenes/add_server_wizard/Scene_step_1.qml @@ -42,11 +42,11 @@ Item { anchors.rightMargin: 15 onClicked: { - add_server_wizard.processStep1(host_url.text) + add_server_wizard.processStep1(host_url.text, host_alias.text) } } - Text { + /*Text { color: Material.foreground id: step_indicator @@ -61,7 +61,7 @@ Item { horizontalAlignment: Text.AlignHCenter anchors.left: parent.left anchors.margins: 5 - } + }*/ Text { color: Material.foreground @@ -74,12 +74,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 +160,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 +176,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_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index d06108c..09db898 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -40,15 +40,17 @@ Add_Server_wizard::Add_Server_wizard(QObject *parent, MainQMLAdaptor *main_gui) SLOT(add_web_app_host_response(QJsonDocument*))); } -void Add_Server_wizard::processStep1(QString host_url) { - qDebug() << "Processing Step 1 with args: " << host_url; +void Add_Server_wizard::processStep1(QString host_url, QString host_alias) { + qDebug() << "Processing Step 1 with args: " << host_url << host_alias; - if(host_url == "") { - emit step1Failed(tr("This field can't be empty!")); + if(host_alias == "" || host_url == "") { + QString reason = tr("Both textfields can't be empty!"); + emit step1Failed(reason); + qDebug().noquote() << reason; return; } - return add_server(host_url); + return add_server(host_url, host_alias); } void Add_Server_wizard::processStep2() { @@ -58,8 +60,8 @@ void Add_Server_wizard::processStep2() { emit step2Success(); } -void Add_Server_wizard::add_server(QString host_url) { - _dbus_api->add_web_app_host_request(host_url); +void Add_Server_wizard::add_server(QString host_url, QString host_alias) { + _dbus_api->add_web_app_host_request(host_url, host_alias); } void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { @@ -70,32 +72,7 @@ void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { // Status of request QString request_status = mainMap["status"].toString(); if (request_status == "success") { - // Building host_object - QJsonObject host_object = jObject.value(QString("host")).toObject(); - - 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("Response of D-Bus service lacks necessary host object."); - qCritical().noquote() << tr("An error occured while adding a new host:") - << reason; - emit step1Failed(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. - QScopedPointer rwa_host (new RWAHost(host_uuid, host_alias, host_url)); - _main_gui->addRWAHost(rwa_host.data()); + _dbus_api->get_web_app_hosts_request(); qInfo() << "Successfully added a new RWAHost."; emit step1Success(); diff --git a/src/scenes/add_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h index e4d62df..03af824 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.h +++ b/src/scenes/add_server_wizard/add_server_wizard.h @@ -37,8 +37,9 @@ class Add_Server_wizard : public QObject Q_OBJECT public: explicit Add_Server_wizard(QObject *parent = nullptr, - MainQMLAdaptor *main_gui = nullptr); - void add_server(QString host_url); + MainQMLAdaptor *main_gui = nullptr, + DBusAPI *dbus_api = nullptr); + void add_server(QString host_url, QString host_alias); private: DBusAPI *_dbus_api; @@ -51,7 +52,7 @@ signals: void step2Failed(QString reason); public slots: - void processStep1(QString host_url); + void processStep1(QString host_url, QString host_alias); void processStep2(); void add_web_app_host_response(QJsonDocument *doc); -- cgit v1.2.3 From 36dcf4b27450f04ac60a05cd2837c1b58fd5b24a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:55:53 +0200 Subject: Classes share one specific D-Bus object now. --- src/main.cpp | 14 +++++++++----- src/main_qmladaptor.cpp | 5 ++++- src/main_qmladaptor.h | 4 +++- src/scenes/add_server_wizard/add_server_wizard.cpp | 6 ++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a72e42b..7f86b6d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -83,16 +83,18 @@ int main(int argc, char *argv[]) { QQmlApplicationEngine engine(&app); + QScopedPointer dbus_api (new DBusAPI()); + // Make mainqmladaptor available to QML - QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine)); + QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine, dbus_api.data())); engine.rootContext()->setContextProperty("mainqmladaptor", main_gui.data()); - QScopedPointer _dbus_api (new DBusAPI()); - QObject::connect(_dbus_api.data(), + QObject::connect(dbus_api.data(), SIGNAL(serviceGetWebAppHostsResponse(QJsonDocument*)), main_gui.data(), SLOT(get_web_app_hosts_response(QJsonDocument*))); - _dbus_api.data()->get_web_app_hosts_request(); + dbus_api.data()->get_web_app_hosts_request(); + engine.load(QUrl(QStringLiteral("qrc:/src/main.qml"))); if (engine.rootObjects().isEmpty()) @@ -116,7 +118,9 @@ int main(int argc, char *argv[]) { SLOT(onRwaHostSelected(QString))); // Make add_server_wizard available to QML - QScopedPointer wizard (new Add_Server_wizard(&app, main_gui.data())); + QScopedPointer wizard (new Add_Server_wizard(&app, + main_gui.data(), + dbus_api.data())); engine.rootContext()->setContextProperty("add_server_wizard", wizard.data()); return app.exec(); diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index c1d3f14..2dec33c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -26,10 +26,13 @@ #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; _rwaHostModel = new QList; } diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index a289a74..48923d5 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -37,6 +37,7 @@ #include #include "RWAHost.h" +#include "DBusAPI.h" class MainQMLAdaptor : public QObject { @@ -59,7 +60,8 @@ class MainQMLAdaptor : public QObject Q_PROPERTY(QMessageBox::Icon _messageDialogIcon READ getMessageDialogIcon NOTIFY messageDialogIconChanged) public: - explicit MainQMLAdaptor(QObject *parent, QQmlApplicationEngine *engine = nullptr); + explicit MainQMLAdaptor(QObject *parent, QQmlApplicationEngine *engine = nullptr, + DBusAPI *dbus_api = nullptr); void setRWAHostModel(QList *rwa_hosts); diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index 09db898..a5bee47 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -27,10 +27,12 @@ #include "../../RWADBusAdaptor.h" #include "../../RWAHost.h" -Add_Server_wizard::Add_Server_wizard(QObject *parent, MainQMLAdaptor *main_gui) : QObject(parent) { +Add_Server_wizard::Add_Server_wizard(QObject *parent, + MainQMLAdaptor *main_gui, DBusAPI *dbus_api) : QObject(parent) { Q_ASSERT(main_gui != nullptr); + Q_ASSERT(dbus_api != nullptr); - _dbus_api = new DBusAPI(); + _dbus_api = dbus_api; _main_gui = main_gui; // _dbus_api --serviceAddWebAppHostResponse-> this.add_web_app_host_response() -- cgit v1.2.3 From c48210243cf5ba597ce4e77d6c19edf4384f473b Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:56:36 +0200 Subject: qDebug() -> qCritical() on startup lockfile failure. --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 7f86b6d..e02db9a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) { qDebug().noquote() << QString("Checking for a lockfile at: '%0'").arg(tmpFilePath); if(!lockFile.tryLock(100)){ - qDebug().noquote() << "You already have this app running.\n" + qCritical().noquote() << "You already have this app running.\n" << "Only one instance is allowed.\n" << "Closing application now with an error."; -- cgit v1.2.3 From 29478a265060c578290eca9e5c43b164aee33267 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:57:03 +0200 Subject: Don't start a session on every startup... --- src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index e02db9a..bb83d45 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -100,7 +100,9 @@ int main(int argc, char *argv[]) { if (engine.rootObjects().isEmpty()) return -1; - QScopedPointer session (new Session(&app, main_gui.data())); + //QScopedPointer rwa_host (new RWAHost("b9e09715-fe1d-4419-9b57-a0bd5b181ff0", "Lokaler Server", "http://localhost:8000")); + //QScopedPointer session (new Session(&app, main_gui.data(), rwa_host.data())); + //session.data()->start(); QObject::connect(main_gui.data(), SIGNAL(minimizeWindow()), -- cgit v1.2.3 From 5be60cd11d0d9dbde8ca67f0ec88e10540c490db Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:57:44 +0200 Subject: Refresh hosts every 10 seconds. --- src/main_qmladaptor.cpp | 4 ++++ src/main_qmladaptor.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 2dec33c..6684d13 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -34,6 +34,10 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine, _engine = engine; _dbus_api = dbus_api; _rwaHostModel = new QList; + + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, _dbus_api, QOverload<>::of(&DBusAPI::get_web_app_hosts_request)); + timer->start(10000); } void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 48923d5..d928acd 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -35,6 +35,7 @@ #include #include #include +#include #include "RWAHost.h" #include "DBusAPI.h" -- cgit v1.2.3 From 6072a403da8e0743dfc42d62d89a09724650ebfa Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:58:57 +0200 Subject: Add_server_wizard: Add new type-error messages --- src/main_qmladaptor.cpp | 2 +- src/scenes/add_server_wizard/add_server_wizard.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 6684d13..c321ec8 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -175,7 +175,7 @@ void MainQMLAdaptor::main_content_replace(QString scene) { bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->findChild("Scene_remote_control"); QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("enabled", enabled); diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index a5bee47..e398b19 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -92,6 +92,12 @@ void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { } else if (type == "invalid_url") { reason = tr("The specified host address is not valid!"); qCritical().noquote() << reason; + } else if (type == "permission_denied") { + reason = tr("The specified host address does not grant access!"); + qCritical().noquote() << reason; + } else if (type == "unsupported_server") { + reason = tr("The specified host address is not supported!"); + qCritical().noquote() << reason; } emit step1Failed(reason); -- cgit v1.2.3 From 98b66c89d01cf49625bf084ed0167386e9767292 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:59:20 +0200 Subject: Update locales --- locales/bin/de_DE.qm | Bin 10508 -> 11585 bytes locales/de_DE.ts | 101 ++++++++++++++++++++++++++++++++++++++++++++++----- locales/es_ES.ts | 76 ++++++++++++++++++++++++-------------- locales/main_en.ts | 76 ++++++++++++++++++++++++-------------- 4 files changed, 189 insertions(+), 64 deletions(-) diff --git a/locales/bin/de_DE.qm b/locales/bin/de_DE.qm index a4d5b5d..23c2d18 100644 Binary files a/locales/bin/de_DE.qm and b/locales/bin/de_DE.qm differ diff --git a/locales/de_DE.ts b/locales/de_DE.ts index 5d8838f..c23ff81 100644 --- a/locales/de_DE.ts +++ b/locales/de_DE.ts @@ -17,12 +17,32 @@ This field can't be empty! - Das Feld darf nicht leer sein! + Das Feld darf nicht leer sein! The feature you expected here are not yet implemented. + Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. + + + The features you expected here are not yet implemented. Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. + + An error occured while adding a new host! + + + + Both textfields can't be empty! + + + + The specified host address does not grant access! + + + + The specified host address is not supported! + + MainQMLAdaptor @@ -34,20 +54,57 @@ Start remote support session Starte Fernwartungssitzung + + A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) + + + + An error occured while adding a new host: + Ein Fehler trat auf beim Hinzufügen eines RWA-Servers: + + + Successfully added new RWAHost '%0' + Erfolgreich RWA-Server '%0' hinzugefügt + + + The error is not clear. The session service responded with status type '%0' + Der Fehler ist nicht klar. Der Sessionservice hat mit Statustype '%0' geantwortet + + + The error is not clear. The session service responded with no status type! + Der Fehler ist nicht klar. Der Sessionservice hat mit keinem Statustypen geantwortet! + QObject You already have this app running. - Diese Anwendung läuft bereits. + Diese Anwendung läuft bereits. Only one instance is allowed. - Nur eine Instanz ist erlaubt. + Nur eine Instanz ist erlaubt. Closing application now with an error. - Die Applikation wird nun mit einem Fehler beendet. + Die Applikation wird nun mit einem Fehler beendet. + + + + Scene_no_server_available + + Welcome! + Willkommen! + + + 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' + 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . + Sie müssen zuerst einen RWA-Server hinzufügen und dann auswählen, um sich mit diesem zu verbinden. Auf der linken Seite befindet sich ein Knopf mit der Aufschrift 'RWA-Server hinzufügen'. Folgen Sie den Anweisungen dort und Sie können Ihre Fernwartungssitzung rasch starten. + + + 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'. + 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . + Sie müssen zuerst einen RWA-Server hinzufügen und dann auswählen, um sich mit diesen zu verbinden. Auf der linken Seite befindet sich ein Knopf mit der Aufschrift 'RWA-Server hinzufügen'. Folgen Sie den Anweisungen dort und Sie können Ihre Fernwartungssitzung rasch starten. @@ -58,6 +115,10 @@ The feature you expected here are not yet implemented. + Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. + + + The features you expected here are not yet implemented. Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. @@ -159,7 +220,7 @@ Scene_step_1 Successfully added server address. - Erfolgreich Server hinzugefügt. + Erfolgreich Server hinzugefügt. Next Step @@ -167,7 +228,7 @@ Step 1 - Schritt 1 + Schritt 1 Please input the address for the remote web app server which you want to connect to. @@ -183,18 +244,34 @@ Bevor Sie eine Fernwartungssitzung starten können, müssen Sie zuerst für das RWA-server address - RWA-Server Adresse + RWA-Server Adresse + + + Successfully added remote web app host. + Erfolgreich Fernwartungsserver hinzugefügt. + + + RWA host address + + + + My example host + + + + RWA host alias + Scene_step_2 Step 2 - Schritt 2 + Schritt 2 Next Step - Nächster Schritt + Nächster Schritt @@ -283,7 +360,7 @@ Ist der Dienst vielleicht nicht an? Session was started successfully - Sitzung wurde erfolgreich gestartet + Sitzung wurde erfolgreich gestartet Session status could not be refreshed! @@ -305,6 +382,10 @@ Ist der Dienst vielleicht nicht an? remote support partner could still be connected! Es ist möglich, dass Ihr Partner noch verbunden ist! + + Session was started on '%0' successfully + Sitzung wurde erfolgreich auf '%0' gestartet + main diff --git a/locales/es_ES.ts b/locales/es_ES.ts index f7022de..b767dfe 100644 --- a/locales/es_ES.ts +++ b/locales/es_ES.ts @@ -16,11 +16,23 @@ - This field can't be empty! + The features you expected here are not yet implemented. - The feature you expected here are not yet implemented. + An error occured while adding a new host! + + + + Both textfields can't be empty! + + + + The specified host address does not grant access! + + + + The specified host address is not supported! @@ -34,19 +46,36 @@ Start remote support session - - - QObject - You already have this app running. + A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) - Only one instance is allowed. + An error occured while adding a new host: - Closing application now with an error. + Successfully added new RWAHost '%0' + + + + The error is not clear. The session service responded with status type '%0' + + + + The error is not clear. The session service responded with no status type! + + + + + Scene_no_server_available + + Welcome! + + + + 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'. + 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . @@ -57,7 +86,7 @@ - The feature you expected here are not yet implemented. + The features you expected here are not yet implemented. @@ -157,18 +186,10 @@ Scene_step_1 - - Successfully added server address. - - Next Step - - Step 1 - - Please input the address for the remote web app server which you want to connect to. If you don't know what this means, ask your local administrator about it please. @@ -180,18 +201,19 @@ Before you can start any remote sessions you will have to be approved for remote - RWA-server address + Successfully added remote web app host. - - - Scene_step_2 - Step 2 + RWA host address - Next Step + My example host + + + + RWA host alias @@ -241,10 +263,6 @@ Before you can start any remote sessions you will have to be approved for remote Remote Support session successfully started! - - Session was started successfully - - Session status could not be refreshed! @@ -257,6 +275,10 @@ Before you can start any remote sessions you will have to be approved for remote Session could not be stopped! + + Session was started on '%0' successfully + + main diff --git a/locales/main_en.ts b/locales/main_en.ts index a8cbc2a..0e3ac88 100644 --- a/locales/main_en.ts +++ b/locales/main_en.ts @@ -16,11 +16,23 @@ - This field can't be empty! + The features you expected here are not yet implemented. - The feature you expected here are not yet implemented. + An error occured while adding a new host! + + + + Both textfields can't be empty! + + + + The specified host address does not grant access! + + + + The specified host address is not supported! @@ -34,19 +46,36 @@ Start remote support session - - - QObject - You already have this app running. + A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) - Only one instance is allowed. + An error occured while adding a new host: - Closing application now with an error. + Successfully added new RWAHost '%0' + + + + The error is not clear. The session service responded with status type '%0' + + + + The error is not clear. The session service responded with no status type! + + + + + Scene_no_server_available + + Welcome! + + + + 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'. + 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . @@ -57,7 +86,7 @@ - The feature you expected here are not yet implemented. + The features you expected here are not yet implemented. @@ -157,18 +186,10 @@ Scene_step_1 - - Successfully added server address. - - Next Step - - Step 1 - - Please input the address for the remote web app server which you want to connect to. If you don't know what this means, ask your local administrator about it please. @@ -180,18 +201,19 @@ Before you can start any remote sessions you will have to be approved for remote - RWA-server address + Successfully added remote web app host. + + + + RWA host address - - - Scene_step_2 - Step 2 + My example host - Next Step + RWA host alias @@ -237,10 +259,6 @@ Before you can start any remote sessions you will have to be approved for remote Remote Support session successfully started! - - Session was started successfully - - Session status could not be refreshed! @@ -253,6 +271,10 @@ Before you can start any remote sessions you will have to be approved for remote Session could not be stopped! + + Session was started on '%0' successfully + + main -- cgit v1.2.3 From 6bea345ecf8a6cc451b2a7434b8294acacfbe0b4 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 16:42:51 +0200 Subject: At QDBusError: Give the user a hint that the session service is not started. --- src/DBusAPI.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index 18c5974..760935b 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -82,7 +82,12 @@ void DBusAPI::start_reply(QDBusPendingCallWatcher *call) { qCritical() << "D-Bus 'start' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceStartResponse(nullptr); + return; } else { result = reply.argumentAt<0>(); @@ -143,7 +148,13 @@ void DBusAPI::stop_reply(QDBusPendingCallWatcher *call) { qCritical() << "D-Bus 'stop' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceStopResponse(nullptr); + + return; } else { result = reply.argumentAt<0>(); } @@ -232,7 +243,12 @@ void DBusAPI::status_reply(QDBusPendingCallWatcher *call){ qCritical() << "D-Bus '(refresh_)status' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceStatusResponse(nullptr); + return; } else { result = reply.argumentAt<0>(); @@ -319,7 +335,12 @@ void DBusAPI::get_web_app_hosts_reply(QDBusPendingCallWatcher *call){ qCritical() << "D-Bus 'get_web_app_hosts' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceGetWebAppHostsResponse(nullptr); + return; } else { result = reply.argumentAt<0>(); @@ -348,7 +369,12 @@ void DBusAPI::add_web_app_host_reply(QDBusPendingCallWatcher *call){ qCritical() << "D-Bus 'add_web_app_host' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceAddWebAppHostResponse(nullptr); + return; } else { result = reply.argumentAt<0>(); @@ -377,7 +403,12 @@ void DBusAPI::remove_web_app_host_reply(QDBusPendingCallWatcher *call){ qCritical() << "D-Bus 'remove_web_app_host' request failed, this was the reply:"; qCritical() << reply.error(); + if (QDBusError::ServiceUnknown == reply.error().type()) { + qCritical() << "The session service was probably just not started!"; + } + emit serviceRemoveWebAppHostResponse(nullptr); + return; } else { result = reply.argumentAt<0>(); -- cgit v1.2.3 From b975bb69043c8857bbfb5c152e6e277beadf5853 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 16:43:20 +0200 Subject: Don't crash on failure but show an error message. --- src/main_qmladaptor.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index c321ec8..845da0a 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -81,7 +81,13 @@ QList MainQMLAdaptor::getRWAHostModel() { } void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { - Q_ASSERT(doc != nullptr); + // Don't use Q_ASSERT(doc != nullptr); instead use: + if (doc == nullptr) { + showToast(tr("Can't connect to underlying session service!"), 10000); + return; + } + // Q_ASSERT lets the program crash immediatly at startup, + // when the session service is not started. delete _rwaHostModel; setRWAHostModel(new QList); -- cgit v1.2.3 From acf033cbb15641a79a093c301efa3fd478237c2a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 16:44:35 +0200 Subject: If there are no hosts available: display it in the sidebar menu. --- src/main_qmladaptor.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 845da0a..419f794 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -151,7 +151,20 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (!atLeastOneHostAvailable) { main_content_replace("scenes/Scene_no_server_available.qml"); - //addRWAHost(new RWAHost("-","Kein Server verfügbar!","-")); + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", false); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } + } + QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); + if (server_chooser) { + server_chooser->setProperty("displayText", atLeastOneHostAvailable ? server_chooser->property("currentText") : tr("No RWA host available!")); + server_chooser->setProperty("enabled", atLeastOneHostAvailable); + } else { + qWarning() << "Unable to find 'server_chooser' Item!"; } } -- cgit v1.2.3 From 7b1fa0b22598305b8c50fda543131d2d14d1df63 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 12:48:28 +0200 Subject: Don't crash on startup if the session service isn't reachable. --- src/scenes/add_server_wizard/add_server_wizard.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index e398b19..9b67ebc 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -67,6 +67,15 @@ void Add_Server_wizard::add_server(QString host_url, QString host_alias) { } void Add_Server_wizard::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); + return; + } + // Get the QJsonObject QJsonObject jObject = doc->object(); QVariantMap mainMap = jObject.toVariantMap(); -- cgit v1.2.3 From afafc8ff96e486e9f903c643945832bee11659a1 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 12:51:27 +0200 Subject: Make RWAHost object creation silent again. --- src/RWAHost.cpp | 4 ++-- src/RWAHost.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/RWAHost.cpp b/src/RWAHost.cpp index cc25b57..f31dc60 100644 --- a/src/RWAHost.cpp +++ b/src/RWAHost.cpp @@ -30,10 +30,10 @@ RWAHost::RWAHost(QString uuid, QString alias, QString url) { assert(alias != ""); assert(url != ""); - qDebug() << "Created new RWAHost object.\n\t" + /*qDebug() << "Created new RWAHost object.\n\t" << QString("uuid: '%0'").arg(uuid) << "\n\t" << QString("alias: '%0'").arg(alias) << "\n\t" - << QString("url: '%0'").arg(url); + << QString("url: '%0'").arg(url);*/ _url = url; _alias = alias; diff --git a/src/RWAHost.h b/src/RWAHost.h index 58b6d45..cd3b1ce 100644 --- a/src/RWAHost.h +++ b/src/RWAHost.h @@ -37,6 +37,7 @@ class RWAHost : public QObject { public: RWAHost(QString uuid = "", QString alias = "", QString url = ""); + RWAHost(const RWAHost&); private: QString _uuid; -- cgit v1.2.3 From 8e0e0ee3bac6ae037df12026aa1cdd396931b739 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 12:51:56 +0200 Subject: Cosmetic code changes. --- src/main.qml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main.qml b/src/main.qml index 4494526..102df11 100644 --- a/src/main.qml +++ b/src/main.qml @@ -219,16 +219,19 @@ ApplicationWindow { width: parent.width height: 56 - y y: -6 - clip: false model: mainqmladaptor.rwaHostModel textRole: "alias" onCurrentIndexChanged: { var rwa_host = mainqmladaptor.rwaHostModel - if (rwa_host[currentIndex] !== undefined) + if (rwa_host[currentIndex] !== undefined) { sidebar_drawer.rwaHostSelected(rwa_host[currentIndex].uuid) + displayText = rwa_host[currentIndex].alias + } } + + } } @@ -241,9 +244,9 @@ ApplicationWindow { onClicked: { var scene_url = "scenes/Scene_placeholder.qml" header_text.text = qsTr("Settings") - if(inPortrait) sidebar_drawer.close() + if (inPortrait) sidebar_drawer.close() - if(scene_url.search(main_content.currentItem.objectName) >= 0) return + if (scene_url.search(main_content.currentItem.objectName) >= 0) return main_content.replace(scene_url, StackView.Transition) } @@ -262,9 +265,9 @@ ApplicationWindow { scene_url: "scenes/Scene_remote_control.qml" onListItemClick: { header_text.text = qsTr("Allow remote control") - if(inPortrait) sidebar_drawer.close() + if (inPortrait) sidebar_drawer.close() - if(scene_url.search(main_content.currentItem.objectName) >= 0) return + if (scene_url.search(main_content.currentItem.objectName) >= 0) return main_content.replace(scene_url, StackView.Transition) } @@ -276,9 +279,9 @@ ApplicationWindow { scene_url: "scenes/Scene_remote_view.qml" onListItemClick: { header_text.text = qsTr("Allow remote view") - if(inPortrait) sidebar_drawer.close() + if (inPortrait) sidebar_drawer.close() - if(scene_url.search(main_content.currentItem.objectName) >= 0) return + if (scene_url.search(main_content.currentItem.objectName) >= 0) return main_content.replace(scene_url, StackView.Transition) } @@ -290,9 +293,9 @@ ApplicationWindow { scene_url: "scenes/add_server_wizard/Scene_step_1.qml" onListItemClick: { header_text.text = qsTr("Server addition wizard") - if(inPortrait) sidebar_drawer.close() + if (inPortrait) sidebar_drawer.close() - if(scene_url.search(main_content.currentItem.objectName) >= 0) return + if (scene_url.search(main_content.currentItem.objectName) >= 0) return main_content.push(scene_url, StackView.ReplaceTransition) } } -- cgit v1.2.3 From c8dc8bda03b27a76d31c358e4b642a5687611178 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 12:54:17 +0200 Subject: MainQMLAdaptor: removeRWAHost() and setRWAHostSelected() --- src/main_qmladaptor.cpp | 60 +++++++++++++++++++++++++++---------------------- src/main_qmladaptor.h | 3 ++- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 419f794..a89d085 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -45,7 +45,7 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { RWAHost *_host = nullptr; for (int i = 0; i < getRWAHostModel().size(); i++) { - QObject *obj = getRWAHostModel().value(i); + QObject *obj = _rwaHostModel->value(i); RWAHost *host = qobject_cast(obj); Q_ASSERT(host != nullptr); @@ -57,13 +57,7 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); - // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); - if (sidebar_drawer) { - sidebar_drawer->setProperty("rwaHostIsSelected", true); - } else { - qWarning() << "Unable to find 'sidebar_drawer' Item!"; - } + setRWAHostSelected(true); } void MainQMLAdaptor::setRWAHostModel(QList *rwa_hosts) { @@ -76,21 +70,45 @@ void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { emit rwaHostModelChanged(*_rwaHostModel); } +void MainQMLAdaptor::removeRWAHost(RWAHost *rwa_host) { + _rwaHostModel->removeOne(rwa_host); + emit rwaHostModelChanged(*_rwaHostModel); +} + QList MainQMLAdaptor::getRWAHostModel() { return *_rwaHostModel; } +void MainQMLAdaptor::setRWAHostSelected(bool value) { + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", value); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } + + QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("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!"; + } +} + 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) { - showToast(tr("Can't connect to underlying session service!"), 10000); + setRWAHostSelected(false); + + showToast(tr("Can't connect to underlying session service!"), 9800); return; } - // Q_ASSERT lets the program crash immediatly at startup, - // when the session service is not started. - delete _rwaHostModel; - setRWAHostModel(new QList); + bool atLeastOneHostAvailable = false; // Get the QJsonObject @@ -151,21 +169,9 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (!atLeastOneHostAvailable) { main_content_replace("scenes/Scene_no_server_available.qml"); - // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); - if (sidebar_drawer) { - sidebar_drawer->setProperty("rwaHostIsSelected", false); - } else { - qWarning() << "Unable to find 'sidebar_drawer' Item!"; - } - } - QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); - if (server_chooser) { - server_chooser->setProperty("displayText", atLeastOneHostAvailable ? server_chooser->property("currentText") : tr("No RWA host available!")); - server_chooser->setProperty("enabled", atLeastOneHostAvailable); - } else { - qWarning() << "Unable to find 'server_chooser' Item!"; } + + setRWAHostSelected(atLeastOneHostAvailable); } void MainQMLAdaptor::main_content_push(QString scene) { diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index d928acd..d7f1783 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -26,7 +26,6 @@ #pragma once -#include #include #include #include @@ -128,6 +127,8 @@ public slots: void setURL(QString URL); void setSessionID(QString session_id); void addRWAHost(RWAHost *rwa_host); + void removeRWAHost(RWAHost *rwa_host); + void setRWAHostSelected(bool value); QString getURL(); QString getPin(); QString getSessionID(); -- cgit v1.2.3 From 18c2b837d33c040a21f84c444d8c554769f1dc58 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 13:02:24 +0200 Subject: Don't just reset the _rwaHostModel everytime but add and remove specific items. TODO: Use QSet subtraction feature instead of manual for loops!!! --- src/main_qmladaptor.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index a89d085..6d3a60c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -121,6 +121,7 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { // Building host_objects QJsonArray host_objects = jObject.value("hosts").toArray(); + QList *all_rwa_hosts = new QList; foreach (const QJsonValue &host_object, host_objects) { QString host_uuid = host_object["uuid"].toString(); QString host_alias = host_object["alias"].toString(); @@ -142,12 +143,46 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { host_alias = host_url; } + // Now built RWAHost object. RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url); - addRWAHost(rwa_host); + all_rwa_hosts->append(rwa_host); + + bool found = false; + for (int i = 0; i < this->_rwaHostModel->size(); i++) { + RWAHost* old_host = qobject_cast(_rwaHostModel->value(i)); + Q_ASSERT(old_host != nullptr); + + if (rwa_host->uuid() == old_host->uuid()) { + found = true; + break; + } + } + atLeastOneHostAvailable = true; - qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + 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(_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 { QString reason = tr("An error occured while adding a new host:"); @@ -176,16 +211,40 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { 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("main_content"); Q_ASSERT(main_content != nullptr); - QMetaObject::invokeMethod(main_content, "push", Q_ARG(QString, scene)); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(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("main_content"); Q_ASSERT(main_content != nullptr); - QMetaObject::invokeMethod(main_content, "pop", Q_ARG(QString, scene)); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(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) { @@ -193,9 +252,19 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QVariant arg = QVariant::fromValue(scene); - if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) - qDebug() << "Failed to invoke push"; + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(to_cast); + if (obj) { + QString scene_add_server_wizard = "Scene_step_1"; + if (!(scene.contains(obj->objectName()) || scene_add_server_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::setConnectButtonEnabled(bool enabled) { -- cgit v1.2.3 From efa44c931674e498c39fc59091cf1f8654ac97a5 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 01:58:32 +0200 Subject: Fix typos, too long lines, various styling stuff --- src/DBusAPI.cpp | 18 +++++++++--------- src/DBusAPI.h | 3 +-- src/Toast.qml | 13 ++++++++----- src/main.cpp | 19 +++++++++---------- src/main.qml | 17 +++++++++++------ src/main_qmladaptor.cpp | 20 +++++++++++++------- src/scenes/Scene_no_server_available.qml | 3 ++- src/scenes/Scene_placeholder.qml | 3 ++- src/scenes/Scene_remote_view.qml | 5 +++++ src/scenes/Scene_settings.qml | 5 +++++ src/scenes/add_server_wizard/Scene_step_1.qml | 15 ++++++++++----- 11 files changed, 75 insertions(+), 46 deletions(-) diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index 760935b..83f38cb 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -60,7 +60,7 @@ void DBusAPI::start_request(RWAHost *host) { qDebug() << "Requesting D-Bus service to start a new session on host:" << host->alias(); - // Make an asynchrous 'start' call (Response will be sent to 'start_reply') + // Make an asynchronous 'start' call (Response will be sent to 'start_reply') QDBusPendingCall async = _dbus_rwa->asyncCall("start", host->uuid()); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -125,7 +125,7 @@ void DBusAPI::stop_request(RWAHost *host, QString session_id) { .arg(session_id) .arg(host->alias()); - // Make an asynchrous 'start' call (Response will be sent to 'stop_reply') + // Make an asynchronous 'stop' call (Response will be sent to 'stop_reply') QDBusPendingCall async = _dbus_rwa->asyncCall("stop", host->uuid(), session_id_number); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -182,14 +182,14 @@ void DBusAPI::status_request(RWAHost *host, QString session_id) { // Sanity Check if(ok == false){ - qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + qWarning().noquote() << QString("Unable to parse session_id '%0' as long long!").arg(session_id); return; } qDebug().noquote() << QString("Requesting D-Bus service for status of session " "#'%0' on host '%1'").arg(session_id).arg(host->alias()); - // Make an asynchrous 'start' call (Response will be sent to 'status_reply') + // Make an asynchronous 'start' call (Response will be sent to 'status_reply') QDBusPendingCall async = _dbus_rwa->asyncCall("status", host->uuid(), session_id_number); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -213,14 +213,14 @@ void DBusAPI::refresh_status_request(RWAHost *host, QString session_id) { // Sanity Check if(ok == false){ - qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + qWarning().noquote() << QString("Unable to parse session_id '%0' as long long!").arg(session_id); return; } qDebug().noquote() << QString("Requesting D-Bus service for refresh_status of session " "#'%0' on host '%1'").arg(session_id).arg(host->alias()); - // Make an asynchrous 'start' call (Response will be sent to 'status_reply') + // Make an asynchronous 'start' call (Response will be sent to 'status_reply') QDBusPendingCall async = _dbus_rwa->asyncCall("refresh_status", host->uuid(), session_id_number); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -269,7 +269,7 @@ void DBusAPI::get_web_app_hosts_request() { qDebug().noquote() << QString("Requesting D-Bus service to list " "all remote web app hosts"); - // Make an asynchrous 'get_web_app_hosts' call + // Make an asynchronous 'get_web_app_hosts' call // Response will be sent to 'get_web_app_hosts_reply' QDBusPendingCall async = _dbus_rwa->asyncCall("get_web_app_hosts"); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -291,7 +291,7 @@ void DBusAPI::add_web_app_host_request(QString host_url, QString host_alias) { qDebug().noquote() << QString("Requesting D-Bus service to register new " "remote web app host '%0' with url '%1'").arg(host_alias).arg(host_url); - // Make an asynchrous 'add_web_app_host' call + // Make an asynchronous 'add_web_app_host' call // Response will be sent to 'add_web_app_host_reply' QDBusPendingCall async = _dbus_rwa->asyncCall("add_web_app_host", host_url, host_alias); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); @@ -311,7 +311,7 @@ void DBusAPI::remove_web_app_host_request(QString host_uuid) { qDebug().noquote() << QString("Requesting D-Bus service to list " "all remote web app hosts"); - // Make an asynchrous 'remove_web_app_host' call + // Make an asynchronous 'remove_web_app_host' call // Response will be sent to 'remove_web_app_host_reply' QDBusPendingCall async = _dbus_rwa->asyncCall("remove_web_app_host", host_uuid); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); diff --git a/src/DBusAPI.h b/src/DBusAPI.h index a25fb64..63dbe68 100644 --- a/src/DBusAPI.h +++ b/src/DBusAPI.h @@ -32,8 +32,7 @@ #include "RWAHost.h" #include "RWADBusAdaptor.h" -class DBusAPI : public QObject -{ +class DBusAPI : public QObject { Q_OBJECT public: explicit DBusAPI(); diff --git a/src/Toast.qml b/src/Toast.qml index 60e238c..0de53a9 100644 --- a/src/Toast.qml +++ b/src/Toast.qml @@ -36,7 +36,8 @@ import QtQuick.Controls.Material 2.3 */ /** - * @brief An Android-like timed message text in a box that self-destroys when finished if desired + * @brief An Android-like timed message text in + * a box that self-destroys when finished if desired */ Control { @@ -52,16 +53,18 @@ Control { */ function show(text, duration) { message.text = text; - if (typeof duration !== "undefined") { // checks if parameter was passed + + // checks if parameter was passed + if (typeof duration !== "undefined") { time = Math.max(duration, 2 * fadeTime); - } - else { + } else { time = defaultTime; } animation.start(); } - property bool selfDestroying: false // whether this Toast will self-destroy when it is finished + // whether this Toast will self-destroy when it is finished + property bool selfDestroying: false /** * Private diff --git a/src/main.cpp b/src/main.cpp index bb83d45..7139883 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,13 +40,12 @@ #include "RWADBusAdaptor.cpp" #include "session.h" #include "scenes/add_server_wizard/add_server_wizard.h" +#include "scenes/remote_control/remote_control_manager.h" #include "RWAHostModel.h" #include "RWAHost.h" -#define BUILD_TIME __DATE__ " " __TIME__ - int main(int argc, char *argv[]) { - qDebug() << "This app was built on: " << BUILD_TIME; + qDebug() << "This app was built on: " << __DATE__ << __TIME__; // We don't want users to have multiple instances of this app running QString tmpDirPath = QDir::tempPath() + "/rwa.support.desktopapp"; @@ -85,8 +84,11 @@ int main(int argc, char *argv[]) { QScopedPointer dbus_api (new DBusAPI()); - // Make mainqmladaptor available to QML - QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine, dbus_api.data())); + // Make 'mainqmladaptor' available to QML + QScopedPointer main_gui ( + new MainQMLAdaptor(&app, &engine, dbus_api.data()) + ); + engine.rootContext()->setContextProperty("mainqmladaptor", main_gui.data()); QObject::connect(dbus_api.data(), @@ -100,10 +102,6 @@ int main(int argc, char *argv[]) { if (engine.rootObjects().isEmpty()) return -1; - //QScopedPointer rwa_host (new RWAHost("b9e09715-fe1d-4419-9b57-a0bd5b181ff0", "Lokaler Server", "http://localhost:8000")); - //QScopedPointer session (new Session(&app, main_gui.data(), rwa_host.data())); - //session.data()->start(); - QObject::connect(main_gui.data(), SIGNAL(minimizeWindow()), engine.rootObjects().takeFirst(), @@ -114,7 +112,8 @@ int main(int argc, char *argv[]) { engine.rootObjects().takeFirst(), SLOT(showWindow())); - QObject::connect(engine.rootObjects().takeFirst()->findChild("sidebar_drawer"), + QObject::connect(engine.rootObjects().takeFirst()-> + findChild("sidebar_drawer"), SIGNAL(rwaHostSelected(QString)), main_gui.data(), SLOT(onRwaHostSelected(QString))); diff --git a/src/main.qml b/src/main.qml index 102df11..03f9c5f 100644 --- a/src/main.qml +++ b/src/main.qml @@ -114,7 +114,7 @@ ApplicationWindow { Connections { target: mainqmladaptor - onShowMessageDialogChanged: { + function onShowMessageDialogChanged(show) { message_dialog.visible = show } } @@ -153,21 +153,21 @@ ApplicationWindow { Connections { target: mainqmladaptor - onMessageDialogTextChanged: { + function onMessageDialogTextChanged(text) { message_dialog.text = text } } Connections { target: mainqmladaptor - onMessageDialogTitleChanged: { + function onMessageDialogTitleChanged(title) { message_dialog.title = title } } Connections { target: mainqmladaptor - onMessageDialogIconChanged: { + function onMessageDialogIconChanged(iconindex) { message_dialog.icon = iconindex } } @@ -185,7 +185,9 @@ ApplicationWindow { objectName: "sidebar_drawer" y: top_menu_bar_frame.height - width: !inPortrait ? Math.min(300, Math.max(200, window.width * 0.333)) : (window.width * 0.5) + width: !inPortrait ? + Math.min(300, Math.max(200, window.width * 0.333)) : + (window.width * 0.5) height: window.height - top_menu_bar_frame.height modal: inPortrait @@ -286,7 +288,10 @@ ApplicationWindow { } // Disabled till a RWAHost object is selected. - enabled: sidebar_drawer.rwaHostIsSelected + //enabled: sidebar_drawer.rwaHostIsSelected + + // But remote view is not implemented yet + enabled: false } ListItem { text: " " + qsTr("Add RWA-Server") diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 6d3a60c..7e85157 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -129,8 +129,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { 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)"); + 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; @@ -162,7 +162,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { atLeastOneHostAvailable = true; if (!found) { - qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")) + .arg(rwa_host->alias()); addRWAHost(rwa_host); } } @@ -233,7 +234,8 @@ void MainQMLAdaptor::main_content_pop(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + QObject *main_content = _engine->rootObjects().takeFirst()-> + findChild("main_content"); Q_ASSERT(main_content != nullptr); QVariant to_cast = main_content->property("currentItem"); @@ -252,17 +254,21 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + QObject *main_content = _engine->rootObjects().takeFirst()-> + findChild("main_content"); Q_ASSERT(main_content != nullptr); QVariant to_cast = main_content->property("currentItem"); QObject *obj = qvariant_cast(to_cast); if (obj) { QString scene_add_server_wizard = "Scene_step_1"; - if (!(scene.contains(obj->objectName()) || scene_add_server_wizard.contains(obj->objectName()))) { + if (!(scene.contains(obj->objectName()) || + scene_add_server_wizard.contains(obj->objectName()))) { QVariant arg = QVariant::fromValue(scene); - if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) + if (!QMetaObject::invokeMethod(window, "main_content_replace", + Q_ARG(QVariant, arg))) { qDebug() << "Failed to invoke replace"; + } } } } diff --git a/src/scenes/Scene_no_server_available.qml b/src/scenes/Scene_no_server_available.qml index 112c6e0..7b99b55 100644 --- a/src/scenes/Scene_no_server_available.qml +++ b/src/scenes/Scene_no_server_available.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 { diff --git a/src/scenes/Scene_placeholder.qml b/src/scenes/Scene_placeholder.qml index 29e15a9..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 { 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_server_wizard/Scene_step_1.qml index abd761d..e57f8a4 100644 --- a/src/scenes/add_server_wizard/Scene_step_1.qml +++ b/src/scenes/add_server_wizard/Scene_step_1.qml @@ -5,7 +5,8 @@ import QtQuick.Controls 2.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 { @@ -14,17 +15,21 @@ Item { Connections { target: add_server_wizard - onStep1Success: { + function onStep1Success() { // Go onto the first page of the stack. main_content_pop(null) - mainqmladaptor.showToast(qsTr("Successfully added remote web app host."), 5000); + mainqmladaptor.showToast(qsTr("Successfully added remote web app host."), + 5000, + ToastType.ToastSuccess); } } Connections { target: add_server_wizard - onStep1Failed: { - mainqmladaptor.showToast(reason, 3000); + function onStep1Failed(reason, toast_type) { + mainqmladaptor.showToast(reason, + 5000, + toast_type) } } -- cgit v1.2.3 From 0a48722a1ddeccfc89f1812c44b7582358671697 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:01:35 +0200 Subject: Introducing remote_control_manager.(h, cpp) The remote_control_manager class takes care of the GUI and the creation, deletion and maintaining of session objects. --- qml.qrc | 20 +- rwa-support-desktopapp.pro | 13 +- src/main.cpp | 22 +- src/scenes/remote_control/Scene_remote_control.qml | 382 +++++++++++++++ .../remote_control/remote_control_manager.cpp | 511 +++++++++++++++++++++ src/scenes/remote_control/remote_control_manager.h | 78 ++++ 6 files changed, 1009 insertions(+), 17 deletions(-) create mode 100644 src/scenes/remote_control/Scene_remote_control.qml create mode 100644 src/scenes/remote_control/remote_control_manager.cpp create mode 100644 src/scenes/remote_control/remote_control_manager.h diff --git a/qml.qrc b/qml.qrc index b472fe7..35e9142 100644 --- a/qml.qrc +++ b/qml.qrc @@ -1,13 +1,17 @@ + qtquickcontrols2.conf images/into-clipboard.svg - locales/bin/de_DE.qm - locales/bin/main_en.qm locales/de_DE.ts + locales/de_DE.qm locales/main_en.ts - locales/bin/es_ES.qm + locales/main_en.qm locales/es_ES.ts + locales/es_ES.qm src/main.qml + src/ListItem.qml + src/ToastManager.qml + src/Toast.qml src/main.cpp src/main_qmladaptor.cpp src/main_qmladaptor.h @@ -21,17 +25,15 @@ src/RWAHostModel.cpp src/DBusAPI.h src/DBusAPI.cpp - src/ListItem.qml - src/ToastManager.qml - src/Toast.qml - qtquickcontrols2.conf - src/scenes/Scene_remote_control.qml src/scenes/Scene_remote_view.qml src/scenes/Scene_settings.qml src/scenes/Scene_placeholder.qml src/scenes/Scene_no_server_available.qml - src/scenes/add_server_wizard/Scene_step_1.qml src/scenes/add_server_wizard/add_server_wizard.cpp src/scenes/add_server_wizard/add_server_wizard.h + src/scenes/add_server_wizard/Scene_step_1.qml + src/scenes/remote_control/remote_control_manager.cpp + src/scenes/remote_control/remote_control_manager.h + src/scenes/remote_control/Scene_remote_control.qml diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index a15c4bd..be6011e 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -47,19 +47,26 @@ SOURCES += src/main.cpp \ src/main_qmladaptor.cpp \ src/RWADBusAdaptor.cpp \ src/session.cpp \ - src/scenes/add_server_wizard/add_server_wizard.cpp \ src/RWAHostModel.cpp \ src/RWAHost.cpp \ src/DBusAPI.cpp \ + src/scenes/remote_control/remote_control_manager.cpp \ + src/scenes/add_server_wizard/add_server_wizard.cpp HEADERS += src/RWADBusAdaptor.h \ src/main_qmladaptor.h \ src/RWADBusAdaptor.h \ + src/scenes/remote_control/remote_control_manager.h \ src/session.h \ - src/scenes/add_server_wizard/add_server_wizard.h \ src/RWAHostModel.h \ src/RWAHost.h \ - src/DBusAPI.h + src/DBusAPI.h \ + src/scenes/remote_control/remote_control_manager.h \ + src/scenes/add_server_wizard/add_server_wizard.h + +TRANSLATIONS += locales/main_en.ts \ + locales/de_DE.ts \ + locales/es_ES.ts RESOURCES += qml.qrc diff --git a/src/main.cpp b/src/main.cpp index 7139883..9436a2b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -118,11 +118,23 @@ int main(int argc, char *argv[]) { main_gui.data(), SLOT(onRwaHostSelected(QString))); - // Make add_server_wizard available to QML - QScopedPointer wizard (new Add_Server_wizard(&app, - main_gui.data(), - dbus_api.data())); - engine.rootContext()->setContextProperty("add_server_wizard", wizard.data()); + // Make 'add_server_wizard' available to QML + QScopedPointer wizard ( + new Add_Server_wizard(&app, + main_gui.data(), + dbus_api.data()) + ); + engine.rootContext()-> + setContextProperty("add_server_wizard", wizard.data()); + + // Make 'remote_control_manager' available to QML + QScopedPointer remote_mngr ( + new RemoteControlManager(&engine, + main_gui.data(), + dbus_api.data()) + ); + engine.rootContext()-> + setContextProperty("remote_control_manager", remote_mngr.data()); return app.exec(); } diff --git a/src/scenes/remote_control/Scene_remote_control.qml b/src/scenes/remote_control/Scene_remote_control.qml new file mode 100644 index 0000000..dc152ef --- /dev/null +++ b/src/scenes/remote_control/Scene_remote_control.qml @@ -0,0 +1,382 @@ +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_remote_control + objectName: "Scene_remote_control" + + Label { + id: dbus_api_status_text + 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.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: 20 + objectName: "dbus_api_status_indicator" + color: "#73d216" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.left + anchors.rightMargin: 5 + active: false + } + } + + 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.") + wrapMode: Text.WordWrap + font.pixelSize: 18 + anchors.topMargin: 10 + anchors.leftMargin: 10 + anchors.rightMargin: 10 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + horizontalAlignment: Text.AlignLeft + + color: Material.theme == Material.Light ? "#000000" : "#FFFFFF" + } + + Rectangle { + id: dbus_api_status_line + height: 1 + radius: 1 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.bottom: dbus_api_status_text.top + anchors.bottomMargin: 10 + opacity: 0.3 + gradient: Gradient { + GradientStop { + position: 0.391 + color: "#ffffff" + } + + GradientStop { + position: 0.975 + color: "#8b8b8b" + } + } + border.width: 1 + border.color: "#00000000" + anchors.left: parent.left + anchors.leftMargin: 10 + } + + Column { + id: column + spacing: 6 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.bottom: dbus_api_status_line.top + anchors.bottomMargin: 10 + anchors.top: explain_function_label.bottom + anchors.topMargin: 10 + + Column { + id: url_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_url_text + height: parent.height/2 + text: qsTr("Remote Support Address") + font.weight: Font.Bold + font.bold: true + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + font.pointSize: 14 + fontSizeMode: Text.Fit + } + + TextEdit { + id: url_text + height: parent.height/2 + text: remote_control_manager.url + anchors.rightMargin: 10 + copy_url_to_clipboard_button.width + anchors.right: parent.right + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + anchors.leftMargin: 10 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.pointSize: 15 + + readOnly: true + color: Material.foreground + selectByMouse: true + anchors.left: parent.left + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + Button { + id: copy_url_to_clipboard_button + width: copy_url_to_clipboard_image.width + 6 + height: copy_url_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + display: AbstractButton.IconOnly + anchors.leftMargin: 5 + anchors.left: url_text.right + highlighted: false + flat: true + + Image { + id: copy_url_to_clipboard_image + x: 0 + y: -26 + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + source: "../../../images/into-clipboard.svg" + opacity: 0.65 + } + + onClicked: { + 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: 600 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: session_id_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_session_id_text + height: parent.height/2 + text: qsTr("Session-ID") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + fontSizeMode: Text.Fit + } + + TextEdit { + objectName: "session_id_text" + id: session_id_text + height: parent.height/2 + text: remote_control_manager.session_id + font.letterSpacing: 10 + anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: session_id_text.height + // whole line + copy-into-clipboard button + some margin + width: session_id_text.width + copy_session_id_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_session_id_to_clipboard_button + width: copy_session_id_to_clipboard_image.width + 6 + height: copy_session_id_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: session_id_text.right + anchors.leftMargin: 5 + + Image { + id: copy_session_id_to_clipboard_image + anchors.horizontalCenter: parent.horizontalCenter + opacity: 0.65 + anchors.verticalCenter: parent.verticalCenter + source: "../../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + 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: 600 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: pin_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_pin_text + height: parent.height/2 + text: qsTr("Access-PIN") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + } + + TextEdit { + objectName: "pin_text" + id: pin_text + height: parent.height/2 + text: remote_control_manager.pin + anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + font.letterSpacing: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_pin_to_clipboard_button + width: copy_pin_to_clipboard_image.width + 6 + height: copy_pin_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: pin_text.right + anchors.leftMargin: 5 + + Image { + id: copy_pin_to_clipboard_image + anchors.verticalCenter: parent.verticalCenter + opacity: 0.65 + anchors.horizontalCenter: parent.horizontalCenter + source: "../../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + 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: 600 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + } + + Button { + id: start_support_button + height: Math.min(50) + objectName: "start_support_button" + 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: remote_control_manager.handleConnectButtonClick(checked); + } +} + +/*##^## +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; + _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("Scene_remote_control"); + QQuickItem *item = scene_remote_control-> + findChild("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("Scene_remote_control"); + QQuickItem *item = scene_remote_control-> + findChild("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("Scene_remote_control"); + QQuickItem *item = scene_remote_control-> + findChild("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("Scene_remote_control"); + QQuickItem *item = scene_remote_control-> + findChild("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..6f2fbdb --- /dev/null +++ b/src/scenes/remote_control/remote_control_manager.h @@ -0,0 +1,78 @@ +#ifndef REMOTECONTROLMANAGER_H +#define REMOTECONTROLMANAGER_H + +#include + +#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 *_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 -- cgit v1.2.3 From d75db83442a01dcd003ea39a5ec61baad7d344a0 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:06:58 +0200 Subject: Change translation system to work more out of the box. using ./update-locales.sh now removes any old/obsolete translations. --- locales/bin/de_DE.qm | Bin 11585 -> 0 bytes locales/bin/es_ES.qm | Bin 417 -> 0 bytes locales/bin/main_en.qm | Bin 310 -> 0 bytes rwa-support-desktopapp.pro | 3 ++- src/main.cpp | 5 +++-- update_locales.sh | 5 ++--- 6 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 locales/bin/de_DE.qm delete mode 100644 locales/bin/es_ES.qm delete mode 100644 locales/bin/main_en.qm diff --git a/locales/bin/de_DE.qm b/locales/bin/de_DE.qm deleted file mode 100644 index 23c2d18..0000000 Binary files a/locales/bin/de_DE.qm and /dev/null differ diff --git a/locales/bin/es_ES.qm b/locales/bin/es_ES.qm deleted file mode 100644 index 0bed16b..0000000 Binary files a/locales/bin/es_ES.qm and /dev/null differ diff --git a/locales/bin/main_en.qm b/locales/bin/main_en.qm deleted file mode 100644 index 8a9ba24..0000000 Binary files a/locales/bin/main_en.qm and /dev/null differ diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index be6011e..f9a05bf 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -41,7 +41,8 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 +# disables all the APIs deprecated before Qt 6.0.0 SOURCES += src/main.cpp \ src/main_qmladaptor.cpp \ diff --git a/src/main.cpp b/src/main.cpp index 9436a2b..ff5d2a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -72,8 +72,9 @@ int main(int argc, char *argv[]) { QQuickStyle::setStyle("Material"); QTranslator translator; - qDebug().noquote() << QString("Locales: Loading locale: qrc:/locales/bin/%0").arg(QLocale::system().name()); - if(translator.load(":/locales/bin/" + QLocale::system().name())) { + qDebug().noquote() << QString("Locales: Loading locale: qrc:/locales/%0") + .arg(QLocale::system().name()); + if(translator.load(":/locales/" + QLocale::system().name())) { app.installTranslator(&translator); qDebug().noquote() << "Locales: Loaded: " + QLocale::system().name() + " locale!"; } else { diff --git a/update_locales.sh b/update_locales.sh index 4884cb6..8c05ece 100755 --- a/update_locales.sh +++ b/update_locales.sh @@ -24,7 +24,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -lupdate . -ts locales/*.ts +lupdate rwa-support-desktopapp.pro -no-obsolete linguist locales/*.ts -lrelease locales/de_DE.ts -qm locales/bin/de_DE.qm -lrelease locales/es_ES.ts -qm locales/bin/es_ES.qm +lrelease rwa-support-desktopapp.pro -compress -removeidentical -- cgit v1.2.3 From 766a90125df68f065495354c20412faf9e1df77a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:19:15 +0200 Subject: move scenes/Scene_remote_control.qml into scenes/remote_control/Scene_remote_control.qml --- src/DBusAPI.cpp | 2 +- src/main.qml | 2 +- src/main_qmladaptor.cpp | 57 +----- src/main_qmladaptor.h | 7 +- src/scenes/Scene_remote_control.qml | 368 ------------------------------------ src/session.cpp | 34 +++- 6 files changed, 34 insertions(+), 436 deletions(-) delete mode 100644 src/scenes/Scene_remote_control.qml diff --git a/src/DBusAPI.cpp b/src/DBusAPI.cpp index 83f38cb..9a0f8de 100644 --- a/src/DBusAPI.cpp +++ b/src/DBusAPI.cpp @@ -116,7 +116,7 @@ void DBusAPI::stop_request(RWAHost *host, QString session_id) { // Sanity Check if(ok == false){ - qWarning() << QString("Unable to parse '%0' as long long!").arg(session_id); + qWarning().noquote() << QString("Unable to parse session_id '%0' as long long!").arg(session_id); return; } diff --git a/src/main.qml b/src/main.qml index 03f9c5f..4782f4b 100644 --- a/src/main.qml +++ b/src/main.qml @@ -264,7 +264,7 @@ ApplicationWindow { ListItem { text: " " + qsTr("Remote Control") - scene_url: "scenes/Scene_remote_control.qml" + scene_url: "scenes/remote_control/Scene_remote_control.qml" onListItemClick: { header_text.text = qsTr("Allow remote control") if (inPortrait) sidebar_drawer.close() diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 7e85157..5da0abb 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -81,16 +81,20 @@ QList MainQMLAdaptor::getRWAHostModel() { void MainQMLAdaptor::setRWAHostSelected(bool value) { // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()-> + findChild("sidebar_drawer"); if (sidebar_drawer) { sidebar_drawer->setProperty("rwaHostIsSelected", value); } else { qWarning() << "Unable to find 'sidebar_drawer' Item!"; } - QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); + QObject *server_chooser = _engine->rootObjects().takeFirst()-> + findChild("server_chooser"); if (server_chooser) { - server_chooser->setProperty("displayText", value ? server_chooser->property("currentText") : tr("No RWA host available!")); + 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!"; @@ -273,53 +277,6 @@ void MainQMLAdaptor::main_content_replace(QString scene) { } } -bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("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 MainQMLAdaptor::setConnectButtonChecked(bool checked) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("start_support_button"); - if (item) { - item->setProperty("checked", checked); - } else { - qWarning() << "Unable to find 'start_support_button' Item!"; - return false; - } - - return true; -} - -bool MainQMLAdaptor::setStatus(QString status) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("dbus_api_status_text"); - if (item) { - item->setProperty("text", status); - } else { - qWarning() << "Unable to find 'dbus_api_status_text' Item!"; - return false; - } - - return true; -} - bool MainQMLAdaptor::openMessageDialog(QString title, QString text, QMessageBox::Icon icon) { _messageDialogText = text; _messageDialogTitle = title; diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index d7f1783..9a2f7c3 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -59,22 +59,17 @@ class MainQMLAdaptor : public QObject // this makes showMessageDialogIcon available as a QML property Q_PROPERTY(QMessageBox::Icon _messageDialogIcon READ getMessageDialogIcon NOTIFY messageDialogIconChanged) + public: explicit MainQMLAdaptor(QObject *parent, QQmlApplicationEngine *engine = nullptr, DBusAPI *dbus_api = nullptr); void setRWAHostModel(QList *rwa_hosts); - bool setConnectButtonEnabled(bool enabled); - bool setConnectButtonChecked(bool checked); - void main_content_push(QString); void main_content_pop(QString); void main_content_replace(QString); - bool setStatusIndicator(bool active, QColor color = QColor(255,255,255)); - bool setStatus(QString status); - bool openMessageDialog(QString title, QString text, QMessageBox::Icon); QString getMessageDialogTitle(); QString getMessageDialogText(); diff --git a/src/scenes/Scene_remote_control.qml b/src/scenes/Scene_remote_control.qml deleted file mode 100644 index ea59ea7..0000000 --- a/src/scenes/Scene_remote_control.qml +++ /dev/null @@ -1,368 +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 - -Item { - id: scene_remote_control - objectName: "Scene_remote_control" - - Label { - id: dbus_api_status_text - text: "Unknown state of Service" - anchors.leftMargin: 10 + 5 + dbus_api_status_indicator.width - anchors.bottom: parent.bottom - anchors.bottomMargin: 10 - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - verticalAlignment: Text.AlignVCenter - font.pointSize: 11 - fontSizeMode: Text.Fit - objectName: "dbus_api_status_text" - anchors.left: parent.left - - StatusIndicator { - id: dbus_api_status_indicator - width: height - height: parent.height - objectName: "dbus_api_status_indicator" - color: "#73d216" - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.left - anchors.rightMargin: 5 - active: false - } - } - - 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 - wrapMode: Text.WordWrap - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.top: parent.top - anchors.topMargin: 10 - 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 - anchors.rightMargin: 10 - anchors.bottom: dbus_api_status_text.top - anchors.bottomMargin: 10 - opacity: 0.3 - gradient: Gradient { - GradientStop { - position: 0.391 - color: "#ffffff" - } - - GradientStop { - position: 0.975 - color: "#8b8b8b" - } - } - border.width: 1 - border.color: "#00000000" - anchors.left: parent.left - anchors.leftMargin: 10 - } - - Column { - id: column - spacing: 6 - anchors.right: parent.right - anchors.rightMargin: 10 - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.bottom: dbus_api_status_line.top - anchors.bottomMargin: 10 - anchors.top: explain_function_label.bottom - anchors.topMargin: 10 - - Column { - id: url_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_url_text - height: parent.height/2 - text: qsTr("Remote Support Address") - font.weight: Font.Bold - font.bold: true - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - font.pointSize: 14 - fontSizeMode: Text.Fit - } - - TextEdit { - id: url_text - height: parent.height/2 - text: mainqmladaptor.url - anchors.rightMargin: 10 + copy_url_to_clipboard_button.width - anchors.right: parent.right - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - anchors.leftMargin: 10 - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignLeft - font.pointSize: 15 - - readOnly: true - color: Material.foreground - selectByMouse: true - anchors.left: parent.left - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - Button { - id: copy_url_to_clipboard_button - width: copy_url_to_clipboard_image.width + 6 - height: copy_url_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - display: AbstractButton.IconOnly - anchors.leftMargin: 5 - anchors.left: url_text.right - highlighted: false - flat: true - - Image { - id: copy_url_to_clipboard_image - x: 0 - y: -26 - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - source: "../../images/into-clipboard.svg" - opacity: 0.65 - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(url_text.text); - toast.show(qsTr("Copied access address into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the access address into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - Column { - id: session_id_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_session_id_text - height: parent.height/2 - text: qsTr("Session-ID") - font.weight: Font.Bold - font.bold: true - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - font.pointSize: 14 - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - fontSizeMode: Text.Fit - } - - TextEdit { - objectName: "session_id_text" - id: session_id_text - height: parent.height/2 - text: mainqmladaptor.session_id - font.letterSpacing: 10 - anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width - anchors.right: parent.right - font.pointSize: 15 - anchors.left: parent.left - anchors.leftMargin: 10 - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - readOnly: true - color: Material.foreground - wrapMode: Text.WordWrap - selectByMouse: true - - Button { - id: copy_session_id_to_clipboard_button - width: copy_session_id_to_clipboard_image.width + 6 - height: copy_session_id_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - flat: true - display: AbstractButton.IconOnly - anchors.left: session_id_text.right - anchors.leftMargin: 5 - - Image { - id: copy_session_id_to_clipboard_image - anchors.horizontalCenter: parent.horizontalCenter - opacity: 0.65 - anchors.verticalCenter: parent.verticalCenter - source: "../../images/into-clipboard.svg" - fillMode: Image.PreserveAspectFit - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); - toast.show(qsTr("Copied session-ID into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the session-ID into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - Column { - id: pin_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_pin_text - height: parent.height/2 - text: qsTr("Access-PIN") - font.weight: Font.Bold - font.bold: true - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - font.pointSize: 14 - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - } - - TextEdit { - objectName: "pin_text" - id: pin_text - height: parent.height/2 - text: mainqmladaptor.pin - anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width - anchors.right: parent.right - font.pointSize: 15 - anchors.left: parent.left - anchors.leftMargin: 10 - font.letterSpacing: 10 - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - readOnly: true - color: Material.foreground - wrapMode: Text.WordWrap - selectByMouse: true - - Button { - id: copy_pin_to_clipboard_button - width: copy_pin_to_clipboard_image.width + 6 - height: copy_pin_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - flat: true - display: AbstractButton.IconOnly - anchors.left: pin_text.right - anchors.leftMargin: 5 - - Image { - id: copy_pin_to_clipboard_image - anchors.verticalCenter: parent.verticalCenter - opacity: 0.65 - anchors.horizontalCenter: parent.horizontalCenter - source: "../../images/into-clipboard.svg" - fillMode: Image.PreserveAspectFit - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); - toast.show(qsTr("Copied PIN into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the pin into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - } - - Button { - id: start_support_button - height: Math.min(50) - objectName: "start_support_button" - text: 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); - } -} - -/*##^## Designer { - D{i:0;autoSize:true;height:480;width:640} -} - ##^##*/ diff --git a/src/session.cpp b/src/session.cpp index 32aca7d..a524afe 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -310,22 +310,36 @@ void Session::start_response(QJsonDocument *doc) { emit pinChanged(QString::number(pin)); emit urlChanged(url); emit sessionIDChanged(QString::number(session_id)); -} -void Session::stop() { - _dbus_api->stop_request(_host, this->getSessionID()); + started = true; - // Clear current variables - this->init_vars(); + // Ask status every 1000 millisecond - // 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); + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, + QOverload<>::of(&Session::statusTimerEvent)); + timer->start(1000); + + qDebug() << "Successfully started a session."; + this->setStatus("start_session_success"); + + emit startSucceeded(); +} + +void Session::stop() { + if (started) + _dbus_api->stop_request(getHost(), getSessionID()); } void Session::stop_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 stopFailed(tr("Can't connect to underlying session service! " + "Is the session service started?")); + return; + } QJsonObject jObject = doc->object(); QVariantMap mainMap = jObject.toVariantMap(); -- cgit v1.2.3 From 35343e5158ca441f8001c0a91685f4e93b53cb03 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:22:57 +0200 Subject: Toast: Add a variety of new toast colors; Session complete rewrite; A lot of bugfixing; New available toast colors/types: ToastType.Standard, ToastType.Info, ToastType.Warning ToastType.Success, ToastType.Error --- src/Toast.qml | 26 +- src/ToastManager.qml | 19 +- src/main.qml | 4 +- src/main_qmladaptor.cpp | 84 ++---- src/main_qmladaptor.h | 63 ++-- src/scenes/add_server_wizard/Scene_step_1.qml | 1 + src/scenes/add_server_wizard/add_server_wizard.cpp | 17 +- src/scenes/add_server_wizard/add_server_wizard.h | 4 +- src/session.cpp | 320 +++++++-------------- src/session.h | 52 ++-- 10 files changed, 248 insertions(+), 342 deletions(-) diff --git a/src/Toast.qml b/src/Toast.qml index 0de53a9..7a18dc8 100644 --- a/src/Toast.qml +++ b/src/Toast.qml @@ -27,6 +27,7 @@ import QtQuick 2.0 import QtQuick.Controls 2.0 import QtQuick.Controls.Material 2.3 +import rwa.toast.type 1.0 /** * adapted from StackOverflow: @@ -50,8 +51,11 @@ Control { * * @param {string} text Text to show * @param {real} duration Duration to show in milliseconds, defaults to 3000 + * @param {enum} type Type of toast. Available is: + * ToastType.Standard, ToastType.Info, ToastType.Warning + * ToastType.Success, ToastType.Error */ - function show(text, duration) { + function show(text, duration, type) { message.text = text; // checks if parameter was passed @@ -60,6 +64,23 @@ Control { } else { time = defaultTime; } + + if (typeof type !== "undefined" ) { + if (type === ToastType.ToastStandard) { + selectedColor = "#dcdedc"; + } else if (type === ToastType.ToastInfo) { + selectedColor = "#0d5eaf"; + } else if (type === ToastType.ToastSuccess) { + selectedColor = "#0daf36"; + } else if (type === ToastType.ToastWarning) { + selectedColor = "#efef2a"; + } else if (type === ToastType.ToastError) { + selectedColor = "#ed1212"; + } + } else { + selectedColor = "#dcdedc"; + } + animation.start(); } @@ -72,6 +93,7 @@ Control { id: root + property color selectedColor: "#dcdedc" readonly property real defaultTime: 3000 property real time: defaultTime readonly property real fadeTime: 300 @@ -88,6 +110,8 @@ Control { background: Rectangle { color: (Material.theme == Material.Dark) ? "#212121" : "#dcdedc" + border.color: selectedColor + border.width: 1.5 radius: margin } diff --git a/src/ToastManager.qml b/src/ToastManager.qml index 1acf8d5..2f1600f 100644 --- a/src/ToastManager.qml +++ b/src/ToastManager.qml @@ -42,9 +42,12 @@ ListView { * * @param {string} text Text to show * @param {real} duration Duration to show in milliseconds, defaults to 3000 + * @param {enum} type Type of toast. Available is: + * ToastType.Standard, ToastType.Info, ToastType.Warning + * ToastType.Success, ToastType.Error */ - function show(text, duration) { - model.insert(0, {text: text, duration: duration}); + function show(text, duration, type) { + model.insert(0, {text: text, duration: duration, type: type}); } /** @@ -71,11 +74,13 @@ ListView { delegate: Toast { Component.onCompleted: { - if (typeof duration === "undefined") { - show(text); - } - else { - show(text, duration); + if (typeof duration === "undefined" && typeof type === "undefined") { + show(text, ToastType.ToastStandard); + } else if (typeof duration === "undefined" && + typeof type !== "undefined") { + show(text, type); + } else { + show(text, duration, type); } } } diff --git a/src/main.qml b/src/main.qml index 4782f4b..af41dd1 100644 --- a/src/main.qml +++ b/src/main.qml @@ -107,8 +107,8 @@ ApplicationWindow { Connections { target: mainqmladaptor - onShowToastSignal: { - toast.show(text, durationMs) + function onShowToastSignal(text, durationMs, type) { + toast.show(text, durationMs, type) } } diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 5da0abb..d30243d 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -33,11 +33,22 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine, _engine = engine; _dbus_api = dbus_api; + _selected_rwa_host = nullptr; _rwaHostModel = new QList; QTimer *timer = new QTimer(this); - connect(timer, &QTimer::timeout, _dbus_api, QOverload<>::of(&DBusAPI::get_web_app_hosts_request)); + 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 + ); + } void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { @@ -55,11 +66,19 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { } Q_ASSERT(_host != nullptr); - qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); + _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 *rwa_hosts) { _rwaHostModel = rwa_hosts; emit rwaHostModelChanged(*rwa_hosts); @@ -108,7 +127,13 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (doc == nullptr) { setRWAHostSelected(false); - showToast(tr("Can't connect to underlying session service!"), 9800); + 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; } @@ -308,59 +333,12 @@ bool MainQMLAdaptor::getShowMessageDialog() { return _showMessageDialog; } -bool MainQMLAdaptor::setStatusIndicator(bool active, QColor color) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("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); } diff --git a/src/main_qmladaptor.h b/src/main_qmladaptor.h index 9a2f7c3..70c075b 100644 --- a/src/main_qmladaptor.h +++ b/src/main_qmladaptor.h @@ -39,17 +39,34 @@ #include "RWAHost.h" #include "DBusAPI.h" -class MainQMLAdaptor : public QObject +namespace Toast { + Q_NAMESPACE + enum ToastType { + ToastStandard, + ToastInfo, + ToastSuccess, + ToastWarning, + ToastError + }; + Q_ENUM_NS(ToastType) +} + +/*#include +namespace MyNamespace { + Q_NAMESPACE // required for meta object creation + enum EnStyle { + STYLE_RADIAL, + STYLE_ENVELOPE, + STYLE_FILLED + }; + Q_ENUM_NS(EnStyle) // register the enum in meta object data +}*/ + +class MainQMLAdaptor : public QObject { Q_OBJECT - // this makes url available as a QML property + // this makes rwaHostModel available as a QML property Q_PROPERTY(QList rwaHostModel READ getRWAHostModel NOTIFY rwaHostModelChanged) - // this makes url available as a QML property - Q_PROPERTY(QString url READ getURL WRITE setURL NOTIFY urlChanged) - // this makes pin available as a QML property - Q_PROPERTY(QString pin READ getPin WRITE setPin NOTIFY pinChanged) - // this makes session_id available as a QML property - Q_PROPERTY(QString session_id READ getSessionID WRITE setSessionID NOTIFY sessionIDChanged) // this makes showMessageDialog available as a QML property Q_PROPERTY(bool showMessageDialog READ getShowMessageDialog NOTIFY showMessageDialogChanged) // this makes showMessageDialogTitle available as a QML property @@ -85,27 +102,19 @@ signals: void minimizeWindow(); void showWindow(); - void onConnectButtonClick(bool checked); - - void pinChanged(QString pin); - void urlChanged(QString URL); - void sessionIDChanged(QString session_id); - void rwaHostModelChanged(QList); void onCloseSignal(); - void showToastSignal(QString text, QString durationMs); + void showToastSignal(QString text, QString durationMs, int type); protected: - QString _url; - QString _pin; - QString _session_id; DBusAPI *_dbus_api; QList *_rwaHostModel; private: - QQmlApplicationEngine* _engine; + QQmlApplicationEngine *_engine; + RWAHost *_selected_rwa_host; bool _showMessageDialog; QString _messageDialogTitle; @@ -113,27 +122,23 @@ private: QMessageBox::Icon _messageDialogIcon; public slots: - void handleCopyToClipboardButtonClick(QString copy_data); - void handleConnectButtonClick(bool checked); - void get_web_app_hosts_response(QJsonDocument *doc); - void setPin(QString pin); - void setURL(QString URL); - void setSessionID(QString session_id); void addRWAHost(RWAHost *rwa_host); void removeRWAHost(RWAHost *rwa_host); void setRWAHostSelected(bool value); - QString getURL(); - QString getPin(); - QString getSessionID(); // No pointer because QML doesn't // like this type much with pointer QList getRWAHostModel(); + RWAHost *getSelectedRWAHost(); + void onRwaHostSelected(QString host_uuid); void onCloseHandler(); - void showToast(QString text, uint durationMs = 3000); + // arg type is actually Toast::ToastType + void showToast(QString text, + uint durationMs = 3000, + uint type = 0); }; diff --git a/src/scenes/add_server_wizard/Scene_step_1.qml b/src/scenes/add_server_wizard/Scene_step_1.qml index e57f8a4..bfbe2ae 100644 --- a/src/scenes/add_server_wizard/Scene_step_1.qml +++ b/src/scenes/add_server_wizard/Scene_step_1.qml @@ -3,6 +3,7 @@ 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 diff --git a/src/scenes/add_server_wizard/add_server_wizard.cpp b/src/scenes/add_server_wizard/add_server_wizard.cpp index 9b67ebc..caac344 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ b/src/scenes/add_server_wizard/add_server_wizard.cpp @@ -47,7 +47,7 @@ void Add_Server_wizard::processStep1(QString host_url, QString host_alias) { if(host_alias == "" || host_url == "") { QString reason = tr("Both textfields can't be empty!"); - emit step1Failed(reason); + emit step1Failed(reason, Toast::ToastType::ToastWarning); qDebug().noquote() << reason; return; } @@ -57,7 +57,7 @@ void Add_Server_wizard::processStep1(QString host_url, QString host_alias) { void Add_Server_wizard::processStep2() { qDebug() << "Processing Step 2 with args: No Args."; - emit step2Failed(tr("The features you expected here are not yet implemented.")); + emit step2Failed(tr("The features you expected here are not yet implemented."), Toast::ToastType::ToastWarning); // Just show placeholder scene now. emit step2Success(); } @@ -72,7 +72,9 @@ void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { // 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); + _main_gui->showToast(tr("Can't connect to underlying session service!"), + 9800, + Toast::ToastType::ToastError); return; } @@ -90,25 +92,32 @@ void Add_Server_wizard::add_web_app_host_response(QJsonDocument *doc) { } 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); + emit step1Failed(reason, toast_type); return; } diff --git a/src/scenes/add_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h index 03af824..dc205d1 100644 --- a/src/scenes/add_server_wizard/add_server_wizard.h +++ b/src/scenes/add_server_wizard/add_server_wizard.h @@ -47,9 +47,9 @@ private: signals: void step1Success(); - void step1Failed(QString reason); + void step1Failed(QString reason, uint toast_type); void step2Success(); - void step2Failed(QString reason); + void step2Failed(QString reason, uint toast_type); public slots: void processStep1(QString host_url, QString host_alias); 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 out of dbus answer!"); - init_vars(); + QString error_message = "Unable to parse 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 out of dbus answer!"); - init_vars(); + QString error_message = "Unable to parse 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(); } diff --git a/src/session.h b/src/session.h index 5935919..e1c924f 100644 --- a/src/session.h +++ b/src/session.h @@ -33,48 +33,41 @@ #include #include -#include "main_qmladaptor.h" #include "RWAHost.h" #include "DBusAPI.h" -class Session : public QObject -{ +class Session : public QObject { Q_OBJECT - // this makes status available as a QML property - Q_PROPERTY(QString status READ getStatus NOTIFY statusChanged) - // this makes session_id available as a QML property - Q_PROPERTY(QString session_id READ getSessionID NOTIFY sessionIDChanged) - // 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) public: - explicit Session(QObject *parent, MainQMLAdaptor *main_gui = nullptr, + explicit Session(DBusAPI *dbus_api = nullptr, RWAHost *host = nullptr); + ~Session(); QString getStatus(); QString getURL(); QString getSessionID(); QString getPin(); + RWAHost* getHost(); void setStatus(QString status); void setURL(QString url); void setSessionID(QString session_id); void setPin(QString pin); + void setHost(RWAHost *host); void start(); void stop(); void status(); void refresh_status(); -protected: - QString _status; - void statusTimerEvent(); - void init_vars(); + bool started; private: - MainQMLAdaptor *_main_gui; + void statusTimerEvent(); + + bool _emitted_status_error_already; + QString _status; RWAHost *_host; DBusAPI *_dbus_api; @@ -82,25 +75,30 @@ private: QString _url; QString _pin; - // Returns true if a session is somewhat usable (Running, Alive, etc..) - bool isSessionAliveOrRunning(QString status); - bool _minimizedBefore = false; - void minimizeWindow(); + signals: - void finished(); void statusChanged(QString); void sessionIDChanged(QString); void urlChanged(QString); void pinChanged(QString); + void hostChanged(RWAHost*); + + void startFailed(QString error_message); + void stopFailed(QString error_message); + void statusFailed(QString error_message); + + void startSucceeded(); + void stopSucceeded(); + void statusSucceeded(); public slots: - void handleConnectButtonClick(bool checked); - void onCloseHandler(); + // Returns true if a session is somewhat usable (Running, Alive, etc..) + bool isSessionAliveOrRunning(); - void start_response(QJsonDocument *doc); - void stop_response(QJsonDocument *doc); - void status_response(QJsonDocument *doc); + void start_response(QJsonDocument*); + void stop_response(QJsonDocument*); + void status_response(QJsonDocument*); }; #endif // SESSION_H -- cgit v1.2.3 From ea9c15a88a645887cda6022b9c304eba806ff17d Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:25:37 +0200 Subject: Update locales. --- locales/de_DE.qm | Bin 0 -> 17780 bytes locales/de_DE.ts | 367 ++++++++++++++++++----------------------------------- locales/es_ES.qm | Bin 0 -> 723 bytes locales/es_ES.ts | 178 +++++++++++++++++--------- locales/main_en.qm | Bin 0 -> 1078 bytes locales/main_en.ts | 164 +++++++++++++++++------- 6 files changed, 367 insertions(+), 342 deletions(-) create mode 100644 locales/de_DE.qm create mode 100644 locales/es_ES.qm create mode 100644 locales/main_en.qm diff --git a/locales/de_DE.qm b/locales/de_DE.qm new file mode 100644 index 0000000..e9444e0 Binary files /dev/null and b/locales/de_DE.qm differ diff --git a/locales/de_DE.ts b/locales/de_DE.ts index c23ff81..e0fad9a 100644 --- a/locales/de_DE.ts +++ b/locales/de_DE.ts @@ -15,48 +15,36 @@ The specified host address is not valid! Die angegebene Serveradresse enthält einen Fehler! - - This field can't be empty! - Das Feld darf nicht leer sein! - - - The feature you expected here are not yet implemented. - Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. - The features you expected here are not yet implemented. Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. An error occured while adding a new host! - + Ein Fehler trat auf beim Hinzufügen eines RWA-Servers! Both textfields can't be empty! - + Beide Felder müssen ausgefüllt werden! The specified host address does not grant access! - + Der angegebene Server gewährt keinen Zugang! The specified host address is not supported! - + Der angegebene Server wird nicht unterstützt! + + + Can't connect to underlying session service! + Es kann keine Verbindung zur Sitzungsverwaltung hergestellt werden! MainQMLAdaptor - - Stop remote support session - Stoppe Fernwartungssitzung - - - Start remote support session - Starte Fernwartungssitzung - A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) - + Ein Serverobject in der D-Bus Serviceantwort beeinhaltet nicht alle erforderlichen werte. (host_url oder host_uuid) An error occured while adding a new host: @@ -74,20 +62,104 @@ The error is not clear. The session service responded with no status type! Der Fehler ist nicht klar. Der Sessionservice hat mit keinem Statustypen geantwortet! + + No RWA host available! + Kein RWA-Server verfügbar! + + + Can't connect to underlying session service! + Es kann keine Verbindung zur Sitzungsverwaltung hergestellt werden! + + + Removed RWAHost '%0' + RWA-Server '%0' entfernt + - QObject + RemoteControlManager - You already have this app running. - Diese Anwendung läuft bereits. + Stop remote support session + Stoppe Fernwartungssitzung - Only one instance is allowed. - Nur eine Instanz ist erlaubt. + Start remote support session + Starte Fernwartungssitzung - Closing application now with an error. - Die Applikation wird nun mit einem Fehler beendet. + Not available yet + Noch nicht verfügbar + + + Unknown state of service + Unbekannter Status des Dienstes + + + Remote Support session was stopped ungracefully + Fernwartungssitzung wurde unerwartet beendet + + + Remote Support session was stopped + Fernwartungssitzung wurde beendet + + + Your partner is connected to the Remote Support session + Fernwartungspartner ist mit dieser Sitzung verbunden + + + Remote Support session couldn't be started! + Fernwartungssitzung konnte nicht gestartet werden! + + + Session was started on '%0' successfully + Sitzung wurde erfolgreich auf '%0' gestartet + + + remote support partner could still be connected! + Es ist möglich, dass Ihr Fernwartungspartner noch verbunden ist! + + + Session could not be stopped! + Sitzung konnte nicht gestoppt werden! + + + Session status could not be refreshed! Your remote support partner could still be connected! + Sitzungstatus konnte nicht erneuert werden! Es ist möglich, dass der Fernwartungspartner noch verbunden ist! + + + Couldn't remove current session out of '_sessions' list. + Konnte aktuelle Sitzung nicht aus der Liste '_sessions' löschen. + + + currentSessionStartSucceeded(): Current Session is nullptr! + currentSessionStartSucceeded(): Aktuelle Sitzung ist nullptr! + + + Remote support session was stopped. + Fernwartungssitzung wurde beendet. + + + Remote Support session successfully started! Waiting for your remote support partner to connect. + Fernwartungssitzung wurde erfolgreich gestartet! Warte auf auf Verbindung vom Fernwartungspartner. + + + Session stopped successfully. + Fernwartungssitzung wurde erfolgreich beendet. + + + Creating a new session object. + Erstelle neues Sitzungsobjekt. + + + Can't start a remote support session. There is no RWA host is selected! + Kann keine Fernwartungssitzung starten. Es ist kein RWA-Server ausgewählt! + + + RemoteControlManager::handleConnectButtonClick(): Current Session is nullptr! + RemoteControlManager::handleConnectButtonClick(): Aktuelle Sitzung ist nullptr! + + + Starting a remote support session on host '%0' using the new session object. + Starte eine Fernwartungssitzung auf Server '%0' mithilfe des neuen Sitzungsobjektes. @@ -96,14 +168,8 @@ Welcome! Willkommen! - - 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' - 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . - Sie müssen zuerst einen RWA-Server hinzufügen und dann auswählen, um sich mit diesem zu verbinden. Auf der linken Seite befindet sich ein Knopf mit der Aufschrift 'RWA-Server hinzufügen'. Folgen Sie den Anweisungen dort und Sie können Ihre Fernwartungssitzung rasch starten. - 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'. - 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . Sie müssen zuerst einen RWA-Server hinzufügen und dann auswählen, um sich mit diesen zu verbinden. Auf der linken Seite befindet sich ein Knopf mit der Aufschrift 'RWA-Server hinzufügen'. Folgen Sie den Anweisungen dort und Sie können Ihre Fernwartungssitzung rasch starten. @@ -113,10 +179,6 @@ This is the placeholder scene! Das hier ist eine Platzhalter Szene! - - The feature you expected here are not yet implemented. - Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. - The features you expected here are not yet implemented. Die Features die Sie erwartet hatten, sind noch nicht implementiert worden. @@ -158,7 +220,7 @@ Copied PIN into clipboard! - Zugangspin wurde in die Zwischenablage kopiert! + Zugangs-PIN wurde in die Zwischenablage kopiert! Copy the pin into the clipboard @@ -168,6 +230,14 @@ Start remote support session Starte Fernwartungssitzung + + Stop remote support session + Stoppe Fernwartungssitzung + + + Unknown state of session service. + Unbekannter Status der Sitzungverwaltung. + Scene_remote_view @@ -218,18 +288,10 @@ Scene_step_1 - - Successfully added server address. - Erfolgreich Server hinzugefügt. - Next Step Nächster Schritt - - Step 1 - Schritt 1 - Please input the address for the remote web app server which you want to connect to. If you don't know what this means, ask your local administrator about it please. @@ -242,47 +304,21 @@ Bevor Sie eine Fernwartungssitzung starten können, müssen Sie zuerst für das http://example.com:8000 - - RWA-server address - RWA-Server Adresse - Successfully added remote web app host. Erfolgreich Fernwartungsserver hinzugefügt. RWA host address - + RWA-Server Adressse My example host - + Mein Beispiel Server RWA host alias - - - - - Scene_step_2 - - Step 2 - Schritt 2 - - - Next Step - Nächster Schritt - - - - Scene_step_3 - - Step 3 - Schritt 3 - - - <- First step - <- Erster Schritt + RWA-Server Alias @@ -292,99 +328,32 @@ Bevor Sie eine Fernwartungssitzung starten können, müssen Sie zuerst für das Noch nicht verfügbar - Unknown state of service - Unbekannter Status des Dienstes - - - Remote Support Session is up and running - Fernwartungssitzung läuft - - - Remote Support Session was stopped ungracefully - Fernwartungssitzung wurde unvorhergesehen beendet - - - Remote Support Session was stopped - Fernwartungssitzung wurde beendet - - - Remote Support for your Desktop - Fernwartung für den Desktop - - - D-Bus response was invalid. -Function call: '%1' -Maybe service isn't listening? - D-Bus Antwort auf Funktionsaufruf '%1' war nicht auswertbar -Ist der Dienst vielleicht nicht an? - - - Remote Support Session is ready to be connected to - Fernwartungssitzung ist bereit um verbunden zu werden - - - Your partner is connected to the Remote Support Session - Fernwartungspartner ist verbunden - - - Remote Support session is ready to be connected to - Bereit um eine Fernwartungssitzung aufzubauen - - - Remote Support session was stopped ungracefully - Fernwartungssitzung wurde unerwartet beendet - - - Remote Support session was stopped - Fernwartungssitzung wurde beendet - - - Your partner is connected to the Remote Support session - Fernwartungspartner ist mit dieser Sitzung verbunden - - - Trying to reach session service... - Versuche Sitzungsdienst zu kontaktieren... - - - Remote Support session couldn't be started! - Fernwartungssitzung konnte nicht gestartet werden! - - - An error occured while trying to start a session! - Ein Fehler trat auf bei dem Versuch eine Sitzung zu starten! + An error occured while creating a new session! + Ein Fehler trat auf bei dem Versuch eine Sitzung zu erstellen! - Remote Support session successfully started! - Fernwartungssitzung erfolgreich gestartet! + The session service is configured to not support multiple sessions and there is already a session running. + Die Sitzungsverwaltung ist so konfiguriert, dass nur eine Sitzung erlaubt ist und es ist bereits eine Sitzung am laufen. - Session was started successfully - Sitzung wurde erfolgreich gestartet + Couldn't connect to host '%0'. + Konnte nicht zu RWA-Server '%0' verbinden. - Session status could not be refreshed! - Sitzungstatus konnte nicht erneuert werden! + The RWA host '%0' couldn't be found. + Konnte RWA-Server '%0' nicht finden. - Session status could not be refreshed, remote support partner could still be connected! - Sitzungstatus konnte nicht erneuert werden! Es ist möglich, dass der Fernwartungspartner noch verbunden ist! + The RWA host '%0' doesn't grant access. + Der RWA-Server '%0' gewährt keinen Zugang. - Session could not be stopped! - Sitzung konnte nicht gestoppt werden! + The RWA host '%0' is not supported. + Der RWA-Server '%0' wird nicht unterstützt. - Session could not be stopped, remote support partner could still be connected! - Sitzung konnte nicht gestoppt werden! Es ist möglich, dass der Fernwartungspartner noch verbunden ist! - - - remote support partner could still be connected! - Es ist möglich, dass Ihr Partner noch verbunden ist! - - - Session was started on '%0' successfully - Sitzung wurde erfolgreich auf '%0' gestartet + Can't connect to underlying session service! Is the session service started? + Es kann keine Verbindung zur Sitzungsverwaltung hergestellt werden! Ist die Sitzungsverwaltung eingeschaltet? @@ -393,30 +362,10 @@ Ist der Dienst vielleicht nicht an? Remote Support for your Desktop Fernwartung für den Desktop - - Allow remote desktop support - Fernwartungssitzung starten - - - Unknown state of service - Unbekannter Status des Dienstes - - - Remote Support URL - Fernwartungs-URL - - - Access pin to this computer - Zugangspin zu diesem Computer - Allow Remote Control Fernwartungssitzung erlauben - - Please tell your partner your PIN and the Support URL to connect to this computer - Bitte gebe deinem Fernwartungspartner die Zugangspin und die Fernwartungs-URL um sich mit diesem Computer verbinden zu können - Remote Control Fernwartung @@ -434,74 +383,10 @@ Ist der Dienst vielleicht nicht an? This is a bug. Diese Nachricht sollte nie gesehen werden. Das ist ein Bug. - - Start remote support session - Starte Fernwartungssitzung - - - Copy the URL into the clipboard - Kopiere URL in die Zwischenablage - - - Copy the pin into the clipboard - Kopiere Zugangspin in die Zwischenablage - - - Copied URL into clipboard! - URL in die Zwischenablage kopiert! - - - Copied PIN into clipboard! - Zugangspin wurde in die Zwischenablage kopiert! - - - Please tell your remote support partner your personal access address and your access-PIN to let your partner connect to this computer. - Bitte teile deinem Fernwartungspartner deine persönliche Zugangsadresse und deine Zugangs-PIN mit, um sich mit diesem Computer verbinden zu können. - - - Remote Support Address - Zugangsadresse für Fernwartung - - - Personal Access-PIN - Persönliche Zugangs-PIN - - - Title %1 - Titel %1 - Dark theme Dunkelmodus - - Access-PIN - Zugangs-PIN - - - Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer. - Bitte teile deinem Fernwartungspartner deine Zugangsadresse und deine Zugangs-PIN mit, um sich mit diesem Computer verbinden zu können. - - - Copied access address into clipboard! - Zugangsadresse wurde in die Zwischenablage kopiert! - - - Copy the access address into the clipboard - Kopiere Zugangsadresse in die Zwischenablage - - - Session-ID - Sitzungs-ID - - - Copied session-ID into clipboard! - Sitzungs-ID wurde in die Zwischenablage kopiert! - - - Copy the session-ID into the clipboard - Kopiere Sitzungs-ID in die Zwischenablage - Allow remote control Fernwartungssitzung erlauben diff --git a/locales/es_ES.qm b/locales/es_ES.qm new file mode 100644 index 0000000..2d4045c Binary files /dev/null and b/locales/es_ES.qm differ diff --git a/locales/es_ES.ts b/locales/es_ES.ts index b767dfe..844b883 100644 --- a/locales/es_ES.ts +++ b/locales/es_ES.ts @@ -35,35 +35,130 @@ The specified host address is not supported! + + Can't connect to underlying session service! + + MainQMLAdaptor + + A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) + + + + An error occured while adding a new host: + + + + Successfully added new RWAHost '%0' + + + + The error is not clear. The session service responded with status type '%0' + + + + The error is not clear. The session service responded with no status type! + + + + No RWA host available! + + + + Can't connect to underlying session service! + + + + Removed RWAHost '%0' + + + + + RemoteControlManager Stop remote support session - + Start remote support session - A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) + Not available yet - An error occured while adding a new host: + Unknown state of service + Estado de servicio desconocido + + + Remote Support session was stopped ungracefully - Successfully added new RWAHost '%0' + Remote Support session was stopped - The error is not clear. The session service responded with status type '%0' + Your partner is connected to the Remote Support session - The error is not clear. The session service responded with no status type! + Remote Support session couldn't be started! + + + + Session was started on '%0' successfully + + + + remote support partner could still be connected! + + + + Session could not be stopped! + + + + Session status could not be refreshed! Your remote support partner could still be connected! + + + + Couldn't remove current session out of '_sessions' list. + + + + currentSessionStartSucceeded(): Current Session is nullptr! + + + + Remote support session was stopped. + + + + Remote Support session successfully started! Waiting for your remote support partner to connect. + + + + Session stopped successfully. + + + + Creating a new session object. + + + + Can't start a remote support session. There is no RWA host is selected! + + + + RemoteControlManager::handleConnectButtonClick(): Current Session is nullptr! + + + + Starting a remote support session on host '%0' using the new session object. @@ -75,7 +170,6 @@ 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'. - 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . @@ -92,10 +186,6 @@ Scene_remote_control - - Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer. - - Remote Support Address @@ -136,6 +226,18 @@ Start remote support session + + Stop remote support session + + + + Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer. + + + + Unknown state of session service. + + Scene_remote_view @@ -219,64 +321,36 @@ Before you can start any remote sessions you will have to be approved for remote Session - - Unknown state of service - Estado de servicio desconocido - - - Remote Support for your Desktop - Soporte remoto para su escritorio - Not available yet - Remote Support session is ready to be connected to - - - - Remote Support session was stopped ungracefully + An error occured while creating a new session! - Remote Support session was stopped + The session service is configured to not support multiple sessions and there is already a session running. - Your partner is connected to the Remote Support session + Couldn't connect to host '%0'. - Trying to reach session service... + The RWA host '%0' couldn't be found. - Remote Support session couldn't be started! + The RWA host '%0' doesn't grant access. - An error occured while trying to start a session! + The RWA host '%0' is not supported. - Remote Support session successfully started! - - - - Session status could not be refreshed! - - - - remote support partner could still be connected! - - - - Session could not be stopped! - - - - Session was started on '%0' successfully + Can't connect to underlying session service! Is the session service started? @@ -286,18 +360,6 @@ Before you can start any remote sessions you will have to be approved for remote Remote Support for your Desktop Soporte remoto para su escritorio - - Unknown state of service - Estado de servicio desconocido - - - Allow remote desktop support - Permitir soporte de escritorio remoto - - - Access pin to this computer - Pin de acceso a esta computadora - You are not supposed to see this message. This is a bug. diff --git a/locales/main_en.qm b/locales/main_en.qm new file mode 100644 index 0000000..a0de2c8 Binary files /dev/null and b/locales/main_en.qm differ diff --git a/locales/main_en.ts b/locales/main_en.ts index 0e3ac88..35aafff 100644 --- a/locales/main_en.ts +++ b/locales/main_en.ts @@ -35,35 +35,130 @@ The specified host address is not supported! + + Can't connect to underlying session service! + + MainQMLAdaptor - Stop remote support session + A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) + + An error occured while adding a new host: + + + + Successfully added new RWAHost '%0' + + + + The error is not clear. The session service responded with status type '%0' + + + + The error is not clear. The session service responded with no status type! + + + + No RWA host available! + + + + Can't connect to underlying session service! + + + + Removed RWAHost '%0' + + + + + RemoteControlManager + + Stop remote support session + + Start remote support session - A host object in the response of D-Bus service lacks a necessary value. (host_url or host_uuid) + Not available yet - An error occured while adding a new host: + Unknown state of service - Successfully added new RWAHost '%0' + Remote Support session was stopped ungracefully - The error is not clear. The session service responded with status type '%0' + Remote Support session was stopped - The error is not clear. The session service responded with no status type! + Your partner is connected to the Remote Support session + + + + Remote Support session couldn't be started! + + + + Session was started on '%0' successfully + + + + remote support partner could still be connected! + + + + Session could not be stopped! + + + + Session status could not be refreshed! Your remote support partner could still be connected! + + + + Couldn't remove current session out of '_sessions' list. + + + + currentSessionStartSucceeded(): Current Session is nullptr! + + + + Remote support session was stopped. + + + + Remote Support session successfully started! Waiting for your remote support partner to connect. + + + + Session stopped successfully. + + + + Creating a new session object. + + + + Can't start a remote support session. There is no RWA host is selected! + + + + RemoteControlManager::handleConnectButtonClick(): Current Session is nullptr! + + + + Starting a remote support session on host '%0' using the new session object. @@ -75,7 +170,6 @@ 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'. - 'Add RWA-Server' has to be replaced with the correct translation in file main.qml . @@ -92,10 +186,6 @@ Scene_remote_control - - Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer. - - Remote Support Address @@ -136,6 +226,18 @@ Start remote support session + + Stop remote support session + + + + Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer. + + + + Unknown state of session service. + + Scene_remote_view @@ -206,7 +308,7 @@ Before you can start any remote sessions you will have to be approved for remote RWA host address - + My example host @@ -224,55 +326,31 @@ Before you can start any remote sessions you will have to be approved for remote - Unknown state of service + An error occured while creating a new session! - Remote Support session is ready to be connected to + The session service is configured to not support multiple sessions and there is already a session running. - Remote Support session was stopped ungracefully + Couldn't connect to host '%0'. - Remote Support session was stopped - - - - Your partner is connected to the Remote Support session + The RWA host '%0' couldn't be found. - Trying to reach session service... + The RWA host '%0' doesn't grant access. - Remote Support session couldn't be started! + The RWA host '%0' is not supported. - An error occured while trying to start a session! - - - - Remote Support session successfully started! - - - - Session status could not be refreshed! - - - - remote support partner could still be connected! - - - - Session could not be stopped! - - - - Session was started on '%0' successfully + Can't connect to underlying session service! Is the session service started? -- cgit v1.2.3 From 0e8f295868e826b89114b55a0aa360cb30d7494f Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:36:42 +0200 Subject: add_server_wizard/add_server_wizard -> add_rwahost_wizard/add_rwahost_wizard --- qml.qrc | 6 +- rwa-support-desktopapp.pro | 4 +- src/main.cpp | 10 +- src/main.qml | 2 +- src/main_qmladaptor.cpp | 4 +- src/scenes/add_rwahost_wizard/Scene_step_1.qml | 282 +++++++++++++++++++++ .../add_rwahost_wizard/add_rwahost_wizard.cpp | 124 +++++++++ src/scenes/add_rwahost_wizard/add_rwahost_wizard.h | 61 +++++ src/scenes/add_server_wizard/Scene_step_1.qml | 282 --------------------- src/scenes/add_server_wizard/add_server_wizard.cpp | 124 --------- src/scenes/add_server_wizard/add_server_wizard.h | 61 ----- src/scenes/remote_control/remote_control_manager.h | 4 +- 12 files changed, 482 insertions(+), 482 deletions(-) create mode 100644 src/scenes/add_rwahost_wizard/Scene_step_1.qml create mode 100644 src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp create mode 100644 src/scenes/add_rwahost_wizard/add_rwahost_wizard.h delete mode 100644 src/scenes/add_server_wizard/Scene_step_1.qml delete mode 100644 src/scenes/add_server_wizard/add_server_wizard.cpp delete mode 100644 src/scenes/add_server_wizard/add_server_wizard.h diff --git a/qml.qrc b/qml.qrc index 35e9142..04ee201 100644 --- a/qml.qrc +++ b/qml.qrc @@ -29,9 +29,9 @@ src/scenes/Scene_settings.qml src/scenes/Scene_placeholder.qml src/scenes/Scene_no_server_available.qml - src/scenes/add_server_wizard/add_server_wizard.cpp - src/scenes/add_server_wizard/add_server_wizard.h - src/scenes/add_server_wizard/Scene_step_1.qml + src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp + src/scenes/add_rwahost_wizard/add_rwahost_wizard.h + src/scenes/add_rwahost_wizard/Scene_step_1.qml src/scenes/remote_control/remote_control_manager.cpp src/scenes/remote_control/remote_control_manager.h src/scenes/remote_control/Scene_remote_control.qml diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index f9a05bf..96ecec3 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -52,7 +52,7 @@ SOURCES += src/main.cpp \ src/RWAHost.cpp \ src/DBusAPI.cpp \ src/scenes/remote_control/remote_control_manager.cpp \ - src/scenes/add_server_wizard/add_server_wizard.cpp + src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp HEADERS += src/RWADBusAdaptor.h \ src/main_qmladaptor.h \ @@ -63,7 +63,7 @@ HEADERS += src/RWADBusAdaptor.h \ src/RWAHost.h \ src/DBusAPI.h \ src/scenes/remote_control/remote_control_manager.h \ - src/scenes/add_server_wizard/add_server_wizard.h + src/scenes/add_rwahost_wizard/add_rwahost_wizard.h TRANSLATIONS += locales/main_en.ts \ locales/de_DE.ts \ diff --git a/src/main.cpp b/src/main.cpp index ff5d2a8..e29c8db 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,7 +39,7 @@ #include "DBusAPI.h" #include "RWADBusAdaptor.cpp" #include "session.h" -#include "scenes/add_server_wizard/add_server_wizard.h" +#include "scenes/add_rwahost_wizard/add_rwahost_wizard.h" #include "scenes/remote_control/remote_control_manager.h" #include "RWAHostModel.h" #include "RWAHost.h" @@ -119,14 +119,14 @@ int main(int argc, char *argv[]) { main_gui.data(), SLOT(onRwaHostSelected(QString))); - // Make 'add_server_wizard' available to QML - QScopedPointer wizard ( - new Add_Server_wizard(&app, + // Make 'AddRWAHostWizard' available to QML + QScopedPointer wizard ( + new AddRWAHostWizard(&app, main_gui.data(), dbus_api.data()) ); engine.rootContext()-> - setContextProperty("add_server_wizard", wizard.data()); + setContextProperty("add_rwahost_wizard", wizard.data()); // Make 'remote_control_manager' available to QML QScopedPointer remote_mngr ( diff --git a/src/main.qml b/src/main.qml index af41dd1..a622c18 100644 --- a/src/main.qml +++ b/src/main.qml @@ -295,7 +295,7 @@ ApplicationWindow { } ListItem { text: " " + qsTr("Add RWA-Server") - scene_url: "scenes/add_server_wizard/Scene_step_1.qml" + scene_url: "scenes/add_rwahost_wizard/Scene_step_1.qml" onListItemClick: { header_text.text = qsTr("Server addition wizard") if (inPortrait) sidebar_drawer.close() diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index d30243d..688b993 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -290,9 +290,9 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QVariant to_cast = main_content->property("currentItem"); QObject *obj = qvariant_cast(to_cast); if (obj) { - QString scene_add_server_wizard = "Scene_step_1"; + QString scene_add_rwahost_wizard = "Scene_step_1"; if (!(scene.contains(obj->objectName()) || - scene_add_server_wizard.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))) { diff --git a/src/scenes/add_rwahost_wizard/Scene_step_1.qml b/src/scenes/add_rwahost_wizard/Scene_step_1.qml new file mode 100644 index 0000000..873e0fd --- /dev/null +++ b/src/scenes/add_rwahost_wizard/Scene_step_1.qml @@ -0,0 +1,282 @@ +import QtQuick 2.9 +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). + */ + +Item { + id: scene_server_wizard_step_1 + objectName: "Scene_step_1" + + Connections { + target: add_rwahost_wizard + function onStep1Success() { + // Go onto the first page of the stack. + main_content_pop(null) + mainqmladaptor.showToast(qsTr("Successfully added remote web app host."), + 5000, + ToastType.ToastSuccess); + } + } + + Connections { + target: add_rwahost_wizard + function onStep1Failed(reason, toast_type) { + mainqmladaptor.showToast(reason, + 5000, + toast_type) + } + } + + Rectangle { + id: rectangle + anchors.fill: parent + color: Material.background + + Button { + id: next_step1_button + text: qsTr("Next Step") + anchors.bottom: parent.bottom + anchors.bottomMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 15 + + onClicked: { + add_rwahost_wizard.processStep1(host_url.text, host_alias.text) + } + } + + /*Text { + color: Material.foreground + id: step_indicator + + text: qsTr("Step 1") + anchors.leftMargin: 15 + anchors.top: parent.top + anchors.topMargin: 15 + font.pointSize: 21 + wrapMode: Text.WordWrap + + font.bold: true + horizontalAlignment: Text.AlignHCenter + anchors.left: parent.left + anchors.margins: 5 + }*/ + + Text { + color: Material.foreground + id: explaining_text + + text: qsTr("Please input the address for the "+ + "remote web app server which you want "+ + "to connect to.\nIf you don't know "+ + "what this means, ask your local "+ + "administrator about it please.\nBefore you can "+ + "start any remote sessions you will have to "+ + "be approved for remote support.") + font.pointSize: 12 + anchors.right: parent.right + anchors.rightMargin: 15 + anchors.leftMargin: 15 + anchors.top: parent.top //step_indicator.bottom + anchors.topMargin: 15 + wrapMode: Text.WordWrap + + anchors.left: parent.left + anchors.margins: 5 + } + + TextField { + id: host_url + selectByMouse: true + placeholderText: qsTr("http://example.com:8000") + + font.pixelSize: 16 + color: Material.foreground + anchors.topMargin: 30 + + padding: 15 + topPadding: 15 + + anchors.top: explaining_text.bottom + anchors.left: parent.left + anchors.leftMargin: 15 + anchors.right: parent.right + anchors.margins: 30 + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onHoveredChanged: { + if (containsMouse) { + host_url_background.state = "hovered" + } else if (!host_url.focus) { + host_url_background.state = "unhovered" + } + } + onClicked: { + host_url.forceActiveFocus(); + } + } + + onFocusChanged: { + host_url_background.state = host_url.focus ? "hovered" : "unhovered" + } + + background: Rectangle { + id: host_url_background + color: Material.background + border.color: Material.foreground + border.width: 1 + radius: 4 + + states: [ + State { + name: "hovered" + PropertyChanges { + target: host_url_background + border.color: "#0178EF" + } + }, + State { + name: "unhovered" + PropertyChanges { + target: host_url_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 address") + anchors.left: parent.left + anchors.leftMargin: 15 + anchors.verticalCenterOffset: - host_url.height / 2 + anchors.verticalCenter: parent.verticalCenter + leftPadding: 5 + + Rectangle { + color: Material.background + width: parent.width + 5 + 3 + height: parent.height + z: -1 + } + } + } + } + + 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 + } + } + } + } + } +} + +/*##^## Designer { + D{i:0;autoSize:true;height:480;width:640}D{i:4;anchors_width:351;anchors_x:279} +} + ##^##*/ 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 + * 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 . + */ + +#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 + * 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 . + */ + +#ifndef ADD_RWAHOST_WIZARD_H +#define ADD_RWAHOST_WIZARD_H + +#include + +#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_1.qml b/src/scenes/add_server_wizard/Scene_step_1.qml deleted file mode 100644 index bfbe2ae..0000000 --- a/src/scenes/add_server_wizard/Scene_step_1.qml +++ /dev/null @@ -1,282 +0,0 @@ -import QtQuick 2.9 -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). - */ - -Item { - id: scene_server_wizard_step_1 - objectName: "Scene_step_1" - - Connections { - target: add_server_wizard - function onStep1Success() { - // Go onto the first page of the stack. - main_content_pop(null) - mainqmladaptor.showToast(qsTr("Successfully added remote web app host."), - 5000, - ToastType.ToastSuccess); - } - } - - Connections { - target: add_server_wizard - function onStep1Failed(reason, toast_type) { - mainqmladaptor.showToast(reason, - 5000, - toast_type) - } - } - - Rectangle { - id: rectangle - anchors.fill: parent - color: Material.background - - Button { - id: next_step1_button - text: qsTr("Next Step") - anchors.bottom: parent.bottom - anchors.bottomMargin: 15 - anchors.right: parent.right - anchors.rightMargin: 15 - - onClicked: { - add_server_wizard.processStep1(host_url.text, host_alias.text) - } - } - - /*Text { - color: Material.foreground - id: step_indicator - - text: qsTr("Step 1") - anchors.leftMargin: 15 - anchors.top: parent.top - anchors.topMargin: 15 - font.pointSize: 21 - wrapMode: Text.WordWrap - - font.bold: true - horizontalAlignment: Text.AlignHCenter - anchors.left: parent.left - anchors.margins: 5 - }*/ - - Text { - color: Material.foreground - id: explaining_text - - text: qsTr("Please input the address for the "+ - "remote web app server which you want "+ - "to connect to.\nIf you don't know "+ - "what this means, ask your local "+ - "administrator about it please.\nBefore you can "+ - "start any remote sessions you will have to "+ - "be approved for remote support.") - font.pointSize: 12 - anchors.right: parent.right - anchors.rightMargin: 15 - anchors.leftMargin: 15 - anchors.top: parent.top //step_indicator.bottom - anchors.topMargin: 15 - wrapMode: Text.WordWrap - - anchors.left: parent.left - anchors.margins: 5 - } - - TextField { - id: host_url - selectByMouse: true - placeholderText: qsTr("http://example.com:8000") - - font.pixelSize: 16 - color: Material.foreground - anchors.topMargin: 30 - - padding: 15 - topPadding: 15 - - anchors.top: explaining_text.bottom - anchors.left: parent.left - anchors.leftMargin: 15 - anchors.right: parent.right - anchors.margins: 30 - - MouseArea { - anchors.fill: parent - hoverEnabled: true - onHoveredChanged: { - if (containsMouse) { - host_url_background.state = "hovered" - } else if (!host_url.focus) { - host_url_background.state = "unhovered" - } - } - onClicked: { - host_url.forceActiveFocus(); - } - } - - onFocusChanged: { - host_url_background.state = host_url.focus ? "hovered" : "unhovered" - } - - background: Rectangle { - id: host_url_background - color: Material.background - border.color: Material.foreground - border.width: 1 - radius: 4 - - states: [ - State { - name: "hovered" - PropertyChanges { - target: host_url_background - border.color: "#0178EF" - } - }, - State { - name: "unhovered" - PropertyChanges { - target: host_url_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 address") - anchors.left: parent.left - anchors.leftMargin: 15 - anchors.verticalCenterOffset: - host_url.height / 2 - anchors.verticalCenter: parent.verticalCenter - leftPadding: 5 - - Rectangle { - color: Material.background - width: parent.width + 5 + 3 - height: parent.height - z: -1 - } - } - } - } - - 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 - } - } - } - } - } -} - -/*##^## Designer { - D{i:0;autoSize:true;height:480;width:640}D{i:4;anchors_width:351;anchors_x:279} -} - ##^##*/ 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 caac344..0000000 --- a/src/scenes/add_server_wizard/add_server_wizard.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This file is part of Remote Support Desktop - * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp - * Copyright 2021 Daniel Teichmann - * 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 . - */ - -#include "add_server_wizard.h" -#include "../../RWADBusAdaptor.h" -#include "../../RWAHost.h" - -Add_Server_wizard::Add_Server_wizard(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 Add_Server_wizard::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 Add_Server_wizard::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 Add_Server_wizard::add_server(QString host_url, QString host_alias) { - _dbus_api->add_web_app_host_request(host_url, host_alias); -} - -void Add_Server_wizard::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_server_wizard/add_server_wizard.h b/src/scenes/add_server_wizard/add_server_wizard.h deleted file mode 100644 index dc205d1..0000000 --- a/src/scenes/add_server_wizard/add_server_wizard.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of Remote Support Desktop - * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp - * Copyright 2021 Daniel Teichmann - * 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 . - */ - -#ifndef ADD_SERVER_WIZARD_H -#define ADD_SERVER_WIZARD_H - -#include - -#include "../../RWADBusAdaptor.h" -#include "../../DBusAPI.h" -#include "../../main_qmladaptor.h" - -class Add_Server_wizard : public QObject -{ - Q_OBJECT -public: - explicit Add_Server_wizard(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/remote_control/remote_control_manager.h b/src/scenes/remote_control/remote_control_manager.h index 6f2fbdb..4554724 100644 --- a/src/scenes/remote_control/remote_control_manager.h +++ b/src/scenes/remote_control/remote_control_manager.h @@ -1,5 +1,5 @@ -#ifndef REMOTECONTROLMANAGER_H -#define REMOTECONTROLMANAGER_H +#ifndef REMOTE_CONTROL_MANAGER_H +#define REMOTE_CONTROL_MANAGER_H #include -- cgit v1.2.3 From b98847d816efcfc9e3146d39f4662097d843fd31 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:37:40 +0200 Subject: Update locales. --- locales/de_DE.qm | Bin 17780 -> 17771 bytes locales/de_DE.ts | 4 ++-- locales/es_ES.ts | 2 +- locales/main_en.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/de_DE.qm b/locales/de_DE.qm index e9444e0..453dcd4 100644 Binary files a/locales/de_DE.qm and b/locales/de_DE.qm differ diff --git a/locales/de_DE.ts b/locales/de_DE.ts index e0fad9a..1582fcc 100644 --- a/locales/de_DE.ts +++ b/locales/de_DE.ts @@ -2,7 +2,7 @@ - Add_Server_wizard + AddRWAHostWizard Couldn't connect to the specified host! Konnte nicht zum Server verbinden! @@ -159,7 +159,7 @@ Starting a remote support session on host '%0' using the new session object. - Starte eine Fernwartungssitzung auf Server '%0' mithilfe des neuen Sitzungsobjektes. + Starte eine Fernwartungssitzung auf Server '%0' mithilfe des neuen Sitzungsobjektes. diff --git a/locales/es_ES.ts b/locales/es_ES.ts index 844b883..f69359e 100644 --- a/locales/es_ES.ts +++ b/locales/es_ES.ts @@ -2,7 +2,7 @@ - Add_Server_wizard + AddRWAHostWizard Couldn't connect to the specified host! diff --git a/locales/main_en.ts b/locales/main_en.ts index 35aafff..7e033d1 100644 --- a/locales/main_en.ts +++ b/locales/main_en.ts @@ -2,7 +2,7 @@ - Add_Server_wizard + AddRWAHostWizard Couldn't connect to the specified host! -- cgit v1.2.3 From da36a2bcd7d692224f21e74ea7eafa63fa387e28 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 01:04:15 +0000 Subject: =?UTF-8?q?.gitlab-ci.yml=20hinzuf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..1bc0893 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,3 @@ +# This file is a template, and might need editing before it works on your project. +include: + template: Jobs/Code-Quality.gitlab-ci.yml -- cgit v1.2.3 From fd5e881fdee35d21fd3e0728e5b927d04e64f459 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 04:40:44 +0200 Subject: Update .gitlab-ci.yml to use darkmattercoder's docker image --- .gitlab-ci.yml | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1bc0893..602b2e3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,38 @@ -# This file is a template, and might need editing before it works on your project. -include: - template: Jobs/Code-Quality.gitlab-ci.yml +image: darkmattercoder/qt-build:latest +#entrypoint: [""] + +stages: + - Build + - Run + +Build:Code: + stage: Build + script: + - apt update && apt -y install make autoconf + - qmake rwa-support-desktopapp.pro + - make + artifacts: + paths: + - rwa-support-desktopapp + expire_in: 2 weeks + +# Disabled because running the application would give an error +# since there are no X.Org server, Wayland or other display servers available +# Run:Code: +# stage: Run +# script: +# - echo "All files in git repo + artifact 'rwa-support-desktopapp':" +# - find +# - echo "Executing rwa-support-desktopapp" +# - ./rwa-support-desktopapp +# dependencies: +# - Build:Code + +# To be implemented. +# Test:Code: +# stage: Test +# script: +# - echo "All files in git repo + artifact 'rwa-support-desktopapp':" +# - find +# dependencies: +# - Build:Code -- cgit v1.2.3