From c9bc8aa8c1ec48536b9be403dce19474992aee5b Mon Sep 17 00:00:00 2001 From: driftingsun Date: Fri, 4 Dec 2020 00:45:21 +0300 Subject: [PATCH] Refactoring --- README.md | 2 + client/AmniziaVPN.pro | 76 ++ client/amnizia-client.pro | 104 -- client/core/router.cpp | 13 +- client/core/router.h | 2 + client/{publib => }/debug.cpp | 4 - client/{publib => }/debug.h | 0 client/defines.h | 7 + client/images/app.icns | Bin 0 -> 45446 bytes client/images/{main.ico => app.ico} | Bin client/main.cpp | 47 +- client/platform_win/vpnclient.rc | 2 +- client/publib/macos_functions.mm | 37 - client/publib/winhelp.cpp | 261 ----- client/publib/winhelp.h | 26 - client/{res.qrc => resources.qrc} | 0 client/{publib => }/runguard.cpp | 0 client/{publib => }/runguard.h | 0 client/ui/customshadoweffect.cpp | 76 -- client/ui/customshadoweffect.h | 31 - client/ui/mainwindow.cpp | 29 +- client/ui/mainwindow.h | 15 +- client/ui/mainwindow_mac.ui | 1665 --------------------------- 23 files changed, 117 insertions(+), 2280 deletions(-) create mode 100644 README.md create mode 100644 client/AmniziaVPN.pro delete mode 100644 client/amnizia-client.pro rename client/{publib => }/debug.cpp (96%) rename client/{publib => }/debug.h (100%) create mode 100644 client/defines.h create mode 100644 client/images/app.icns rename client/images/{main.ico => app.ico} (100%) delete mode 100644 client/publib/macos_functions.mm delete mode 100644 client/publib/winhelp.cpp delete mode 100644 client/publib/winhelp.h rename client/{res.qrc => resources.qrc} (100%) rename client/{publib => }/runguard.cpp (100%) rename client/{publib => }/runguard.h (100%) delete mode 100644 client/ui/customshadoweffect.cpp delete mode 100644 client/ui/customshadoweffect.h delete mode 100644 client/ui/mainwindow_mac.ui diff --git a/README.md b/README.md new file mode 100644 index 00000000..d3e925b9 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Amnezia + diff --git a/client/AmniziaVPN.pro b/client/AmniziaVPN.pro new file mode 100644 index 00000000..b2acfea6 --- /dev/null +++ b/client/AmniziaVPN.pro @@ -0,0 +1,76 @@ +QT += widgets core gui network xml + +TARGET = AmneziaVPN +TEMPLATE = app +#CONFIG += console + +DEFINES += QT_DEPRECATED_WARNINGS + +HEADERS += \ + core/router.h \ + debug.h \ + defines.h \ + runguard.h \ + ui/Controls/SlidingStackedWidget.h \ + ui/mainwindow.h \ + +SOURCES += \ + core/router.cpp \ + debug.cpp \ + main.cpp \ + runguard.cpp \ + ui/Controls/SlidingStackedWidget.cpp \ + ui/mainwindow.cpp \ + + +FORMS += ui/mainwindow.ui + +RESOURCES += \ + resources.qrc + +TRANSLATIONS = \ + translations/amneziavpn.en.ts \ + translations/amneziavpn.ru.ts + +win32 { + +OTHER_FILES += platform_win/vpnclient.rc +RC_FILE = platform_win/vpnclient.rc + +HEADERS += +SOURCES += + +#CONFIG -= embed_manifest_exe +#DEFINES += _CRT_SECURE_NO_WARNINGS VPNCLIENT_TAPSIGNED +#QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" + +VERSION = 1.1.1.1 +QMAKE_TARGET_COMPANY = "AmneziaVPN" +QMAKE_TARGET_PRODUCT = "AmneziaVPN" + +#CONFIG -= embed_manifest_exe + +LIBS += \ + -luser32 \ + -lrasapi32 \ + -lshlwapi \ + -liphlpapi \ + -lws2_32 \ + -liphlpapi \ + -lgdi32 + +#LIBS += -L$$PWD/../../../../../../../OpenSSL-Win32/lib/ -llibcrypto + +#MT_PATH = \"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/bin/x64/mt.exe\" +#WIN_PWD = $$replace(PWD, /, \\) +#OUT_PWD_WIN = $$replace(OUT_PWD, /, \\) + +#!win32-g++: QMAKE_POST_LINK = "$$MT_PATH -manifest $$quote($$WIN_PWD\\platform_win\\$$basename(TARGET).exe.manifest) -outputresource:$$quote($$OUT_PWD_WIN\\$(DESTDIR_TARGET);1)" +# else: QMAKE_POST_LINK = "$$MT_PATH -manifest $$PWD/platform_win/$$basename(TARGET).exe.manifest -outputresource:$$OUT_PWD/$(DESTDIR_TARGET)" + +} + + +macx { +ICON = $$PWD/images/app.icns +} diff --git a/client/amnizia-client.pro b/client/amnizia-client.pro deleted file mode 100644 index e19c530d..00000000 --- a/client/amnizia-client.pro +++ /dev/null @@ -1,104 +0,0 @@ -QT += widgets core gui network xml - -TARGET = amnezia-client -TEMPLATE = app - -DEFINES += QT_DEPRECATED_WARNINGS - - -win32 { - -#win32-g++ { -# QMAKE_CXXFLAGS += -Werror -#} -#win32-msvc*{ -# QMAKE_CXXFLAGS += /WX -#} - -FORMS += ui/mainwindow.ui - -RESOURCES += \ - res.qrc - -OTHER_FILES += platform_win/vpnclient.rc -RC_FILE = platform_win/vpnclient.rc - -HEADERS += publib/winhelp.h - -SOURCES += publib/winhelp.cpp - -CONFIG -= embed_manifest_exe -DEFINES += _CRT_SECURE_NO_WARNINGS VPNCLIENT_TAPSIGNED -#QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" - -VERSION = 1.1.1.1 -QMAKE_TARGET_COMPANY = "AmneziaVPN" -QMAKE_TARGET_PRODUCT = "AmneziaVPN" - -CONFIG -= embed_manifest_exe - -LIBS += -luser32 \ - -lrasapi32 \ - -lshlwapi \ - -liphlpapi \ - -lws2_32 \ - -liphlpapi \ - -lgdi32 - - -MT_PATH = \"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/bin/x64/mt.exe\" -WIN_PWD = $$replace(PWD, /, \\) -OUT_PWD_WIN = $$replace(OUT_PWD, /, \\) - -!win32-g++: QMAKE_POST_LINK = "$$MT_PATH -manifest $$quote($$WIN_PWD\\platform_win\\$$basename(TARGET).exe.manifest) -outputresource:$$quote($$OUT_PWD_WIN\\$(DESTDIR_TARGET);1)" - else: QMAKE_POST_LINK = "$$MT_PATH -manifest $$PWD/platform_win/$$basename(TARGET).exe.manifest -outputresource:$$OUT_PWD/$(DESTDIR_TARGET)" -} - -macx { - -OBJECTIVE_HEADERS += -OBJECTIVE_SOURCES += publib/macos_functions.mm - -HEADERS += \ - -SOURCES += \ - -QMAKE_OBJECTIVE_CFLAGS += -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks - -FORMS += ui/mainwindow_mac.ui - -LIBS += -framework CoreServices -framework Foundation -framework AppKit - -RESOURCES += \ - res_mac.qrc - -ICON = images/main.icns -} - -SOURCES += main.cpp\ - core/router.cpp \ - publib/debug.cpp \ - publib/runguard.cpp \ - publib/winhelp.cpp \ - ui/Controls/SlidingStackedWidget.cpp \ - ui/mainwindow.cpp \ - ui/customshadoweffect.cpp - -HEADERS += ui/mainwindow.h \ - core/router.h \ - publib/debug.h \ - publib/runguard.h \ - publib/winhelp.h \ - ui/customshadoweffect.h \ - ui/Controls/SlidingStackedWidget.h - -FORMS += ui/mainwindow.ui - - -TRANSLATIONS = translations/amneziavpn.en.ts \ - translations/amneziavpn.ru.ts - - - -win32: LIBS += -L$$PWD/../../../../../../../OpenSSL-Win32/lib/ -llibcrypto - diff --git a/client/core/router.cpp b/client/core/router.cpp index 247138cd..0c230879 100644 --- a/client/core/router.cpp +++ b/client/core/router.cpp @@ -3,7 +3,6 @@ #include - Router &Router::Instance() { static Router s; @@ -12,6 +11,8 @@ Router &Router::Instance() bool Router::routeAdd(const QString &ip, const QString &gw, QString mask) { +#ifdef Q_OS_WIN + qDebug().noquote() << QString("ROUTE ADD: IP:%1 %2 GW %3") .arg(ip) .arg(mask) @@ -107,6 +108,8 @@ bool Router::routeAdd(const QString &ip, const QString &gw, QString mask) free(pIpForwardTable); return (dwStatus == NO_ERROR); + +#endif } int Router::routeAddList(const QString &gw, const QStringList &ips) @@ -118,6 +121,8 @@ int Router::routeAddList(const QString &gw, const QStringList &ips) qDebug().noquote() << QString("ROUTE ADD List: IPs:\n%1") .arg(ips.join("\n")); +#ifdef Q_OS_WIN + PMIB_IPFORWARDTABLE pIpForwardTable = NULL; DWORD dwSize = 0; BOOL bOrder = FALSE; @@ -224,10 +229,14 @@ int Router::routeAddList(const QString &gw, const QStringList &ips) qDebug() << "Router::routeAddList finished, success: " << success_count << "/" << ips.size(); return success_count; + +#endif } bool Router::clearSavedRoutes() { +#ifdef Q_OS_WIN + if (ipForwardRows.isEmpty()) return true; qDebug() << "forward rows size:" << ipForwardRows.size(); @@ -274,6 +283,8 @@ bool Router::clearSavedRoutes() ipForwardRows.clear(); return true; + +#endif } bool Router::routeDelete(const QString &ip) diff --git a/client/core/router.h b/client/core/router.h index 155aa43a..655bf90b 100644 --- a/client/core/router.h +++ b/client/core/router.h @@ -52,7 +52,9 @@ private: Router(Router const &) = delete; Router& operator= (Router const&) = delete; +#ifdef Q_OS_WIN QList ipForwardRows; +#endif }; #endif // ROUTER_H diff --git a/client/publib/debug.cpp b/client/debug.cpp similarity index 96% rename from client/publib/debug.cpp rename to client/debug.cpp index 70019188..f2b83178 100644 --- a/client/publib/debug.cpp +++ b/client/debug.cpp @@ -95,10 +95,6 @@ bool Debug::init(QDir& appDir) #endif #endif -#ifndef Q_OS_WIN - if (!fixOvpnLogPermissions()) - qWarning() << "Debug: permissions for ovpn.log were not fixed"; -#endif return true; } diff --git a/client/publib/debug.h b/client/debug.h similarity index 100% rename from client/publib/debug.h rename to client/debug.h diff --git a/client/defines.h b/client/defines.h new file mode 100644 index 00000000..aa1d863b --- /dev/null +++ b/client/defines.h @@ -0,0 +1,7 @@ +#ifndef DEFINES_H +#define DEFINES_H + +#define APPLICATION_NAME "AmneziaVPN" +#define ORGANIZATION_NAME "AmneziaVPN.ORG" + +#endif // DEFINES_H diff --git a/client/images/app.icns b/client/images/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..17d67ff29867604cf1101824a64f6dfd20d7180f GIT binary patch literal 45446 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 #include #include -#include #include -#include -#include "publib/runguard.h" -#include "publib/debug.h" +#include "debug.h" +#include "defines.h" +#include "runguard.h" #include "ui/mainwindow.h" -#ifdef Q_OS_WIN -#include -#endif - -#define ApplicationName "AmneziaVPN" - int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(res); - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); - RunGuard::instance(ApplicationName).activate(); + RunGuard::instance(APPLICATION_NAME).activate(); QApplication app(argc, argv); @@ -44,12 +35,11 @@ int main(int argc, char *argv[]) QFontDatabase::addApplicationFont(":/fonts/Lato-Thin.ttf"); QFontDatabase::addApplicationFont(":/fonts/Lato-ThinItalic.ttf"); - { QTranslator *translator = new QTranslator; QLocale ru(QLocale("ru_RU")); QLocale::setDefault(ru); - if (translator->load(QLocale(), "amnezia-client", ".", QLatin1String(":/translations"))) { + if (translator->load(QLocale(), "amneziavpn", ".", QLatin1String(":/translations"))) { bool ok = qApp->installTranslator(translator); qDebug().noquote() << "Main: Installing translator for locale" << ru.name() << ok; } @@ -58,38 +48,23 @@ int main(int argc, char *argv[]) } } - - app.setOrganizationName("AmneziaVPN"); - app.setOrganizationDomain("AmneziaVPN.ORG"); - app.setApplicationName(ApplicationName); - app.setApplicationDisplayName(ApplicationName); + app.setApplicationName(APPLICATION_NAME); + app.setOrganizationName(ORGANIZATION_NAME); + app.setApplicationDisplayName(APPLICATION_NAME); app.setApplicationVersion("1.0.0.0"); //app.setQuitOnLastWindowClosed(false); QCommandLineParser parser; - parser.setApplicationDescription("AmneziaVPN"); + parser.setApplicationDescription(APPLICATION_NAME); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption debugToConsoleOption("d", QCoreApplication::translate("main", "Output to console instead log file")); parser.addOption(debugToConsoleOption); - -#ifdef Q_OS_MAC - QCommandLineOption forceUseBrightIconsOption("b", QCoreApplication::translate("main", "Force use bright icons")); - parser.addOption(forceUseBrightIconsOption); -#endif - - // Process the actual command line arguments given by the user - parser.process(app); + parser.process(app); // Process the actual command line arguments given by the user bool debugToConsole = parser.isSet(debugToConsoleOption); - bool forceUseBrightIcons = false; - -#ifdef Q_OS_MAC - forceUseBrightIcons = parser.isSet(forceUseBrightIconsOption); -#endif - qDebug() << "Set output to console: " << debugToConsole; if (!debugToConsole) { @@ -102,7 +77,7 @@ int main(int argc, char *argv[]) f.setStyleStrategy(QFont::PreferAntialias); app.setFont(f); - MainWindow mainWindow(forceUseBrightIcons); + MainWindow mainWindow; mainWindow.show(); return app.exec(); diff --git a/client/platform_win/vpnclient.rc b/client/platform_win/vpnclient.rc index 8ac789df..7b0155b0 100644 --- a/client/platform_win/vpnclient.rc +++ b/client/platform_win/vpnclient.rc @@ -1,7 +1,7 @@ #include LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDI_ICON1 ICON "../images/main.ico" +IDI_ICON1 ICON "../images/app.ico" #define VER_FILEVERSION 1,1,1,1 #define VER_FILEVERSION_STR "1.1.1.1\0" diff --git a/client/publib/macos_functions.mm b/client/publib/macos_functions.mm deleted file mode 100644 index 9be8668f..00000000 --- a/client/publib/macos_functions.mm +++ /dev/null @@ -1,37 +0,0 @@ -#include "macos_functions.h" -#include -#import - -MacOSFunctions &MacOSFunctions::instance() -{ - static MacOSFunctions s; - return s; -} - -MacOSFunctions::MacOSFunctions() -{ - registerThemeNotification(); -} - -bool MacOSFunctions::isMenuBarUseDarkTheme() const -{ - NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain]; - id style = [dict objectForKey:@"AppleInterfaceStyle"]; - BOOL darkModeOn = ( style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"] ); - - return darkModeOn; -} - - -void MacOSFunctions::registerThemeNotification() -{ - // [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(darkModeChanged:) name:@"AppleInterfaceThemeChangedNotification" object:nil]; -} - - -void darkModeChanged(NSNotification*notif) -{ - Q_UNUSED(notif); - qDebug() << "Dark mode changed" << MacOSFunctions::instance().isMenuBarUseDarkTheme(); -} - diff --git a/client/publib/winhelp.cpp b/client/publib/winhelp.cpp deleted file mode 100644 index 4e6f8d2b..00000000 --- a/client/publib/winhelp.cpp +++ /dev/null @@ -1,261 +0,0 @@ -#include "winhelp.h" - -#include -#include -#include -#include -#include -#include - - -#define REG_AUTORUN_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run" - -int winhelpGetRegistry(const char *name, const char *reg, char *value) -{ - unsigned long nType = REG_SZ, nData = MAX_PATH; - if(ERROR_SUCCESS != SHGetValueA(HKEY_CURRENT_USER, reg, - name, &nType, value, &nData)) - return -1; - return 1; -} - -int winhelpSetRegistry(const char *name, const char *reg, const char *value) -{ - if(ERROR_SUCCESS != SHSetValueA(HKEY_CURRENT_USER, reg, - name, REG_SZ, value, (DWORD)strlen(value))) - return -1; - return 1; -} - -int winhelpLaunchStartupRegister(const char *name, int enable, const char *p) -{ - char path[MAX_PATH] = {0}; - if(p && strlen(p) == 0) - p = NULL; - if(p) { - if(enable) - strcpy(path, "\""); - else - strcpy(path, ";\""); - GetModuleFileNameA(NULL, path + strlen(path), MAX_PATH); - strcat(path, "\" "); - strcat(path, p); - } else { - if(enable) - strcpy(path, ""); - else - strcpy(path, ";"); - GetModuleFileNameA(NULL, path + strlen(path), MAX_PATH); - } - if(winhelpSetRegistry(name, REG_AUTORUN_PATH, path) < 0) - return -1; - return 1; -} - -/* use the task scheduler, we do not need to care about UAC when start up */ -int winhelpLaunchStartupTaskScheduler(const char *name, int enable, const char *p) -{ - char cmd[MAX_PATH * 10] = {0}; - char path[MAX_PATH] = {0}; - UINT i = 0; - GetModuleFileNameA(NULL, path, MAX_PATH); - if (QString(path).contains("build-vpn-")) { - qDebug() << "winhelpLaunchStartupTaskScheduler : skipping auto launch for build dir"; - return 0; - } - - if(enable) { - if(p == NULL) - p = ""; - sprintf(cmd, "schtasks /create /sc onlogon /tr \"\\\"%s\\\" %s\" " - "/tn \"%s\" /f /rl highest", path, p, name); - - } else { - sprintf(cmd, "schtasks /delete /tn \"%s\" /f", name); - } - qDebug().noquote() << "winhelpLaunchStartupTaskScheduler cmd:" << cmd; - i = WinExec(cmd, SW_HIDE); - return 1; -} - -int winhelpLaunchStartup(const char *name, int enable, const char *p) -{ - OSVERSIONINFOA info = {0}; - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - if(GetVersionExA(&info) < 0) - return -2; - if(info.dwMajorVersion >= 6) - return winhelpLaunchStartupTaskScheduler(name, enable, p); - else - return winhelpLaunchStartupRegister(name, enable, p); -} - -int str2int(const char *s) -{ - int r = 0; - while(*s && *(s + 1) && *(s + 2) && *(s + 3)) { - r += ((const int *)s)[0]; - s += 4; - } - return r; -} - -int winhelpOneProcess() -{ - char path[MAX_PATH] = {0}; - int i = 0, size = 0, cur = 0; - GetModuleFileNameA(NULL, path, MAX_PATH); - size = strlen(path); - for(i = size; i >= 0 && path[i] != '\\' ; i--); - cur = i + 1; - while(path[i] != '.' && path[i])i++; - path[i] = '\0'; - sprintf(path, "ONE_%s", path + cur); - CreateEventA(NULL, FALSE, FALSE, path); - if(GetLastError()) - return 0; - return 1; -} - -int winhelpSystemBits() -{ - typedef BOOL (WINAPI *LPFN_ISWOW64)(HANDLE, PBOOL); - int b64 = FALSE; - LPFN_ISWOW64 fnIsWow64 = (LPFN_ISWOW64)GetProcAddress( - GetModuleHandleA("kernel32"), "IsWow64Process"); - if(NULL != fnIsWow64) { - if(!fnIsWow64(GetCurrentProcess(),&b64)) { - return -1; - } - } - return b64 ? 64 : 86; -} - -bool winhelpIsSystem_x64() -{ - typedef BOOL (WINAPI *LPFN_ISWOW64)(HANDLE, PBOOL); - int b64 = FALSE; - LPFN_ISWOW64 fnIsWow64 = (LPFN_ISWOW64)GetProcAddress( - GetModuleHandleA("kernel32"), "IsWow64Process"); - if(NULL != fnIsWow64) { - if(!fnIsWow64(GetCurrentProcess(),&b64)) { - return false; - } - } - return b64 ? true : false; -} - -typedef struct _PROCESS_QUERY -{ - HANDLE h; - PROCESSENTRY32 d; -}PROCESS_QUERY; - -int winhelpProcessQuery(void **p) -{ - PROCESS_QUERY *q = (PROCESS_QUERY *)malloc(sizeof(PROCESS_QUERY)); - if(q == NULL) - return -2; - q->h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if(q->h == INVALID_HANDLE_VALUE) { - free(q); - return -1; - } - if(FALSE == Process32First(q->h, &q->d)) { - CloseHandle(q->h); - free(q); - return -3; - } - *p = (void *)q; - return 1; -} - -int winhelpProcessNext(void *h, char *name) -{ - PROCESS_QUERY *q = (PROCESS_QUERY *)h; - int pid = 0; - if(q == NULL) - return 0; - if(q->h == NULL) { - free(q); - return 0; - } - if(name) - wsprintfA(name, "%ls", q->d.szExeFile); - pid = (int)q->d.th32ProcessID; - - if(FALSE == Process32Next(q->h, &q->d)) { - CloseHandle(q->h); - q->h = NULL; - } - return pid; -} - -int winhelpRecvEvent(const char *event) -{ - HANDLE hEvent = CreateEventA(NULL, FALSE, FALSE, event); - if(hEvent == NULL) - return 0; - WaitForSingleObject(hEvent, INFINITE); - CloseHandle(hEvent); - return 1; -} - -int winhelpSendEvent(const char *event) -{ - HANDLE hEvent = OpenEventA(EVENT_ALL_ACCESS, FALSE, event); - if(hEvent == NULL) - return 0; - SetEvent(hEvent); - CloseHandle(hEvent); - return 1; -} - -int winhelpSystemVersion() -{ - OSVERSIONINFOA ver = {0}; - int version = 0; - ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - GetVersionExA(&ver); - version = ver.dwMajorVersion * 0x100 + ver.dwMinorVersion; - return version; -} - -int winhelperSetMTUSize(const char *subname, int size) -{ - char cmd[MAX_PATH] = {0}; - sprintf(cmd, "netsh interface ipv4 set subinterface \"%s\" mtu=%d store=persistent", - subname, size); - return (int)WinExec(cmd, SW_HIDE); -} - -int winhelpRecvSendBytes(const char *dev, int *recv, int *send) -{ - MIB_IFTABLE *it = NULL; - DWORD size = sizeof(MIB_IFTABLE), ret = 0, i = 0; - DWORD tr = 0, ts = 0; - - if(it = (MIB_IFTABLE *)malloc(sizeof (MIB_IFTABLE)), it == NULL) - return -1; - if(GetIfTable(it, &size, FALSE) == ERROR_INSUFFICIENT_BUFFER) { - free(it); - if(it = (MIB_IFTABLE *)malloc(size), it == NULL) - return -2; - } - if(ret = GetIfTable(it, &size, FALSE), ret != NO_ERROR) { - free(it); - return -3; - } - for(i = 0; i < it->dwNumEntries; i++) { - MIB_IFROW *ir = &it->table[i]; - if(strstr((const char *)ir->bDescr, dev) == 0) - continue; - tr += (int)ir->dwInOctets; - ts += (int)ir->dwOutOctets; - } - *recv = tr; - *send = ts; - free(it); - return 1; -} - diff --git a/client/publib/winhelp.h b/client/publib/winhelp.h deleted file mode 100644 index 43e9367a..00000000 --- a/client/publib/winhelp.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef WINHELP_H -#define WINHELP_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern int winhelpLaunchStartup(const char *, int, const char *); -extern int winhelpOneProcess(); -extern int winhelpSystemBits(); -extern bool winhelpIsSystem_x64(); -extern int winhelpProcessQuery(void **); -extern int winhelpProcessNext(void *, char *); -extern int winhelpRecvEvent(const char *); -extern int winhelpSendEvent(const char *); -extern int winhelpSystemVersion(); -extern int winhelperSetMTUSize(const char *, int); -extern int winhelpRecvSendBytes(const char *, int *, int *); - -#ifdef __cplusplus -} -#endif - -#endif /* WINHELP_H */ diff --git a/client/res.qrc b/client/resources.qrc similarity index 100% rename from client/res.qrc rename to client/resources.qrc diff --git a/client/publib/runguard.cpp b/client/runguard.cpp similarity index 100% rename from client/publib/runguard.cpp rename to client/runguard.cpp diff --git a/client/publib/runguard.h b/client/runguard.h similarity index 100% rename from client/publib/runguard.h rename to client/runguard.h diff --git a/client/ui/customshadoweffect.cpp b/client/ui/customshadoweffect.cpp deleted file mode 100644 index a719e81f..00000000 --- a/client/ui/customshadoweffect.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "customshadoweffect.h" -#include - -CustomShadowEffect::CustomShadowEffect(QObject *parent) : - QGraphicsEffect(parent), - _distance(4.0f), - _blurRadius(10.0f), - _color(0, 0, 0, 80) -{ -} - -QT_BEGIN_NAMESPACE - extern Q_WIDGETS_EXPORT void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0 ); -QT_END_NAMESPACE - -void CustomShadowEffect::draw(QPainter* painter) -{ - // if nothing to show outside the item, just draw source - if ((blurRadius() + distance()) <= 0) { - drawSource(painter); - return; - } - - PixmapPadMode mode = QGraphicsEffect::PadToEffectiveBoundingRect; - QPoint offset; - const QPixmap px = sourcePixmap(Qt::DeviceCoordinates, &offset, mode); - - // return if no source - if (px.isNull()) - return; - - // save world transform - QTransform restoreTransform = painter->worldTransform(); - painter->setWorldTransform(QTransform()); - - // Calculate size for the background image - QSize szi(px.size().width() + 2 * distance(), px.size().height() + 2 * distance()); - - QImage tmp(szi, QImage::Format_ARGB32_Premultiplied); - QPixmap scaled = px.scaled(szi); - tmp.fill(0); - QPainter tmpPainter(&tmp); - tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); - tmpPainter.drawPixmap(QPointF(-distance(), -distance()), scaled); - tmpPainter.end(); - - // blur the alpha channel - QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied); - blurred.fill(0); - QPainter blurPainter(&blurred); - qt_blurImage(&blurPainter, tmp, blurRadius(), false, true); - blurPainter.end(); - - tmp = blurred; - - // blacken the image... - tmpPainter.begin(&tmp); - tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); - tmpPainter.fillRect(tmp.rect(), color()); - tmpPainter.end(); - - // draw the blurred shadow... - painter->drawImage(offset, tmp); - - // draw the actual pixmap... - painter->drawPixmap(offset, px, QRectF()); - - // restore world transform - painter->setWorldTransform(restoreTransform); -} - -QRectF CustomShadowEffect::boundingRectFor(const QRectF& rect) const -{ - qreal delta = blurRadius() + distance(); - return rect.united(rect.adjusted(-delta, -delta, delta, delta)); -} diff --git a/client/ui/customshadoweffect.h b/client/ui/customshadoweffect.h deleted file mode 100644 index 629986f2..00000000 --- a/client/ui/customshadoweffect.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef CUSTOMSHADOWEFFECT_H -#define CUSTOMSHADOWEFFECT_H - -#include -#include - -class CustomShadowEffect : public QGraphicsEffect -{ - Q_OBJECT -public: - explicit CustomShadowEffect(QObject *parent = 0); - - void draw(QPainter* painter); - QRectF boundingRectFor(const QRectF& rect) const; - - inline void setDistance(qreal distance) { _distance = distance; updateBoundingRect(); } - inline qreal distance() const { return _distance; } - - inline void setBlurRadius(qreal blurRadius) { _blurRadius = blurRadius; updateBoundingRect(); } - inline qreal blurRadius() const { return _blurRadius; } - - inline void setColor(const QColor& color) { _color = color; } - inline QColor color() const { return _color; } - -private: - qreal _distance; - qreal _blurRadius; - QColor _color; -}; - -#endif // CUSTOMSHADOWEFFECT_H diff --git a/client/ui/mainwindow.cpp b/client/ui/mainwindow.cpp index 72b9d861..e1a7a28d 100644 --- a/client/ui/mainwindow.cpp +++ b/client/ui/mainwindow.cpp @@ -1,32 +1,13 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "mainwindow.h" - - -#ifdef Q_OS_WIN #include "ui_mainwindow.h" -#endif -#ifdef Q_OS_MAC -#include "ui_mainwindow_mac.h" -#include "publib/macos_functions.h" -#endif - - -MainWindow::MainWindow(bool useForceUseBrightIcons, QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow), - forceUseBrightIcons(useForceUseBrightIcons) +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); + + // Post initialization + ui->widget_tittlebar->hide(); + ui->stackedWidget_main->setCurrentIndex(2); } MainWindow::~MainWindow() diff --git a/client/ui/mainwindow.h b/client/ui/mainwindow.h index 58b610e2..d593abf6 100644 --- a/client/ui/mainwindow.h +++ b/client/ui/mainwindow.h @@ -2,18 +2,6 @@ #define MAINWINDOW_H #include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "customshadoweffect.h" - - namespace Ui { class MainWindow; @@ -27,7 +15,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(bool setForceUseBrightIcons = false, QWidget *parent = nullptr); + explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); public slots: @@ -37,7 +25,6 @@ private slots: private: Ui::MainWindow *ui; - bool forceUseBrightIcons = false; }; #endif // MAINWINDOW_H diff --git a/client/ui/mainwindow_mac.ui b/client/ui/mainwindow_mac.ui deleted file mode 100644 index dc9a01d0..00000000 --- a/client/ui/mainwindow_mac.ui +++ /dev/null @@ -1,1665 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 380 - 565 - - - - - - - QWidget { - font-size: 15px; - outline: none; - color: "#6B7C93"; -} -QPushButton { - border: none; - border-radius: 5px; -} - -QLineEdit { - border:1px solid rgb(120, 120, 120); - border-radius: 3px; - color: rgb(40, 40, 40); - - /*selection-background-color: darkgray;*/ - padding-left: 15px; -} -QLineEdit:focus { - /*border:2px solid rgb(66, 209, 133);*/ - border:2px solid white; -} -QLineEdit[error] { - border-bottom:1px solid rgb(213, 40, 60); - color: rgb(213, 40, 60); - background-color: rgb(40, 38, 38); -} -QLineEdit:disabled { - border-bottom:1px solid rgb(213, 40, 60); - color: rgb(213, 40, 60); - background-color: rgb(40, 38, 38); -} - -QCheckBox { - color: "#777777"; -} - - - - - - - 0 - 0 - 380 - 565 - - - - QWidget #widget_main { - background-color: white; -} - - - - - - 0 - 0 - 380 - 0 - - - - true - - - QPushButton { - padding:5px; -} -QPushButton:hover { - padding:0px; -} - - - - - - 344 - 8 - 20 - 20 - - - - image: url(:/images/close.png); - - - - - - - - - 299 - 13 - 20 - 20 - - - - image: url(:/images/min.png); - - - - - - - - - 39 - 2 - 200 - 30 - - - - true - - - AmneziaVPN - - - - - - 13 - 6 - 20 - 20 - - - - true - - - image: url(:/images/headericon.png); - - - - - - - - - - 0 - 0 - 380 - 565 - - - - QStackedWidget#stackedWidget_main{ -background: transparent; -} - - - - - QWidget#page_login{ -background: transparent; -} - - - - - - 90 - 45 - 200 - 59 - - - - image: url(:/images/amneziavpnimage.png); - - - - - - - - - 40 - 143 - 291 - 16 - - - - - - - Username - - - - - - 40 - 228 - 91 - 16 - - - - - -1 - - - - - - - Password - - - - - - 40 - 169 - 300 - 40 - - - - - - - 128 - - - Enter Username - - - - - - 40 - 254 - 300 - 40 - - - - - - - 128 - - - QLineEdit::Password - - - Enter Password - - - - - - 70 - 354 - 240 - 40 - - - - PointingHandCursor - - - QPushButton { - color: rgb(255, 255, 255); - background-color: "#42d185"; -} - -QPushButton:hover { - background-color: rgb(92, 228, 156); -} - - - Login - - - - - - 60 - 505 - 305 - 30 - - - - Launch AmneziaVPN on startup - - - - - - 60 - 465 - 305 - 30 - - - - - -1 - - - - Save Password - - - - - - 0 - 405 - 380 - 51 - - - - background-color: rgb(255, 255, 255); -color: rgb(255, 0, 0); - - - - - - Qt::AlignCenter - - - true - - - - - - 0 - 413 - 380 - 30 - - - - PointingHandCursor - - - QPushButton { - color: "#4171d6"; -} - -QPushButton:hover { - text-decoration: underline; -} - - - Do not have account? - - - - - - 140 - 395 - 81 - 10 - - - - - Open Sans - 11 - 50 - false - false - true - - - - PointingHandCursor - - - font: 11pt "Open Sans"; -color: rgb(74, 74, 74); - - - - - - - - - 126 - 300 - 211 - 25 - - - - PointingHandCursor - - - QPushButton { - color: "#4171d6"; - text-align:right; -} - -QPushButton:hover { - text-decoration: underline; -} - - - Forgot Password? - - - - - - - - - - - 25 - 65 - 331 - 44 - - - - 0 - - - - - - - - - 0 - 39 - 331 - 0 - - - - border-image: url(:/images/underline.png); - - - - - - - - - 100 - 9 - 161 - 30 - - - - font-size: 20px; - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - 70 - 13 - 20 - 20 - - - - - - - - - - true - - - - - - 321 - 9 - 0 - 30 - - - - - - - - - - label_3 - label_detected_country - label_detected_flag - label_detected_location - - - - - - - 0 - 55 - 380 - 16 - - - - font-size: 12px; - - - Your current IP - - - Qt::AlignCenter - - - - - - 0 - 114 - 380 - 261 - - - - - - - 0 - 24 - 380 - 212 - - - - PointingHandCursor - - - image: url(:/images/connectbutton.png); - - - - - - true - - - - - - - - 0 - 24 - 380 - 212 - - - - PointingHandCursor - - - - - - - - - true - - - - - - 0 - 24 - 380 - 212 - - - - - - - Qt::AlignCenter - - - label_conn_animation - pushButton_cancelConnect - - - - - - 0 - 24 - 380 - 212 - - - - ArrowCursor - - - image: url(:/images/connected_green.png); - - - - - - true - - - - - - 0 - 24 - 380 - 212 - - - - ArrowCursor - - - image: url(:/images/connected_gray.png); - - - - - - true - - - - - - 114 - 149 - 148 - 3 - - - - Qt::Horizontal - - - - - - 0 - 151 - 380 - 59 - - - - PointingHandCursor - - - image: url(:/images/power.png); - - - - - - - - - 0 - 76 - 380 - 25 - - - - color: rgb(168, 168, 168); - - - DURATION - - - Qt::AlignCenter - - - - - - 0 - 101 - 380 - 40 - - - - - Open Sans - 24 - 50 - false - false - - - - color: rgb(44, 83, 120); -font: 24pt "Open Sans"; - - - 00:00:00 - - - Qt::AlignCenter - - - pushButton_d1 - pushButton_d2 - line - label_7 - label_duration - pushButton_disconnect - - - - - - 0 - 423 - 380 - 1 - - - - image: url(:/images/underline.png); -background: transparent; - - - - - - - - - 78 - 386 - 221 - 30 - - - - UK - Berkshire - - - - - - 40 - 386 - 30 - 30 - - - - - - - - - - true - - - - - - 314 - 394 - 21 - 16 - - - - > - - - - - - 20 - 385 - 331 - 41 - - - - PointingHandCursor - - - - - - - - - - - - 140 - 434 - 121 - 16 - - - - - -1 - - - - font-size: 10px; -color: rgb(180, 180, 180); - - - Select Location - - - - - - 0 - 455 - 380 - 101 - - - - - - - 78 - 20 - 283 - 41 - - - - Automatically select server - - - - - - - - 100 - 63 - 91 - 16 - - - - - - - VPN Status - - - - - - - 200 - 63 - 91 - 16 - - - - color: rgb(66, 209, 133); - - - Connected - - - - - - 0 - 80 - 380 - 20 - - - - - Open Sans - 10 - 50 - false - false - - - - font: 10pt "Open Sans"; -color: rgb(180, 180, 180); - - - - - - Qt::AlignCenter - - - - - - 0 - 7 - 380 - 50 - - - - - - 252 - 3 - 101 - 20 - - - - - -1 - - - - color: rgb(66, 209, 133); - - - Upload speed - - - - - - 252 - 19 - 118 - 30 - - - - - Open Sans Semibold - 14 - 7 - false - false - - - - color: rgb(66, 209, 133); -font: 63 14pt "Open Sans Semibold"; - - - 55.55 Mbps - - - - - - 14 - 10 - 29 - 29 - - - - image: url(:/images/download.png); - - - - - - - - - 48 - 3 - 131 - 20 - - - - - -1 - - - - color: rgb(65, 113, 214); - - - Download speed - - - - - - 48 - 19 - 118 - 30 - - - - - Open Sans Semibold - 14 - 7 - false - false - - - - color: rgb(65, 113, 214); -font: 63 14pt "Open Sans Semibold"; - - - 55.55 Mbps - - - - - - 215 - 10 - 29 - 29 - - - - image: url(:/images/upload.png); - - - - - - - widget_conn_speed - label_18 - label_19 - label_port_forward - - - - - - 0 - 350 - 380 - 20 - - - - font: 9pt "Open Sans"; - - - - - - - Qt::AlignCenter - - - - - - 330 - 10 - 30 - 30 - - - - PointingHandCursor - - - -QPushButton { - padding:0px; /* 1px for zooming */ - image: url(:/images_mac/settings.png); -} -QPushButton:hover { - padding:0px; -} - - - - - - - - - - QWidget#page_servers { - background: #ffffff; -} - -QPushButton { - color: "#4171D6"; - border-radius: 0px; - border : 2px solid "#4171D6"; - font-size: 13px; -} - -QPushButton:checked { - background: "#4171D6"; - color: white; -} - -QTableView { - outline: 0; - alternate-background-color: rgb(247, 249, 249); - background-color: white; - border-bottom-left-radius:10px; - border-bottom-right-radius:10px; - - gridline-color: white; -} - -QTableView::item -{ - padding-left: 5px; - - border-top: 1px solid lightgray; -} - -/* -QTableView::item::selected -{ - border: 0px; - padding-left: 5px; - background-color: rgb(99, 180, 251); - - border: : rgb(99, 180, 251); - -} -*/ -QTableView::item::hover -{ - border: 0px; - padding-left: 5px; - background-color: rgb(99, 180, 251); - border: : rgb(99, 180, 251); -} - - - -QScrollBar:vertical { /* The area behind the scrollbar covering entire height. */ - background-color: rgba(0, 0, 0,0); - opacity: 100; - width: 10px; /* set width to zero to hide scrollbar entirely. Can look quite clean and scrolling still works with mousewheel. */ - margin: 10px px; /* Takes the height of the buttons + 3 extra pixels to leave some free space between handle and buttons */ - -} - -QScrollBar::handle:vertical { /* The handle you scroll with */ - image-position: center; /* image is used as a small gripper in the center of the scrollbar.. You can also use background-image to use two images */ - background-color: rgb(200, 200, 200); - border: 2px solid rgb(240,240,240); - border-radius: 1px; - min-height: 10px; -} -QScrollBar::handle:vertical:hover { /* state when you hover over the handle */ - background-color: rgb(160, 160, 160); -} -QScrollBar::handle:vertical:pressed { /* state when you hover over the handle */ - background-color: rgb(120, 120, 120); -} -QScrollBar::sub-line:vertical { /* button to scroll up */ - background-color: rgb(240,240,240); - height: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover { /* hover state of button to scroll up */ - background-color: rgb(200, 200, 200); -} - -QScrollBar::up-arrow:vertical { /* arrow to scroll up with */ - top: 2px; -} - -QScrollBar::add-line:vertical { /* Button to scroll down */ - background-color: rgb(240,240,240); - height: 10px; - padding-top: 2px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} -QScrollBar::add-line:vertical:hover { /* hover state of button to scroll down */ - background-color: rgb(200, 200, 200); -} - -QScrollBar::down-arrow:vertical { /* arrow to scroll down with */ - bottom: 3px; -} - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background-color: rgb(240,240,240); - -} - - - - - - - 10 - 50 - 121 - 30 - - - - border-top-left-radius: 4px; -border-bottom-left-radius: 4px; - - - All - - - true - - - true - - - true - - - - - - 129 - 50 - 122 - 30 - - - - Recommended - - - true - - - true - - - - - - 249 - 50 - 121 - 30 - - - - border-top-right-radius: 4px; -border-bottom-right-radius: 4px; - - - Favorites - - - true - - - true - - - - - - 20 - 17 - 25 - 17 - - - - PointingHandCursor - - - QPushButton { - padding: 1px; - border: none; - image: url(:/images/arrow_back.png); -} -QPushButton:hover { - padding: 0px; -} - - - - - - - - - - - 0 - 94 - 380 - 462 - - - - PointingHandCursor - - - true - - - - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAlwaysOff - - - QAbstractItemView::NoSelection - - - QAbstractItemView::SelectRows - - - false - - - Qt::NoPen - - - false - - - true - - - false - - - - - - 0 - 92 - 370 - 5 - - - - background-color: rgb(255, 255, 255); - - - - - - - - - - 330 - 10 - 0 - 30 - - - - PointingHandCursor - - - -QPushButton { - padding:1px; - image: url(:/images_mac/settings.png); -} -QPushButton:hover { - padding:0px; -} - - - - - - - - - - 0 - 15 - 380 - 21 - - - - font-size: 20px; -color: "#6B7C93"; - - - Servers - - - Qt::AlignCenter - - - pushButton_servers_all - pushButton_servers_recommended - pushButton_servers_favorites - tableView_servers - label_hide_first_line - pushButton_settings_2 - label_15 - pushButton_cancel - - - - - - 0 - 45 - 380 - 41 - - - - font-size: 30px; - - - Sign Up - - - Qt::AlignCenter - - - - - - 70 - 354 - 240 - 40 - - - - PointingHandCursor - - - QPushButton { - color: rgb(255, 255, 255); - background-color: "#42d185"; -} - -QPushButton:hover { - background-color: rgb(92, 228, 156); -} - - - Login - - - - - - 0 - 413 - 380 - 30 - - - - PointingHandCursor - - - QPushButton { - color: "#4171d6"; -} - -QPushButton:hover { - text-decoration: underline; -} - - - Do not have account? - - - - - - 40 - 143 - 291 - 16 - - - - - - - Username - - - - - - 40 - 254 - 300 - 40 - - - - - - - 128 - - - QLineEdit::Password - - - - - - - - - 40 - 169 - 300 - 40 - - - - - - - 128 - - - Enter Username - - - - - - 40 - 228 - 91 - 16 - - - - - -1 - - - - - - - Password - - - - - - 0 - 520 - 380 - 25 - - - - PointingHandCursor - - - QPushButton { - color: "#4171d6"; -} - -QPushButton:hover { - text-decoration: underline; -} - - - Forgot Password? - - - - - - - - - - - SlidingStackedWidget - QStackedWidget -
ui/Controls/SlidingStackedWidget.h
- 1 -
- - ServersTableView - QTableView -
ui/Controls/serverstableview.h
-
-
- - -