From 116fa6777b400261f71aa9126e956febe09d37f2 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 14 May 2023 21:11:19 +0800 Subject: [PATCH] added logic to the connect to vpn button --- client/3rd/qtkeychain | 2 +- client/amnezia_application.cpp | 8 +- client/images/connectionOff.svg | 18 ++++ client/images/connectionOn.svg | 17 ++++ client/images/connectionProgress.svg | 30 +++++++ client/protocols/openvpnovercloakprotocol.cpp | 4 +- client/protocols/openvpnprotocol.cpp | 20 ++--- client/protocols/shadowsocksvpnprotocol.cpp | 4 +- client/protocols/vpnprotocol.cpp | 34 +++---- client/protocols/vpnprotocol.h | 40 +++++++-- client/protocols/wireguardprotocol.cpp | 14 +-- client/resources.qrc | 3 + .../ui/controllers/connectionController.cpp | 10 ++- client/ui/controllers/connectionController.h | 6 +- client/ui/notificationhandler.cpp | 8 +- client/ui/notificationhandler.h | 2 +- client/ui/pages_logic/SitesLogic.cpp | 4 +- client/ui/pages_logic/VpnLogic.cpp | 22 ++--- client/ui/pages_logic/VpnLogic.h | 2 +- client/ui/qml/Components/ConnectButton.qml | 88 +++++++++++++++++-- client/ui/qml/Pages2/PageHome.qml | 2 - client/ui/qml/Pages2/PageStart.qml | 10 +-- client/ui/systemtray_notificationhandler.cpp | 22 ++--- client/ui/systemtray_notificationhandler.h | 4 +- client/ui/uilogic.cpp | 6 +- client/vpnconnection.cpp | 32 +++---- client/vpnconnection.h | 6 +- 27 files changed, 293 insertions(+), 125 deletions(-) create mode 100644 client/images/connectionOff.svg create mode 100644 client/images/connectionOn.svg create mode 100644 client/images/connectionProgress.svg diff --git a/client/3rd/qtkeychain b/client/3rd/qtkeychain index c6f0b663..8bbaa6d8 160000 --- a/client/3rd/qtkeychain +++ b/client/3rd/qtkeychain @@ -1 +1 @@ -Subproject commit c6f0b66318f8da6917fb4681103f7303b1836194 +Subproject commit 8bbaa6d8302cf0747d9786ace4dd13c7fb746502 diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 6fadcabb..a8231fce 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -109,6 +109,9 @@ void AmneziaApplication::init() m_vpnConnection.reset(new VpnConnection(m_settings, m_configurator)); m_connectionController.reset(new ConnectionController(m_serversModel, m_containersModel)); + + connect(m_vpnConnection.get(), &VpnConnection::connectionStateChanged, + m_connectionController.get(), &ConnectionController::connectionStateChanged); connect(m_connectionController.get(), &ConnectionController::connectToVpn, m_vpnConnection.get(), &VpnConnection::connectToVpn, Qt::QueuedConnection); connect(m_connectionController.get(), &ConnectionController::disconnectFromVpn, @@ -156,7 +159,6 @@ void AmneziaApplication::init() void AmneziaApplication::registerTypes() { - qRegisterMetaType("VpnProtocol::VpnConnectionState"); qRegisterMetaType("ServerCredentials"); qRegisterMetaType("DockerContainer"); @@ -164,7 +166,6 @@ void AmneziaApplication::registerTypes() qRegisterMetaType("Proto"); qRegisterMetaType("ServiceType"); qRegisterMetaType("Page"); - qRegisterMetaType("ConnectionState"); qRegisterMetaType("PageProtocolLogicBase *"); @@ -181,6 +182,9 @@ void AmneziaApplication::registerTypes() m_protocolProps = new ProtocolProps; qmlRegisterSingletonInstance("ProtocolProps", 1, 0, "ProtocolProps", m_protocolProps); + + // + Vpn::declareQmlVpnConnectionStateEnum(); } void AmneziaApplication::loadFonts() diff --git a/client/images/connectionOff.svg b/client/images/connectionOff.svg new file mode 100644 index 00000000..27905ff9 --- /dev/null +++ b/client/images/connectionOff.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/images/connectionOn.svg b/client/images/connectionOn.svg new file mode 100644 index 00000000..ef317622 --- /dev/null +++ b/client/images/connectionOn.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/client/images/connectionProgress.svg b/client/images/connectionProgress.svg new file mode 100644 index 00000000..8c4024c9 --- /dev/null +++ b/client/images/connectionProgress.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/protocols/openvpnovercloakprotocol.cpp b/client/protocols/openvpnovercloakprotocol.cpp index 55939895..52bcae4b 100644 --- a/client/protocols/openvpnovercloakprotocol.cpp +++ b/client/protocols/openvpnovercloakprotocol.cpp @@ -66,7 +66,7 @@ ErrorCode OpenVpnOverCloakProtocol::start() m_errorHandlerConnection = connect(&m_ckProcess, QOverload::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){ qDebug().noquote() << "OpenVpnOverCloakProtocol finished, exitCode, exiStatus" << exitCode << exitStatus; - setConnectionState(VpnProtocol::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); if (exitStatus != QProcess::NormalExit){ emit protocolError(amnezia::ErrorCode::CloakExecutableCrashed); stop(); @@ -81,7 +81,7 @@ ErrorCode OpenVpnOverCloakProtocol::start() m_ckProcess.waitForStarted(); if (m_ckProcess.state() == QProcess::ProcessState::Running) { - setConnectionState(VpnConnectionState::Connecting); + setConnectionState(Vpn::ConnectionState::Connecting); return OpenVpnProtocol::start(); } diff --git a/client/protocols/openvpnprotocol.cpp b/client/protocols/openvpnprotocol.cpp index 150e84be..273d7b76 100644 --- a/client/protocols/openvpnprotocol.cpp +++ b/client/protocols/openvpnprotocol.cpp @@ -45,16 +45,16 @@ void OpenVpnProtocol::stop() // TODO: need refactoring // sendTermSignal() will even return true while server connected ??? - if ((m_connectionState == VpnProtocol::Preparing) || - (m_connectionState == VpnProtocol::Connecting) || - (m_connectionState == VpnProtocol::Connected) || - (m_connectionState == VpnProtocol::Reconnecting)) { + if ((m_connectionState == Vpn::ConnectionState::Preparing) || + (m_connectionState == Vpn::ConnectionState::Connecting) || + (m_connectionState == Vpn::ConnectionState::Connected) || + (m_connectionState == Vpn::ConnectionState::Reconnecting)) { if (!sendTermSignal()) { killOpenVpnProcess(); } m_managementServer.stop(); qApp->processEvents(); - setConnectionState(VpnProtocol::Disconnecting); + setConnectionState(Vpn::ConnectionState::Disconnecting); } } @@ -175,7 +175,7 @@ ErrorCode OpenVpnProtocol::start() return lastError(); } - setConnectionState(VpnConnectionState::Connecting); + setConnectionState(Vpn::ConnectionState::Connecting); m_openVpnProcess = IpcClient::CreatePrivilegedProcess(); @@ -208,7 +208,7 @@ ErrorCode OpenVpnProtocol::start() }); connect(m_openVpnProcess.data(), &PrivilegedProcess::finished, this, [&]() { - setConnectionState(VpnConnectionState::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); }); m_openVpnProcess->start(); @@ -256,14 +256,14 @@ void OpenVpnProtocol::onReadyReadDataFromManagementServer() if (line.contains("CONNECTED,SUCCESS")) { sendByteCount(); stopTimeoutTimer(); - setConnectionState(VpnProtocol::Connected); + setConnectionState(Vpn::ConnectionState::Connected); continue; } else if (line.contains("EXITING,SIGTER")) { //openVpnStateSigTermHandler(); - setConnectionState(VpnProtocol::Disconnecting); + setConnectionState(Vpn::ConnectionState::Disconnecting); continue; } else if (line.contains("RECONNECTING")) { - setConnectionState(VpnProtocol::Reconnecting); + setConnectionState(Vpn::ConnectionState::Reconnecting); continue; } } diff --git a/client/protocols/shadowsocksvpnprotocol.cpp b/client/protocols/shadowsocksvpnprotocol.cpp index 82ae08b8..0ffc2768 100644 --- a/client/protocols/shadowsocksvpnprotocol.cpp +++ b/client/protocols/shadowsocksvpnprotocol.cpp @@ -66,7 +66,7 @@ ErrorCode ShadowSocksVpnProtocol::start() connect(&m_ssProcess, QOverload::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){ qDebug().noquote() << "ShadowSocksVpnProtocol finished, exitCode, exiStatus" << exitCode << exitStatus; - setConnectionState(VpnProtocol::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); if (exitStatus != QProcess::NormalExit){ emit protocolError(amnezia::ErrorCode::ShadowSocksExecutableCrashed); stop(); @@ -81,7 +81,7 @@ ErrorCode ShadowSocksVpnProtocol::start() m_ssProcess.waitForStarted(); if (m_ssProcess.state() == QProcess::ProcessState::Running) { - setConnectionState(VpnConnectionState::Connecting); + setConnectionState(Vpn::ConnectionState::Connecting); return OpenVpnProtocol::start(); } diff --git a/client/protocols/vpnprotocol.cpp b/client/protocols/vpnprotocol.cpp index a8f392e9..841d307c 100644 --- a/client/protocols/vpnprotocol.cpp +++ b/client/protocols/vpnprotocol.cpp @@ -18,7 +18,7 @@ VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject* parent) : QObject(parent), - m_connectionState(VpnConnectionState::Unknown), + m_connectionState(Vpn::ConnectionState::Unknown), m_rawConfig(configuration), m_timeoutTimer(new QTimer(this)), m_receivedBytes(0), @@ -32,7 +32,7 @@ void VpnProtocol::setLastError(ErrorCode lastError) { m_lastError = lastError; if (lastError){ - setConnectionState(VpnConnectionState::Error); + setConnectionState(Vpn::ConnectionState::Error); } qCritical().noquote() << "VpnProtocol error, code" << m_lastError << errorString(m_lastError); } @@ -60,7 +60,7 @@ void VpnProtocol::stopTimeoutTimer() m_timeoutTimer->stop(); } -VpnProtocol::VpnConnectionState VpnProtocol::connectionState() const +Vpn::ConnectionState VpnProtocol::connectionState() const { return m_connectionState; } @@ -76,19 +76,19 @@ void VpnProtocol::setBytesChanged(quint64 receivedBytes, quint64 sentBytes) m_sentBytes = sentBytes; } -void VpnProtocol::setConnectionState(VpnProtocol::VpnConnectionState state) +void VpnProtocol::setConnectionState(Vpn::ConnectionState state) { qDebug() << "VpnProtocol::setConnectionState" << textConnectionState(state); if (m_connectionState == state) { return; } - if (m_connectionState == VpnConnectionState::Disconnected && state == VpnConnectionState::Disconnecting) { + if (m_connectionState == Vpn::ConnectionState::Disconnected && state == Vpn::ConnectionState::Disconnecting) { return; } m_connectionState = state; - if (m_connectionState == VpnConnectionState::Disconnected) { + if (m_connectionState == Vpn::ConnectionState::Disconnected) { m_receivedBytes = 0; m_sentBytes = 0; } @@ -124,17 +124,17 @@ QString VpnProtocol::routeGateway() const return m_routeGateway; } -QString VpnProtocol::textConnectionState(VpnConnectionState connectionState) +QString VpnProtocol::textConnectionState(Vpn::ConnectionState connectionState) { switch (connectionState) { - case VpnConnectionState::Unknown: return tr("Unknown"); - case VpnConnectionState::Disconnected: return tr("Disconnected"); - case VpnConnectionState::Preparing: return tr("Preparing"); - case VpnConnectionState::Connecting: return tr("Connecting..."); - case VpnConnectionState::Connected: return tr("Connected"); - case VpnConnectionState::Disconnecting: return tr("Disconnecting..."); - case VpnConnectionState::Reconnecting: return tr("Reconnecting..."); - case VpnConnectionState::Error: return tr("Error"); + case Vpn::ConnectionState::Unknown: return tr("Unknown"); + case Vpn::ConnectionState::Disconnected: return tr("Disconnected"); + case Vpn::ConnectionState::Preparing: return tr("Preparing"); + case Vpn::ConnectionState::Connecting: return tr("Connecting..."); + case Vpn::ConnectionState::Connected: return tr("Connected"); + case Vpn::ConnectionState::Disconnecting: return tr("Disconnecting..."); + case Vpn::ConnectionState::Reconnecting: return tr("Reconnecting..."); + case Vpn::ConnectionState::Error: return tr("Error"); default: ; } @@ -149,10 +149,10 @@ QString VpnProtocol::textConnectionState() const bool VpnProtocol::isConnected() const { - return m_connectionState == VpnConnectionState::Connected; + return m_connectionState == Vpn::ConnectionState::Connected; } bool VpnProtocol::isDisconnected() const { - return m_connectionState == VpnConnectionState::Disconnected; + return m_connectionState == Vpn::ConnectionState::Disconnected; } diff --git a/client/protocols/vpnprotocol.h b/client/protocols/vpnprotocol.h index 4b6876d5..bb71a5de 100644 --- a/client/protocols/vpnprotocol.h +++ b/client/protocols/vpnprotocol.h @@ -12,6 +12,33 @@ using namespace amnezia; class QTimer; +//todo change name +namespace Vpn +{ + Q_NAMESPACE + enum ConnectionState { + Unknown, + Disconnected, + Preparing, + Connecting, + Connected, + Disconnecting, + Reconnecting, + Error + }; + Q_ENUM_NS(ConnectionState) + + static void declareQmlVpnConnectionStateEnum() { + qmlRegisterUncreatableMetaObject( + Vpn::staticMetaObject, + "ConnectionState", + 1, 0, + "ConnectionState", + "Error: only enums" + ); + } +} + class VpnProtocol : public QObject { Q_OBJECT @@ -20,10 +47,7 @@ public: explicit VpnProtocol(const QJsonObject& configuration, QObject* parent = nullptr); virtual ~VpnProtocol() override = default; - enum VpnConnectionState {Unknown, Disconnected, Preparing, Connecting, Connected, Disconnecting, Reconnecting, Error}; - Q_ENUM(VpnConnectionState) - - static QString textConnectionState(VpnConnectionState connectionState); + static QString textConnectionState(Vpn::ConnectionState connectionState); virtual ErrorCode prepare() { return ErrorCode::NoError; } @@ -32,7 +56,7 @@ public: virtual ErrorCode start() = 0; virtual void stop() = 0; - VpnConnectionState connectionState() const; + Vpn::ConnectionState connectionState() const; ErrorCode lastError() const; QString textConnectionState() const; void setLastError(ErrorCode lastError); @@ -44,7 +68,7 @@ public: signals: void bytesChanged(quint64 receivedBytes, quint64 sentBytes); - void connectionStateChanged(VpnProtocol::VpnConnectionState state); + void connectionStateChanged(Vpn::ConnectionState state); void timeoutTimerEvent(); void protocolError(amnezia::ErrorCode e); @@ -52,13 +76,13 @@ public slots: virtual void onTimeout(); // todo: remove? void setBytesChanged(quint64 receivedBytes, quint64 sentBytes); - void setConnectionState(VpnProtocol::VpnConnectionState state); + void setConnectionState(Vpn::ConnectionState state); protected: void startTimeoutTimer(); void stopTimeoutTimer(); - VpnConnectionState m_connectionState; + Vpn::ConnectionState m_connectionState; QString m_routeGateway; QString m_vpnLocalAddress; diff --git a/client/protocols/wireguardprotocol.cpp b/client/protocols/wireguardprotocol.cpp index 666bf80d..4f66f5a1 100644 --- a/client/protocols/wireguardprotocol.cpp +++ b/client/protocols/wireguardprotocol.cpp @@ -51,7 +51,7 @@ void WireguardProtocol::stop() connect(m_wireguardStopProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) { qDebug() << "WireguardProtocol::WireguardProtocol Stop errorOccurred" << error; - setConnectionState(VpnConnectionState::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); }); connect(m_wireguardStopProcess.data(), &PrivilegedProcess::stateChanged, this, [this](QProcess::ProcessState newState) { @@ -62,12 +62,12 @@ void WireguardProtocol::stop() if (IpcClient::Interface()) { QRemoteObjectPendingReply result = IpcClient::Interface()->isWireguardRunning(); if (result.returnValue()) { - setConnectionState(VpnProtocol::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); return; } } else { qCritical() << "IPC client not initialized"; - setConnectionState(VpnProtocol::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); return; } #endif @@ -75,7 +75,7 @@ void WireguardProtocol::stop() m_wireguardStopProcess->start(); m_wireguardStopProcess->waitForFinished(10000); - setConnectionState(VpnProtocol::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); #endif } @@ -156,7 +156,7 @@ ErrorCode WireguardProtocol::start() return lastError(); } - setConnectionState(VpnConnectionState::Connecting); + setConnectionState(Vpn::ConnectionState::Connecting); m_wireguardStartProcess = IpcClient::CreatePrivilegedProcess(); @@ -179,7 +179,7 @@ ErrorCode WireguardProtocol::start() connect(m_wireguardStartProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) { qDebug() << "WireguardProtocol::WireguardProtocol errorOccurred" << error; - setConnectionState(VpnConnectionState::Disconnected); + setConnectionState(Vpn::ConnectionState::Disconnected); }); connect(m_wireguardStartProcess.data(), &PrivilegedProcess::stateChanged, this, [this](QProcess::ProcessState newState) { @@ -187,7 +187,7 @@ ErrorCode WireguardProtocol::start() }); connect(m_wireguardStartProcess.data(), &PrivilegedProcess::finished, this, [this]() { - setConnectionState(VpnConnectionState::Connected); + setConnectionState(Vpn::ConnectionState::Connected); }); connect(m_wireguardStartProcess.data(), &PrivilegedProcess::readyRead, this, [this]() { diff --git a/client/resources.qrc b/client/resources.qrc index 1ea7bf38..f75c8132 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -223,5 +223,8 @@ ui/qml/Controls2/Header2Type.qml images/controls/plus.svg ui/qml/Components/ConnectButton.qml + images/connectionProgress.svg + images/connectionOff.svg + images/connectionOn.svg diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 41dbed64..ce52a2c8 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -11,13 +11,18 @@ ConnectionController::ConnectionController(const QSharedPointer &s bool ConnectionController::onConnectionButtonClicked() { - if (!isConnected) { + if (!isConnected()) { openVpnConnection(); } else { closeVpnConnection(); } } +bool ConnectionController::isConnected() +{ + return m_isConnected; +} + bool ConnectionController::openVpnConnection() { int serverIndex = m_serversModel->getDefaultServerIndex(); @@ -33,7 +38,7 @@ bool ConnectionController::openVpnConnection() //todo error handling qApp->processEvents(); emit connectToVpn(serverIndex, credentials, container, containerConfig); - isConnected = true; + m_isConnected = true; // int serverIndex = m_settings->defaultServerIndex(); @@ -67,5 +72,6 @@ bool ConnectionController::openVpnConnection() bool ConnectionController::closeVpnConnection() { emit disconnectFromVpn(); + m_isConnected = false; } diff --git a/client/ui/controllers/connectionController.h b/client/ui/controllers/connectionController.h index 125e9204..8282a582 100644 --- a/client/ui/controllers/connectionController.h +++ b/client/ui/controllers/connectionController.h @@ -3,6 +3,7 @@ #include "ui/models/servers_model.h" #include "ui/models/containers_model.h" +#include "protocols/vpnprotocol.h" class ConnectionController : public QObject { @@ -16,9 +17,12 @@ public: public slots: bool onConnectionButtonClicked(); + bool isConnected(); + signals: void connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig); void disconnectFromVpn(); + void connectionStateChanged(Vpn::ConnectionState state); private: bool openVpnConnection(); @@ -27,7 +31,7 @@ private: QSharedPointer m_serversModel; QSharedPointer m_containersModel; - bool isConnected = false; + bool m_isConnected = false; }; #endif // CONNECTIONCONTROLLER_H diff --git a/client/ui/notificationhandler.cpp b/client/ui/notificationhandler.cpp index 779569d7..f932eb17 100644 --- a/client/ui/notificationhandler.cpp +++ b/client/ui/notificationhandler.cpp @@ -52,9 +52,9 @@ NotificationHandler::~NotificationHandler() { s_instance = nullptr; } -void NotificationHandler::setConnectionState(VpnProtocol::VpnConnectionState state) +void NotificationHandler::setConnectionState(Vpn::ConnectionState state) { - if (state != VpnProtocol::Connected && state != VpnProtocol::Disconnected) { + if (state != Vpn::ConnectionState::Connected && state != Vpn::ConnectionState::Disconnected) { return; } @@ -62,14 +62,14 @@ void NotificationHandler::setConnectionState(VpnProtocol::VpnConnectionState sta QString message; switch (state) { - case VpnProtocol::VpnConnectionState::Connected: + case Vpn::ConnectionState::Connected: m_connected = true; title = tr("AmneziaVPN"); message = tr("VPN Connected"); break; - case VpnProtocol::VpnConnectionState::Disconnected: + case Vpn::ConnectionState::Disconnected: if (m_connected) { m_connected = false; title = tr("AmneziaVPN"); diff --git a/client/ui/notificationhandler.h b/client/ui/notificationhandler.h index b87e9575..9a2182de 100644 --- a/client/ui/notificationhandler.h +++ b/client/ui/notificationhandler.h @@ -31,7 +31,7 @@ public: void messageClickHandle(); public slots: - virtual void setConnectionState(VpnProtocol::VpnConnectionState state); + virtual void setConnectionState(Vpn::ConnectionState state); signals: void notificationShown(const QString& title, const QString& message); diff --git a/client/ui/pages_logic/SitesLogic.cpp b/client/ui/pages_logic/SitesLogic.cpp index 17357073..bf926e56 100644 --- a/client/ui/pages_logic/SitesLogic.cpp +++ b/client/ui/pages_logic/SitesLogic.cpp @@ -116,14 +116,14 @@ void SitesLogic::onPushButtonSitesDeleteClicked(QStringList items) if (!ok || row < 0 || row >= siteModel->rowCount()) return; sites.append(siteModel->data(row, 0).toString()); - if (uiLogic()->m_vpnConnection->connectionState() == VpnProtocol::Connected) { + if (uiLogic()->m_vpnConnection->connectionState() == Vpn::ConnectionState::Connected) { ips.append(siteModel->data(row, 1).toString()); } } m_settings->removeVpnSites(mode, sites); - if (uiLogic()->m_vpnConnection->connectionState() == VpnProtocol::Connected) { + if (uiLogic()->m_vpnConnection->connectionState() == Vpn::ConnectionState::Connected) { uiLogic()->m_vpnConnection->deleteRoutes(ips); uiLogic()->m_vpnConnection->flushDns(); } diff --git a/client/ui/pages_logic/VpnLogic.cpp b/client/ui/pages_logic/VpnLogic.cpp index d3df1a08..4db54244 100644 --- a/client/ui/pages_logic/VpnLogic.cpp +++ b/client/ui/pages_logic/VpnLogic.cpp @@ -42,7 +42,7 @@ VpnLogic::VpnLogic(UiLogic *logic, QObject *parent): }); } else { - onConnectionStateChanged(VpnProtocol::Disconnected); + onConnectionStateChanged(Vpn::ConnectionState::Disconnected); } } @@ -119,7 +119,7 @@ void VpnLogic::onBytesChanged(quint64 receivedData, quint64 sentData) set_labelSpeedSentText(VpnConnection::bytesPerSecToText(sentData)); } -void VpnLogic::onConnectionStateChanged(VpnProtocol::VpnConnectionState state) +void VpnLogic::onConnectionStateChanged(Vpn::ConnectionState state) { qDebug() << "VpnLogic::onConnectionStateChanged" << VpnProtocol::textConnectionState(state); if (uiLogic()->m_vpnConnection == NULL) { @@ -134,50 +134,50 @@ void VpnLogic::onConnectionStateChanged(VpnProtocol::VpnConnectionState state) set_labelStateText(VpnProtocol::textConnectionState(state)); switch (state) { - case VpnProtocol::Disconnected: + case Vpn::ConnectionState::Disconnected: onBytesChanged(0,0); pbConnectChecked = false; pbConnectEnabled = true; pbConnectVisible = true; rbModeEnabled = true; break; - case VpnProtocol::Preparing: + case Vpn::ConnectionState::Preparing: pbConnectChecked = true; pbConnectEnabled = false; pbConnectVisible = false; rbModeEnabled = false; break; - case VpnProtocol::Connecting: + case Vpn::ConnectionState::Connecting: pbConnectChecked = true; pbConnectEnabled = false; pbConnectVisible = false; rbModeEnabled = false; break; - case VpnProtocol::Connected: + case Vpn::ConnectionState::Connected: pbConnectChecked = true; pbConnectEnabled = true; pbConnectVisible = true; rbModeEnabled = false; break; - case VpnProtocol::Disconnecting: + case Vpn::ConnectionState::Disconnecting: pbConnectChecked = false; pbConnectEnabled = false; pbConnectVisible = false; rbModeEnabled = false; break; - case VpnProtocol::Reconnecting: + case Vpn::ConnectionState::Reconnecting: pbConnectChecked = true; pbConnectEnabled = true; pbConnectVisible = false; rbModeEnabled = false; break; - case VpnProtocol::Error: + case Vpn::ConnectionState::Error: pbConnectChecked = false; pbConnectEnabled = true; pbConnectVisible = true; rbModeEnabled = true; break; - case VpnProtocol::Unknown: + case Vpn::ConnectionState::Unknown: pbConnectChecked = false; pbConnectEnabled = true; pbConnectVisible = true; @@ -241,6 +241,6 @@ void VpnLogic::onConnectWorker(int serverIndex, const ServerCredentials &credent void VpnLogic::onDisconnect() { - onConnectionStateChanged(VpnProtocol::Disconnected); + onConnectionStateChanged(Vpn::ConnectionState::Disconnected); emit disconnectFromVpn(); } diff --git a/client/ui/pages_logic/VpnLogic.h b/client/ui/pages_logic/VpnLogic.h index f7b21be2..a0f7763b 100644 --- a/client/ui/pages_logic/VpnLogic.h +++ b/client/ui/pages_logic/VpnLogic.h @@ -58,7 +58,7 @@ public slots: void onDisconnect(); void onBytesChanged(quint64 receivedBytes, quint64 sentBytes); - void onConnectionStateChanged(VpnProtocol::VpnConnectionState state); + void onConnectionStateChanged(Vpn::ConnectionState state); void onVpnProtocolError(amnezia::ErrorCode errorCode); signals: diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index 5457cf55..bce652d8 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -2,21 +2,40 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import ConnectionState 1.0 + Button { id: root - implicitHeight: 190 - implicitWidth: 190 + property var isConnected: ConnectionController.isConnected - background: Rectangle { - id: background + text: "Подключиться" - radius: parent.width * 0.5 +// implicitHeight: 190 +// implicitWidth: 190 - color: "transparent" +// color: "transparent" - border.width: 2 - border.color: "white" + background: Image { + id: border + + source: connectionProccess.running ? "/images/connectionProgress.svg" : + ConnectionController.isConnected() ? "/images/connectionOff.svg" : "/images/connectionOn.svg" + + RotationAnimator { + id: connectionProccess + + target: border + running: false + from: 0 + to: 360 + loops: Animation.Infinite + duration: 1250 + } + + Behavior on source { + PropertyAnimation { duration: 200 } + } } contentItem: Text { @@ -34,7 +53,58 @@ Button { } onClicked: { - background.color = "red" ConnectionController.onConnectionButtonClicked() + console.log(connectionProccess.from) + } + + Connections { + target: ConnectionController + function onConnectionStateChanged(state) { + switch(state) { + case ConnectionState.Unknown: { + console.log("Unknown") + break + } + case ConnectionState.Disconnected: { + console.log("Disconnected") + connectionProccess.running = false + root.text = "Подключиться" + break + } + case ConnectionState.Preparing: { + console.log("Preparing") + break + } + case ConnectionState.Connecting: { + console.log("Connecting") + connectionProccess.running = true + root.text = "Подключение..." + break + } + case ConnectionState.Connected: { + console.log("Connected") + connectionProccess.running = false + root.text = "Подключено" + break + } + case ConnectionState.Disconnecting: { + console.log("Disconnecting") + connectionProccess.running = true + root.text = "Отключение..." + break + } + case ConnectionState.Reconnecting: { + console.log("Reconnecting") + connectionProccess.running = true + root.text = "Переподключение..." + break + } + case ConnectionState.Error: { + console.log("Error") + connectionProccess.running = false + break + } + } + } } } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 40eba148..5dd0aaae 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -27,8 +27,6 @@ PageBase { ConnectButton { anchors.centerIn: parent - - text: "Подключиться" } Rectangle { diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index 9e94ed28..220c6f19 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -23,14 +23,8 @@ PageBase { anchors.left: parent.left anchors.bottom: tabBar.top - width: { - console.log(parent.width) - return parent.width - } - height: { - console.log(root.height - tabBar.implicitHeight) - return root.height - tabBar.implicitHeight - } + width: parent.width + height: root.height - tabBar.implicitHeight PageHome { } diff --git a/client/ui/systemtray_notificationhandler.cpp b/client/ui/systemtray_notificationhandler.cpp index e142caf5..25ff9f6c 100644 --- a/client/ui/systemtray_notificationhandler.cpp +++ b/client/ui/systemtray_notificationhandler.cpp @@ -45,13 +45,13 @@ SystemTrayNotificationHandler::SystemTrayNotificationHandler(QObject* parent) : }); m_systemTrayIcon.setContextMenu(&m_menu); - setTrayState(VpnProtocol::Disconnected); + setTrayState(Vpn::ConnectionState::Disconnected); } SystemTrayNotificationHandler::~SystemTrayNotificationHandler() { } -void SystemTrayNotificationHandler::setConnectionState(VpnProtocol::VpnConnectionState state) +void SystemTrayNotificationHandler::setConnectionState(Vpn::ConnectionState state) { setTrayState(state); NotificationHandler::setConnectionState(state); @@ -73,47 +73,47 @@ void SystemTrayNotificationHandler::onTrayActivated(QSystemTrayIcon::ActivationR #endif } -void SystemTrayNotificationHandler::setTrayState(VpnProtocol::VpnConnectionState state) +void SystemTrayNotificationHandler::setTrayState(Vpn::ConnectionState state) { QString resourcesPath = ":/images/tray/%1"; switch (state) { - case VpnProtocol::Disconnected: + case Vpn::ConnectionState::Disconnected: setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName)); m_trayActionConnect->setEnabled(true); m_trayActionDisconnect->setEnabled(false); break; - case VpnProtocol::Preparing: + case Vpn::ConnectionState::Preparing: setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName)); m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); break; - case VpnProtocol::Connecting: + case Vpn::ConnectionState::Connecting: setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName)); m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); break; - case VpnProtocol::Connected: + case Vpn::ConnectionState::Connected: setTrayIcon(QString(resourcesPath).arg(ConnectedTrayIconName)); m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); break; - case VpnProtocol::Disconnecting: + case Vpn::ConnectionState::Disconnecting: setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName)); m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); break; - case VpnProtocol::Reconnecting: + case Vpn::ConnectionState::Reconnecting: setTrayIcon(QString(resourcesPath).arg(DisconnectedTrayIconName)); m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); break; - case VpnProtocol::Error: + case Vpn::ConnectionState::Error: setTrayIcon(QString(resourcesPath).arg(ErrorTrayIconName)); m_trayActionConnect->setEnabled(true); m_trayActionDisconnect->setEnabled(false); break; - case VpnProtocol::Unknown: + case Vpn::ConnectionState::Unknown: default: m_trayActionConnect->setEnabled(false); m_trayActionDisconnect->setEnabled(true); diff --git a/client/ui/systemtray_notificationhandler.h b/client/ui/systemtray_notificationhandler.h index 46563bde..96134f14 100644 --- a/client/ui/systemtray_notificationhandler.h +++ b/client/ui/systemtray_notificationhandler.h @@ -17,7 +17,7 @@ public: explicit SystemTrayNotificationHandler(QObject* parent); ~SystemTrayNotificationHandler(); - void setConnectionState(VpnProtocol::VpnConnectionState state) override; + void setConnectionState(Vpn::ConnectionState state) override; protected: virtual void notify(Message type, const QString& title, @@ -26,7 +26,7 @@ protected: private: void showHideWindow(); - void setTrayState(VpnProtocol::VpnConnectionState state); + void setTrayState(Vpn::ConnectionState state); void onTrayActivated(QSystemTrayIcon::ActivationReason reason); void setTrayIcon(const QString &iconPath); diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index bb2f90b2..929d84d6 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -107,7 +107,7 @@ UiLogic::~UiLogic() emit hide(); #ifdef AMNEZIA_DESKTOP - if (m_vpnConnection->connectionState() != VpnProtocol::VpnConnectionState::Disconnected) { + if (m_vpnConnection->connectionState() != Vpn::ConnectionState::Disconnected) { m_vpnConnection->disconnectFromVpn(); for (int i = 0; i < 50; i++) { qApp->processEvents(QEventLoop::ExcludeUserInputEvents); @@ -131,13 +131,13 @@ void UiLogic::initializeUiLogic() #ifdef Q_OS_ANDROID connect(AndroidController::instance(), &AndroidController::initialized, [this](bool status, bool connected, const QDateTime& connectionDate) { if (connected) { - pageLogic()->onConnectionStateChanged(VpnProtocol::Connected); + pageLogic()->onConnectionStateChanged(Vpn::ConnectionState::Connected); m_vpnConnection->restoreConnection(); } }); if (!AndroidController::instance()->initialize(pageLogic())) { qCritical() << QString("Init failed") ; - emit VpnProtocol::Error; + emit Vpn::ConnectionState::Error; return; } #endif diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 57d20127..468a6d96 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -50,12 +50,12 @@ void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes) emit bytesChanged(receivedBytes, sentBytes); } -void VpnConnection::onConnectionStateChanged(VpnProtocol::VpnConnectionState state) +void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state) { #ifdef AMNEZIA_DESKTOP if (IpcClient::Interface()) { - if (state == VpnProtocol::Connected){ + if (state == Vpn::ConnectionState::Connected){ IpcClient::Interface()->resetIpStack(); IpcClient::Interface()->flushDns(); @@ -85,7 +85,7 @@ void VpnConnection::onConnectionStateChanged(VpnProtocol::VpnConnectionState sta } - else if (state == VpnProtocol::Error) { + else if (state == Vpn::ConnectionState::Error) { IpcClient::Interface()->flushDns(); if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { @@ -96,7 +96,7 @@ void VpnConnection::onConnectionStateChanged(VpnProtocol::VpnConnectionState sta #endif #ifdef Q_OS_IOS - if (state == VpnProtocol::Connected){ + if (state == Vpn::ConnectionState::Connected){ m_isIOSConnected = true; checkIOSStatus(); } @@ -179,7 +179,7 @@ QSharedPointer VpnConnection::vpnProtocol() const void VpnConnection::addRoutes(const QStringList &ips) { #ifdef AMNEZIA_DESKTOP - if (connectionState() == VpnProtocol::Connected && IpcClient::Interface()) { + if (connectionState() == Vpn::ConnectionState::Connected && IpcClient::Interface()) { if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), ips); } @@ -193,7 +193,7 @@ void VpnConnection::addRoutes(const QStringList &ips) void VpnConnection::deleteRoutes(const QStringList &ips) { #ifdef AMNEZIA_DESKTOP - if (connectionState() == VpnProtocol::Connected && IpcClient::Interface()) { + if (connectionState() == Vpn::ConnectionState::Connected && IpcClient::Interface()) { if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { IpcClient::Interface()->routeDeleteList(vpnProtocol()->vpnGateway(), ips); } @@ -319,14 +319,14 @@ void VpnConnection::connectToVpn(int serverIndex, if (!IpcClient::init(m_IpcClient)) { qWarning() << "Error occurred when init IPC client"; emit serviceIsNotReady(); - emit connectionStateChanged(VpnProtocol::Error); + emit connectionStateChanged(Vpn::ConnectionState::Error); return; } } #endif m_remoteAddress = credentials.hostName; - emit connectionStateChanged(VpnProtocol::Connecting); + emit connectionStateChanged(Vpn::ConnectionState::Connecting); if (m_vpnProtocol) { disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); @@ -338,14 +338,14 @@ void VpnConnection::connectToVpn(int serverIndex, m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig); if (e) { - emit connectionStateChanged(VpnProtocol::Error); + emit connectionStateChanged(Vpn::ConnectionState::Error); return; } #if !defined (Q_OS_ANDROID) && !defined (Q_OS_IOS) m_vpnProtocol.reset(VpnProtocol::factory(container, m_vpnConfiguration)); if (!m_vpnProtocol) { - emit VpnProtocol::Error; + emit Vpn::ConnectionState::Error; return; } m_vpnProtocol->prepare(); @@ -362,7 +362,7 @@ void VpnConnection::connectToVpn(int serverIndex, // IOSVpnProtocol *iosVpnProtocol = new IOSVpnProtocol(proto, m_vpnConfiguration); if (!iosVpnProtocol->initialize()) { qDebug() << QString("Init failed") ; - emit VpnProtocol::Error; + emit Vpn::ConnectionState::Error; return; } m_vpnProtocol.reset(iosVpnProtocol); @@ -371,12 +371,12 @@ void VpnConnection::connectToVpn(int serverIndex, createProtocolConnections(); e = m_vpnProtocol.data()->start(); - if (e) emit VpnProtocol::Error; + if (e) emit Vpn::ConnectionState::Error; } void VpnConnection::createProtocolConnections() { connect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); - connect(m_vpnProtocol.data(), SIGNAL(connectionStateChanged(VpnProtocol::VpnConnectionState)), this, SLOT(onConnectionStateChanged(VpnProtocol::VpnConnectionState))); + connect(m_vpnProtocol.data(), SIGNAL(connectionStateChanged(Vpn::ConnectionState)), this, SLOT(onConnectionStateChanged(Vpn::ConnectionState))); connect(m_vpnProtocol.data(), SIGNAL(bytesChanged(quint64, quint64)), this, SLOT(onBytesChanged(quint64, quint64))); } @@ -433,7 +433,7 @@ void VpnConnection::disconnectFromVpn() #endif if (!m_vpnProtocol.data()) { - emit connectionStateChanged(VpnProtocol::Disconnected); + emit connectionStateChanged(Vpn::ConnectionState::Disconnected); #ifdef Q_OS_ANDROID AndroidController::instance()->stop(); #endif @@ -442,9 +442,9 @@ void VpnConnection::disconnectFromVpn() m_vpnProtocol.data()->stop(); } -VpnProtocol::VpnConnectionState VpnConnection::connectionState() +Vpn::ConnectionState VpnConnection::connectionState() { - if (!m_vpnProtocol) return VpnProtocol::Disconnected; + if (!m_vpnProtocol) return Vpn::ConnectionState::Disconnected; return m_vpnProtocol->connectionState(); } diff --git a/client/vpnconnection.h b/client/vpnconnection.h index 8dea7478..3a3a3047 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -54,7 +54,7 @@ public: bool isConnected() const; bool isDisconnected() const; - VpnProtocol::VpnConnectionState connectionState(); + Vpn::ConnectionState connectionState(); QSharedPointer vpnProtocol() const; void addRoutes(const QStringList &ips); @@ -76,14 +76,14 @@ public slots: signals: void bytesChanged(quint64 receivedBytes, quint64 sentBytes); - void connectionStateChanged(VpnProtocol::VpnConnectionState state); + void connectionStateChanged(Vpn::ConnectionState state); void vpnProtocolError(amnezia::ErrorCode error); void serviceIsNotReady(); protected slots: void onBytesChanged(quint64 receivedBytes, quint64 sentBytes); - void onConnectionStateChanged(VpnProtocol::VpnConnectionState state); + void onConnectionStateChanged(Vpn::ConnectionState state); #ifdef Q_OS_IOS void checkIOSStatus();