diff --git a/CMakeLists.txt b/CMakeLists.txt index 87a277fb..a7a1b1b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,7 @@ set(QV2RAY_TRANSLATION_PATH "unset" CACHE STRING "Qv2ray translations path") set(QV2RAY_DISABLE_AUTO_UPDATE OFF CACHE BOOL "Disable update checker") set(BUILD_TESTING OFF CACHE BOOL "Build test") set(EMBED_TRANSLATIONS OFF CACHE BOOL "Embed translations") +set(QV2RAY_AUTO_DEPLOY ON CACHE BOOL "Automatically run deploy command after build") if(QV2RAY_DEFAULT_VASSETS_PATH AND NOT QV2RAY_DEFAULT_VASSETS_PATH STREQUAL "unset") add_definitions(-DQV2RAY_DEFAULT_VASSETS_PATH="${QV2RAY_DEFAULT_VASSETS_PATH}") @@ -326,14 +327,16 @@ if(APPLE) ) # Destination paths below are relative to ${CMAKE_INSTALL_PREFIX} + install(TARGETS qv2ray BUNDLE DESTINATION . COMPONENT Runtime RUNTIME DESTINATION bin COMPONENT Runtime ) - - add_custom_command(TARGET qv2ray POST_BUILD - COMMAND macdeployqt ${CMAKE_BINARY_DIR}/qv2ray.app - ) + if(QV2RAY_AUTO_DEPLOY) + add_custom_command(TARGET qv2ray POST_BUILD + COMMAND ${Qt5_DIR}/../../../bin/macdeployqt ${CMAKE_BINARY_DIR}/qv2ray.app + ) + endif() set(APPS "\${CMAKE_INSTALL_PREFIX}/qv2ray.app") include(cmake/deployment.cmake) endif() @@ -355,10 +358,11 @@ if(WIN32) if(NOT EMBED_TRANSLATIONS) install(FILES ${QM_FILES} DESTINATION lang) endif() - - add_custom_command(TARGET qv2ray POST_BUILD - COMMAND ${Qt5_DIR}/../../../bin/windeployqt ${CMAKE_BINARY_DIR}/qv2ray.exe --compiler-runtime --verbose 2 --dir ${CMAKE_BINARY_DIR}/winqt/ - ) + if(QV2RAY_AUTO_DEPLOY) + add_custom_command(TARGET qv2ray POST_BUILD + COMMAND ${Qt5_DIR}/../../../bin/windeployqt ${CMAKE_BINARY_DIR}/qv2ray.exe --compiler-runtime --verbose 2 --dir ${CMAKE_BINARY_DIR}/winqt/ + ) + endif() install(DIRECTORY ${CMAKE_BINARY_DIR}/winqt/ DESTINATION .) set(APPS "\${CMAKE_INSTALL_PREFIX}/qv2ray.exe") include(cmake/deployment.cmake) diff --git a/makespec/BUILDVERSION b/makespec/BUILDVERSION index c62f8c4c..634d0148 100644 --- a/makespec/BUILDVERSION +++ b/makespec/BUILDVERSION @@ -1 +1 @@ -5681 +5682 diff --git a/src/StackTraceHelper.hpp b/src/StackTraceHelper.hpp index 5c5a044c..e9bcf732 100644 --- a/src/StackTraceHelper.hpp +++ b/src/StackTraceHelper.hpp @@ -1,7 +1,7 @@ #pragma once #include -#ifdef Q_OS_LINUX +#ifdef Q_OS_UNIX #include "backward.hpp" #endif #ifdef Q_OS_WIN @@ -17,18 +17,16 @@ namespace Qv2ray public: static QString GetStackTrace() { -#ifdef Q_OS_LINUX - return GetStackTraceImpl_Linux(); +#ifdef Q_OS_UNIX + return GetStackTraceImpl_Unix(); #elif defined(Q_OS_WIN) return GetStackTraceImpl_Windows(); -#else - return ""; #endif } private: -#ifdef Q_OS_LINUX - static QString GetStackTraceImpl_Linux() +#ifdef Q_OS_UNIX + static QString GetStackTraceImpl_Unix() { using namespace backward; StackTrace st; @@ -69,21 +67,23 @@ namespace Qv2ray DWORD displacement; IMAGEHLP_LINE64 *line = (IMAGEHLP_LINE64 *) malloc(sizeof(IMAGEHLP_LINE64)); line->SizeOfStruct = sizeof(IMAGEHLP_LINE64); + // + QString msg; + // for (int i = 0; i < numberOfFrames; i++) { - DWORD64 address = (DWORD64)(stack[i]); + const auto address = (DWORD64) stack[i]; SymFromAddr(process, address, NULL, symbol); if (SymGetLineFromAddr64(process, address, &displacement, line)) { - printf("\tat %s in %s: line: %lu: address: 0x%0X\n", symbol->Name, line->FileName, line->LineNumber, symbol->Address); + msg += QString("[%1]: %2 (%3:%4)\r\n").arg(symbol->Address).arg(symbol->Name).arg(line->FileName).arg(line->LineNumber); } else { - printf("\tSymGetLineFromAddr64 returned error code %lu.\n", GetLastError()); - printf("\tat %s, address 0x%0X.\n", symbol->Name, symbol->Address); + msg += QString("[*]: %1 SymGetLineFromAddr64[%2]\r\n").arg(symbol->Address).arg(symbol->Name).arg(GetLastError()); } } - return 0; + return msg; } #endif }; diff --git a/src/base/Qv2rayBase.hpp b/src/base/Qv2rayBase.hpp index 33d78822..eb57c458 100644 --- a/src/base/Qv2rayBase.hpp +++ b/src/base/Qv2rayBase.hpp @@ -27,6 +27,18 @@ using namespace Qv2ray::base::objects; using namespace Qv2ray::base::objects::protocol; using namespace Qv2ray::base::objects::transfer; +class _qv2ray_global_config_impl_details +{ + public: + static Qv2rayConfigObject _GlobalConfig; + static bool _isExiting; + static QString _Qv2rayConfigPath; +}; + +#define GlobalConfig (_qv2ray_global_config_impl_details::_GlobalConfig) +#define isExiting (_qv2ray_global_config_impl_details::_isExiting) +#define Qv2rayConfigPath (_qv2ray_global_config_impl_details::_Qv2rayConfigPath) + #define QV2RAY_BUILD_INFO QString(_QV2RAY_BUILD_INFO_STR_) #define QV2RAY_BUILD_EXTRA_INFO QString(_QV2RAY_BUILD_EXTRA_INFO_STR_) @@ -38,7 +50,7 @@ using namespace Qv2ray::base::objects::transfer; #endif // Get Configured Config Dir Path -#define QV2RAY_CONFIG_DIR (Qv2ray::Qv2rayConfigPath) +#define QV2RAY_CONFIG_DIR (Qv2rayConfigPath) #define QV2RAY_CONFIG_FILE (QV2RAY_CONFIG_DIR + "Qv2ray.conf") // #define QV2RAY_ROUTING_DIR (QV2RAY_CONFIG_DIR + "rounting/") @@ -109,25 +121,9 @@ using namespace Qv2ray::base::objects::transfer; #define API_TAG_INBOUND "_QV2RAY_API_INBOUND_" #define QV2RAY_USE_FPROXY_KEY "_QV2RAY_USE_GLOBAL_FORWARD_PROXY_" -//#define GlobalConfig (Qv2ray::GetGlobalConfig()) namespace Qv2ray { - //namespace - //{ - inline Qv2rayConfigObject GlobalConfig; - //} - // Qv2ray runtime config - inline bool isExiting = false; - inline QString Qv2rayConfigPath = ""; - //inline Qv2rayConfigObject &GetGlobalConfig() - // { - // if (!realGlobalConfig) - // { - // realGlobalConfig = std::make_unique(); - // } - // return *realGlobalConfig; - // }; inline QStringList Qv2rayAssetsPaths(const QString &dirName) { // Configuration Path diff --git a/src/base/Qv2rayLog.cpp b/src/base/Qv2rayLog.cpp index abcaf9f3..4871db38 100644 --- a/src/base/Qv2rayLog.cpp +++ b/src/base/Qv2rayLog.cpp @@ -7,6 +7,11 @@ #ifdef Q_OS_ANDROID #include #endif + +Qv2rayConfigObject _qv2ray_global_config_impl_details::_GlobalConfig; +bool _qv2ray_global_config_impl_details::_isExiting; +QString _qv2ray_global_config_impl_details::_Qv2rayConfigPath; + namespace Qv2ray::base { // Forwarded from QvTinyLog diff --git a/src/components/proxy/QvProxyConfigurator.cpp b/src/components/proxy/QvProxyConfigurator.cpp index 90ff71d0..06da4343 100644 --- a/src/components/proxy/QvProxyConfigurator.cpp +++ b/src/components/proxy/QvProxyConfigurator.cpp @@ -338,22 +338,22 @@ namespace Qv2ray::components::proxy } #else - for (auto service : macOSgetNetworkServices()) + for (const auto &service : macOSgetNetworkServices()) { LOG(MODULE_PROXY, "Setting proxy for interface: " + service) if (hasHTTP) { - QProcess::execute("/usr/sbin/networksetup -setwebproxystate " + service + " on"); - QProcess::execute("/usr/sbin/networksetup -setsecurewebproxystate " + service + " on"); - QProcess::execute("/usr/sbin/networksetup -setwebproxy " + service + " " + address + " " + QSTRN(httpPort)); - QProcess::execute("/usr/sbin/networksetup -setsecurewebproxy " + service + " " + address + " " + QSTRN(httpPort)); + QProcess::execute("/usr/sbin/networksetup", { "-setwebproxystate", service, "on" }); + QProcess::execute("/usr/sbin/networksetup", { "-setsecurewebproxystate", service, "on" }); + QProcess::execute("/usr/sbin/networksetup", { "-setwebproxy", service, address, QSTRN(httpPort) }); + QProcess::execute("/usr/sbin/networksetup", { "-setsecurewebproxy", service, address, QSTRN(httpPort) }); } if (hasSOCKS) { - QProcess::execute("/usr/sbin/networksetup -setsocksfirewallproxystate " + service + " on"); - QProcess::execute("/usr/sbin/networksetup -setsocksfirewallproxy " + service + " " + address + " " + QSTRN(socksPort)); + QProcess::execute("/usr/sbin/networksetup", { "-setsocksfirewallproxystate", service, "on" }); + QProcess::execute("/usr/sbin/networksetup", { "-setsocksfirewallproxy", service, address, QSTRN(socksPort) }); } } @@ -436,10 +436,10 @@ namespace Qv2ray::components::proxy for (const auto &service : macOSgetNetworkServices()) { LOG(MODULE_PROXY, "Clearing proxy for interface: " + service) - QProcess::execute("/usr/sbin/networksetup", { "-setautoproxystate " + service + " off" }); - QProcess::execute("/usr/sbin/networksetup", { "-setwebproxystate " + service + " off" }); - QProcess::execute("/usr/sbin/networksetup", { "-setsecurewebproxystate " + service + " off" }); - QProcess::execute("/usr/sbin/networksetup", { "-setsocksfirewallproxystate " + service + " off" }); + QProcess::execute("/usr/sbin/networksetup", { "-setautoproxystate", service, "off" }); + QProcess::execute("/usr/sbin/networksetup", { "-setwebproxystate", service, "off" }); + QProcess::execute("/usr/sbin/networksetup", { "-setsecurewebproxystate", service, "off" }); + QProcess::execute("/usr/sbin/networksetup", { "-setsocksfirewallproxystate", service, "off" }); } #endif diff --git a/src/main.cpp b/src/main.cpp index 56b148d5..1a1fe9f1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,8 @@ void signalHandler(int signum) if (signum == SIGSEGV) { const auto msg = StackTraceHelper::GetStackTrace(); - auto filePath = QV2RAY_CONFIG_DIR + "QvBugReport_" + QSTRN(system_clock::to_time_t(system_clock::now())) + ".stacktrace"; + QDir().mkpath(QV2RAY_CONFIG_DIR + "/bugreport/"); + auto filePath = QV2RAY_CONFIG_DIR + "/bugreport/QvBugReport_" + QSTRN(system_clock::to_time_t(system_clock::now())) + ".stacktrace"; StringToFile(msg, filePath); LOG(MODULE_INIT, "Backtrace saved in: " + filePath) LOG(MODULE_INIT, msg)