From 966d6897a88421a5fd7adbce967d69914ed6012e Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 27 Feb 2023 13:55:37 +0000 Subject: [PATCH] QT WebSocketServer (#25) * QT gui api server * removes QT window functions * removes gitsubmodule for gui html files. * refactors gui folder. * MacOS GUI Bundle + Github Action * linux gui bundle + Github Action * windows GUI build + Github Action * windows GHA install action * embed icons to binary * adds tray icon --- .github/gui-testnet.yml | 56 -- .github/workflows/cli-testnet.yml | 2 +- .github/workflows/gui-testnet.yml | 164 ++++++ .gitmodules | 4 - .idea/cmake.xml | 4 +- .idea/runConfigurations/daemon.xml | 4 +- .idea/runConfigurations/simplewallet.xml | 2 +- .idea/runConfigurations/wallet.xml | 4 +- src/CMakeLists.txt | 51 +- .../{qt-daemon/application => }/gui_utils.cpp | 0 .../{qt-daemon/application => }/gui_utils.h | 0 src/gui/main.cpp | 49 ++ .../application => }/mainwindow.cpp | 522 ++---------------- .../{qt-daemon/application => }/mainwindow.h | 56 +- .../application => }/notification_helper.h | 0 .../application => }/notification_helper.mm | 0 src/gui/qt-daemon/.gitignore | 1 - src/gui/qt-daemon/Info.plist.in | 63 --- src/gui/qt-daemon/app.icns | Bin 89211 -> 0 bytes src/gui/qt-daemon/app.ico | Bin 111606 -> 0 bytes src/gui/qt-daemon/app.qrc | 5 - src/gui/qt-daemon/app.rc | 2 - src/gui/qt-daemon/layout | 1 - src/gui/qt-daemon/main.cpp | 89 --- src/gui/qt-daemon/qtlogger.h | 133 ----- src/gui/resources/app22macos.png | Bin 0 -> 8162 bytes src/gui/resources/app22macos_blocked.png | Bin 0 -> 15225 bytes src/gui/resources/app22windows.png | Bin 0 -> 2996 bytes src/gui/resources/app22windows_blocked.png | Bin 0 -> 1247 bytes src/gui/resources/desktop_linux_icon.png | Bin 0 -> 4488 bytes src/gui/resources/files.qrc | 7 + src/gui/resources/lthn.png | Bin 0 -> 82294 bytes .../application => }/urleventfilter.cpp | 0 .../application => }/urleventfilter.h | 0 src/gui/websocketclientwrapper.cpp | 34 ++ src/gui/websocketclientwrapper.h | 29 + src/gui/websockettransport.cpp | 64 +++ src/gui/websockettransport.h | 26 + utils/build/testnet_linux_gui.sh | 104 +--- utils/build/testnet_mac_osx_cli.sh | 2 - utils/build/testnet_mac_osx_gui.sh | 179 +----- utils/build/testnet_windows_gui.bat | 69 +-- 42 files changed, 487 insertions(+), 1239 deletions(-) delete mode 100644 .github/gui-testnet.yml create mode 100644 .github/workflows/gui-testnet.yml rename src/gui/{qt-daemon/application => }/gui_utils.cpp (100%) rename src/gui/{qt-daemon/application => }/gui_utils.h (100%) create mode 100644 src/gui/main.cpp rename src/gui/{qt-daemon/application => }/mainwindow.cpp (80%) rename src/gui/{qt-daemon/application => }/mainwindow.h (91%) rename src/gui/{qt-daemon/application => }/notification_helper.h (100%) rename src/gui/{qt-daemon/application => }/notification_helper.mm (100%) delete mode 100644 src/gui/qt-daemon/.gitignore delete mode 100644 src/gui/qt-daemon/Info.plist.in delete mode 100644 src/gui/qt-daemon/app.icns delete mode 100644 src/gui/qt-daemon/app.ico delete mode 100644 src/gui/qt-daemon/app.qrc delete mode 100644 src/gui/qt-daemon/app.rc delete mode 160000 src/gui/qt-daemon/layout delete mode 100644 src/gui/qt-daemon/main.cpp delete mode 100644 src/gui/qt-daemon/qtlogger.h create mode 100644 src/gui/resources/app22macos.png create mode 100644 src/gui/resources/app22macos_blocked.png create mode 100644 src/gui/resources/app22windows.png create mode 100644 src/gui/resources/app22windows_blocked.png create mode 100644 src/gui/resources/desktop_linux_icon.png create mode 100644 src/gui/resources/files.qrc create mode 100644 src/gui/resources/lthn.png rename src/gui/{qt-daemon/application => }/urleventfilter.cpp (100%) rename src/gui/{qt-daemon/application => }/urleventfilter.h (100%) create mode 100644 src/gui/websocketclientwrapper.cpp create mode 100644 src/gui/websocketclientwrapper.h create mode 100644 src/gui/websockettransport.cpp create mode 100644 src/gui/websockettransport.h diff --git a/.github/gui-testnet.yml b/.github/gui-testnet.yml deleted file mode 100644 index e3e7b75af..000000000 --- a/.github/gui-testnet.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: "gui-testnet" -on: - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - push: - paths-ignore: - - '**.md' - pull_request: - paths-ignore: - - '**.md' - -env: - CCACHE_SETTINGS: | - ccache --max-size=150M - ccache --set-config=compression=true - -jobs: - macos-amd64: - runs-on: macos-latest - env: - CCACHE_TEMPDIR: /tmp/.ccache-temp - steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - with: - access_token: ${{ github.token }} - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: recursive - - uses: actions/cache@v2 - with: - path: /Users/runner/Library/Caches/ccache - key: ccache-${{ runner.os }}-build-${{ github.sha }} - restore-keys: ccache-${{ runner.os }}-build- - - name: install dependencies - run: HOMEBREW_NO_AUTO_UPDATE=1 brew install openssl boost icu4c ccache miniupnpc qt@5 - - name: build GUI - env: - PKG_CONFIG_PATH: "/usr/local/opt/openssl@3/lib/pkgconfig" - OPENSSL_ROOT_DIR: "/usr/local/opt/openssl@3" - ZANO_QT_PATH: "/usr/local/opt/qt@5" - ZANO_BOOST_ROOT: "/opt/homebrew/opt/boost" - ZANO_BOOST_LIBS_PATH: "/opt/homebrew/opt/boost/lib" - CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk" - run: | - ${{env.CCACHE_SETTINGS}} - export LIBRARY_PATH=${LIBRARY_PATH}:/usr/local/opt/icu4c/lib - ./utils/build/testnet_mac_osx_gui.sh - - name: Tar files - run: cd build/release/src/gui && tar -cvf ../../../../testnet-desktop-macos-amd64.tar Lethean.app - - uses: actions/upload-artifact@v3 - with: - name: testnet-desktop-macos-amd64 - if-no-files-found: error - path: testnet-desktop-macos-amd64.tar diff --git a/.github/workflows/cli-testnet.yml b/.github/workflows/cli-testnet.yml index c3568cf38..a88a05f07 100644 --- a/.github/workflows/cli-testnet.yml +++ b/.github/workflows/cli-testnet.yml @@ -35,7 +35,7 @@ jobs: key: ccache-${{ runner.os }}-build-testnet-cli-${{ github.sha }} restore-keys: ccache-${{ runner.os }}-build-testnet-cli- - name: update apt - run: sudo apt update & sudo apt-get upgrade -y + run: sudo apt update - name: install dependencies run: sudo apt-get install -y python-dev autotools-dev libboost-all-dev libicu-dev libbz2-dev git screen checkinstall zlib1g-dev ccache miniupnpc - name: build server diff --git a/.github/workflows/gui-testnet.yml b/.github/workflows/gui-testnet.yml new file mode 100644 index 000000000..fc5d79e59 --- /dev/null +++ b/.github/workflows/gui-testnet.yml @@ -0,0 +1,164 @@ +name: "gui-testnet" +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + push: + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + +env: + CCACHE_SETTINGS: | + ccache --max-size=150M + ccache --set-config=compression=true + +jobs: + linux-amd64: + runs-on: ubuntu-20.04 + env: + CCACHE_TEMPDIR: /tmp/.ccache-temp + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.9.1 + with: + access_token: ${{ github.token }} + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + submodules: recursive + - uses: actions/cache@v3 + with: + path: ~/.ccache + key: ccache-${{ runner.os }}-build-testnet-gui + restore-keys: ccache-${{ runner.os }}-build-testnet-gui + - name: update apt + run: sudo apt update + - name: install dependencies + run: sudo apt-get install -y qt5-default qtwebengine5-dev libqt5websockets5-dev python-dev autotools-dev libboost-all-dev libicu-dev libbz2-dev git screen checkinstall zlib1g-dev ccache miniupnpc + - name: build server + env: + QT_PREFIX_PATH: /usr/lib/qt5 + run: | + ${{env.CCACHE_SETTINGS}} + ./utils/build/testnet_linux_gui.sh + - uses: actions/upload-artifact@v3 + with: + name: lethean-gui-bundle-linux-testnet-x86_64 + if-no-files-found: error + path: lethean-gui-bundle-linux-testnet-x86_64.tar.bz2 + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: ${{ github.workspace }}/lethean-gui-bundle-linux-testnet-x86_64.tar.bz2 + macos-amd64: + runs-on: macos-latest + env: + CCACHE_TEMPDIR: /tmp/.ccache-temp + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.9.1 + with: + access_token: ${{ github.token }} + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + submodules: recursive + - uses: actions/cache@v3 + with: + path: /Users/runner/Library/Caches/ccache + key: ccache-${{ runner.os }}-build-testnet-gui + restore-keys: ccache-${{ runner.os }}-build-testnet-gui + - name: install dependencies + run: HOMEBREW_NO_AUTO_UPDATE=1 brew install openssl boost icu4c ccache miniupnpc qt@5 + - name: build server + env: + PKG_CONFIG_PATH: "/usr/local/opt/openssl@3/lib/pkgconfig" + OPENSSL_ROOT_DIR: "/usr/local/opt/openssl@3" + ZANO_BOOST_ROOT: "/usr/local/opt/boost" + ZANO_BOOST_LIBS_PATH: "/usr/local/opt/boost/lib" + ZANO_QT_PATH: "/usr/local/opt/qt@5" + CMAKE_OSX_SYSROOT: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk" + run: | + ${{env.CCACHE_SETTINGS}} + export LIBRARY_PATH=${LIBRARY_PATH}:/usr/local/opt/icu4c/lib + ./utils/build/testnet_mac_osx_gui.sh + - uses: actions/upload-artifact@v3 + with: + name: lethean-gui-bundle-macos-testnet-i386 + if-no-files-found: error + path: lethean-gui-bundle-macos-testnet-i386.tar.bz2 + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: ${{ github.workspace }}/lethean-gui-bundle-macos-testnet-i386.tar.bz2 + windows-amd64: + runs-on: windows-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.9.1 + with: + access_token: ${{ github.token }} + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + submodules: recursive + - uses: actions/cache@v3 + with: + path: ~\.ccache + key: ccache-${{ runner.os }}-build-testnet-cli + restore-keys: ccache-${{ runner.os }}-build-testnet-cli + - name: Eat the Choco + run: | + choco install openssl --version 1.1.1.1500 -y + choco install ccache -y + choco install zip -y + - name: Install Qt + uses: jurplel/install-qt-action@v3 + with: + version: '5.15.2' + host: 'windows' + target: 'desktop' + arch: 'win64_msvc2019_64' + dir: '${{ github.workspace }}/example/' + modules: 'qtcharts qtwebengine' + - name: install msvc toolset + uses: ilammy/msvc-dev-cmd@v1 + - name: Install boost + uses: MarkusJx/install-boost@v2.4.1 + id: install-boost + with: + # REQUIRED: Specify the required boost version + # A list of supported versions can be found here: + # https://github.com/MarkusJx/prebuilt-boost/blob/main/versions-manifest.json + boost_version: 1.80.0 + platform_version: 2022 + toolset: msvc + link: static + - name: Set up Visual Studio shell + uses: egor-tensin/vs-shell@v2 + with: + arch: x64 + - name: build server + env: + QT_PREFIX_PATH: ${{ github.workspace }}/example/Qt/5.15.2/win64_msvc2019_64 + BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }} + LOCAL_BOOST_PATH: ${{ steps.install-boost.outputs.BOOST_ROOT }} + OPENSSL_ROOT_DIR: "C:\\Program Files\\OpenSSL-Win64" + run: | + refreshenv + ${{env.CCACHE_SETTINGS}} + .\utils\build\testnet_windows_gui.bat + - uses: actions/upload-artifact@v3 + with: + name: lethean-gui-bundle-win-testnet-x64 + if-no-files-found: error + path: ${{ github.workspace }}\lethean-gui-bundle-win-testnet-x64.zip + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: ${{ github.workspace }}\lethean-gui-bundle-win-testnet-x64.zip diff --git a/.gitmodules b/.gitmodules index bc13a0d33..c5495c2c3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,6 @@ [submodule "contrib/miniupnp"] path = contrib/miniupnp url = https://github.com/miniupnp/miniupnp -[submodule "src/gui/qt-daemon/layout"] - path = src/gui/qt-daemon/layout - url = https://github.com/letheanVPN/iTw3_ui.git - branch = main [submodule "contrib/tor-connect"] path = contrib/tor-connect url = https://github.com/letheanVPN/tor-connect.git diff --git a/.idea/cmake.xml b/.idea/cmake.xml index e9a23f41c..bb2d9a142 100644 --- a/.idea/cmake.xml +++ b/.idea/cmake.xml @@ -2,8 +2,8 @@ - - + + diff --git a/.idea/runConfigurations/daemon.xml b/.idea/runConfigurations/daemon.xml index 7e66deb56..ef91459ef 100644 --- a/.idea/runConfigurations/daemon.xml +++ b/.idea/runConfigurations/daemon.xml @@ -1,7 +1,7 @@ - + - \ No newline at end of file + diff --git a/.idea/runConfigurations/simplewallet.xml b/.idea/runConfigurations/simplewallet.xml index 62947b9d2..fd3cc171a 100644 --- a/.idea/runConfigurations/simplewallet.xml +++ b/.idea/runConfigurations/simplewallet.xml @@ -1,5 +1,5 @@ - + diff --git a/.idea/runConfigurations/wallet.xml b/.idea/runConfigurations/wallet.xml index 81a5160f1..074532787 100644 --- a/.idea/runConfigurations/wallet.xml +++ b/.idea/runConfigurations/wallet.xml @@ -1,7 +1,7 @@ - + - \ No newline at end of file + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f52276061..a69a237cd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -69,14 +69,11 @@ file(GLOB_RECURSE WALLET wallet/*) file(GLOB_RECURSE MINER miner/*) if(BUILD_GUI) - if(MSVC) - file(GLOB_RECURSE QTDAEMON gui/qt-daemon/*.cpp gui/qt-daemon/*.h gui/qt-daemon/app.rc) - elseif(APPLE) - file(GLOB_RECURSE QTDAEMON gui/qt-daemon/*.cpp gui/qt-daemon/*.h gui/qt-daemon/*.mm) + if(APPLE) + file(GLOB_RECURSE QTSERVER gui/*.cpp gui/*.h gui/*.mm) else() - file(GLOB_RECURSE QTDAEMON gui/qt-daemon/*.cpp gui/qt-daemon/*.h) + file(GLOB_RECURSE QTSERVER gui/*.cpp gui/*.h) endif() - list(FILTER QTDAEMON EXCLUDE REGEX "node_modules") endif() @@ -94,7 +91,7 @@ source_group(connectivity-tool FILES ${CONN_TOOL}) source_group(wallet FILES ${WALLET}) if(BUILD_GUI) - source_group(qtdaemon FILES ${QTDAEMON}) + source_group(qtserver FILES ${QTSERVER}) endif() @@ -183,23 +180,27 @@ set_property(TARGET common crypto currency_core rpc stratum wallet PROPERTY FOLD set_property(TARGET daemon simplewallet connectivity_tool PROPERTY FOLDER "prog") set_property(TARGET daemon PROPERTY OUTPUT_NAME "letheand") + if(BUILD_GUI) if(APPLE) FIND_LIBRARY(COCOA_LIBRARY Cocoa) endif() + set(AUTORCC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) - SET(MACOSX_BUNDLE_ICON_FILE app.icns) - add_executable(Lethean WIN32 MACOSX_BUNDLE ${QTDAEMON} ) - ENABLE_SHARED_PCH(Lethean QTDAEMON) +# SET(MACOSX_BUNDLE_ICON_FILE app.icns) + qt5_add_resources (RCC_SOURCES gui/resources/files.qrc) + add_executable(Lethean WIN32 MACOSX_BUNDLE ${QTSERVER} ${RCC_SOURCES} ) + ENABLE_SHARED_PCH(Lethean QTSERVER) ENABLE_SHARED_PCH_EXECUTABLE(Lethean) + set_property(TARGET Lethean PROPERTY OUTPUT_NAME "lethean-gui-server") - QT5_USE_MODULES(Lethean WebEngineWidgets WebChannel) + QT5_USE_MODULES(Lethean WebEngineWidgets WebChannel WebSockets) find_package(Qt5PrintSupport REQUIRED) - target_link_libraries(Lethean wallet rpc currency_core crypto common zlibstatic ethash Qt5::WebEngineWidgets Qt5::PrintSupport ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) + target_link_libraries(Lethean wallet rpc currency_core crypto common zlibstatic ethash Qt5::WebSockets Qt5::WebEngineWidgets Qt5::PrintSupport ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) if (UNIX AND NOT APPLE) target_link_libraries(Lethean rt) endif() @@ -213,33 +214,7 @@ if(BUILD_GUI) endif() set_property(TARGET Lethean PROPERTY FOLDER "prog") - set_target_properties(Lethean PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/gui/qt-daemon/Info.plist.in) - - set(HTML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/gui/qt-daemon/layout/html) - set_target_properties(Lethean PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS "--html-path=${HTML_DIR}") set(CMAKE_AUTOMOC OFF) - # GUI convenience "bundle" - # set(GUI_DIR ${CMAKE_CURRENT_BINARY_DIR}/gui) - # set_target_properties(Lethean PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${GUI_DIR}) - # add_custom_command(TARGET Lethean POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${HTML_DIR} ${GUI_DIR}/html) -endif() - -if(APPLE) - set(SIMPLE_BUNDLE 1) -endif() - -if(SIMPLE_BUNDLE) - set(INSTALL_DIR "${CMAKE_BINARY_DIR}/hp-${VERSION}") - install(TARGETS daemon simplewallet connectivity_tool - RUNTIME DESTINATION "${INSTALL_DIR}" COMPONENT Runtime - ) - - install(FILES ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} DESTINATION "${INSTALL_DIR}/lib") - - if(APPLE) - set(FIXUP_COMMAND ${CMAKE_SOURCE_DIR}/utils/macosx_fixup.sh " " ${INSTALL_DIR}) - install(CODE "execute_process(COMMAND ${FIXUP_COMMAND})") - endif() endif() diff --git a/src/gui/qt-daemon/application/gui_utils.cpp b/src/gui/gui_utils.cpp similarity index 100% rename from src/gui/qt-daemon/application/gui_utils.cpp rename to src/gui/gui_utils.cpp diff --git a/src/gui/qt-daemon/application/gui_utils.h b/src/gui/gui_utils.h similarity index 100% rename from src/gui/qt-daemon/application/gui_utils.h rename to src/gui/gui_utils.h diff --git a/src/gui/main.cpp b/src/gui/main.cpp new file mode 100644 index 000000000..f00644edb --- /dev/null +++ b/src/gui/main.cpp @@ -0,0 +1,49 @@ +#include "websocketclientwrapper.h" +#include "websockettransport.h" +#include "mainwindow.h" +#include "include_base_utils.h" + +#include +#include +#include +#include +#ifdef Q_OS_DARWIN +# include "urleventfilter.h" +#endif +int main(int argc, char** argv) +{ +// epee::log_space::get_set_log_detalisation_level(true, LOG_LEVEL_0); +// epee::log_space::get_set_need_thread_id(true, true); +// epee::log_space::log_singletone::enable_channels("core,currency_protocol,tx_pool,p2p,wallet"); + + QApplication app(argc, argv, Qt::SubWindow); + + // setup the QWebSocketServer + QWebSocketServer webSocketServer(QStringLiteral("Lethean GUI Backend Server"), QWebSocketServer::NonSecureMode); + if(!webSocketServer.listen(QHostAddress::LocalHost, 12345)) { + qWarning() << "Failed to open web socket server." << webSocketServer.errorString(); + return 1; + } + WebSocketClientWrapper clientWrapper(&webSocketServer); + + // setup the channel + QWebChannel channel; + QObject::connect(&clientWrapper, &WebSocketClientWrapper::clientConnected, + &channel, &QWebChannel::connectTo); + MainWindow viewer; + + // register QObjects to be exposed to JavaScript + if(!viewer.init_backend(argc, argv)) { + return 1; + } + + channel.registerObject(QStringLiteral("mediator_object"), &viewer); + +#ifdef Q_OS_DARWIN + URLEventFilter url_event_filter(&viewer); + app.installEventFilter(&url_event_filter); +#endif + app.installNativeEventFilter(&viewer); + + return app.exec(); +} diff --git a/src/gui/qt-daemon/application/mainwindow.cpp b/src/gui/mainwindow.cpp similarity index 80% rename from src/gui/qt-daemon/application/mainwindow.cpp rename to src/gui/mainwindow.cpp index c3f0f82a2..35ea25e73 100644 --- a/src/gui/qt-daemon/application/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -6,8 +6,7 @@ #include #include -#include -#include +#include #include "string_coding.h" #include "gui_utils.h" @@ -39,7 +38,7 @@ QString make_response_dbg(const T& r, const std::string& location) return str.c_str(); } -#define PREPARE_RESPONSE(rsp_type, var_name) view::api_response_t var_name = AUTO_VAL_INIT(var_name) +#define PREPARE_RESPONSE(rsp_type, var_name) view::api_response_t var_name = AUTO_VAL_INIT(var_name) #define MAKE_RESPONSE(r) (r.error_code == API_RETURN_CODE_OK || r.error_code == API_RETURN_CODE_TRUE) ? make_response(r) : make_response_dbg(r, LOCATION_STR) #define LOG_API_TIMING() const char* pfunc_call_name = LOCAL_FUNCTION_DEF__; LOG_PRINT_BLUE("[API:" << pfunc_call_name << "]-->>", LOG_LEVEL_0); uint64_t ticks_before_start = epee::misc_utils::get_tick_count(); \ @@ -65,27 +64,6 @@ QString make_response_dbg(const T& r, const std::string& location) } #include "mainwindow.h" -// -// void MediatorObject::from_html_to_c(const QString &text) -// { -// from_c_to_html(text); -// } -// -// template -// struct InvokeWrapper { -// R *receiver; -// void (C::*memberFun)(Arg); -// void operator()(Arg result) { -// (receiver->*memberFun)(result); -// } -// }; -// -// template -// InvokeWrapper invoke(R *receiver, void (C::*memberFun)(Arg)) -// { -// InvokeWrapper wrapper = { receiver, memberFun }; -// return wrapper; -// } std::wstring convert_to_lower_via_qt(const std::wstring& w) @@ -98,8 +76,6 @@ MainWindow::MainWindow() : m_gui_deinitialize_done_1(false) , m_backend_stopped_2(false) , m_system_shutdown(false) - , m_view(nullptr) - , m_channel(nullptr) , m_ui_dispatch_id_counter(0) { #ifndef _MSC_VER @@ -111,17 +87,7 @@ MainWindow::MainWindow() MainWindow::~MainWindow() { m_backend.subscribe_to_core_events(nullptr); - if (m_view) - { - m_view->page()->setWebChannel(nullptr); - m_view = nullptr; - } - if (m_channel) - { - m_channel->deregisterObject(this); - delete m_channel; - m_channel = nullptr; - } + if (m_ipc_worker.joinable()) { m_ipc_worker.join(); @@ -135,82 +101,6 @@ void MainWindow::on_load_finished(bool ok) CATCH_ENTRY2(void()); } -bool MainWindow::init_window() -{ - m_view = new QWebEngineView(this); - m_channel = new QWebChannel(m_view->page()); - m_view->page()->setWebChannel(m_channel); - - QWidget* central_widget_to_be_set = m_view; - - std::string qt_dev_tools_option = m_backend.get_qt_dev_tools_option(); - if (!qt_dev_tools_option.empty()) - { -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) - std::vector qt_dev_tools_option_parts; - boost::split(qt_dev_tools_option_parts, qt_dev_tools_option, [](char c) { return c == ','; }); - - Qt::Orientation orientation = Qt::Vertical; - if (qt_dev_tools_option_parts.size() >= 1 && qt_dev_tools_option_parts[0] == "horizontal") - orientation = Qt::Horizontal; - - double zoom_factor = 1.3; - if (qt_dev_tools_option_parts.size() >= 2) - epee::string_tools::get_xtype_from_string(zoom_factor, qt_dev_tools_option_parts[1]); - - QSplitter* spliter = new QSplitter(orientation); - spliter->addWidget(m_view); - QWebEngineView* inspector = new QWebEngineView(); - spliter->addWidget(inspector); - m_view->page()->setDevToolsPage(inspector->page()); - inspector->setZoomFactor(zoom_factor); - - spliter->setCollapsible(0, false); - spliter->setCollapsible(1, false); - - QList Sizes; - Sizes.append(0.5 * m_view->sizeHint().height()); - Sizes.append(0.5 * m_view->sizeHint().height()); - spliter->setSizes(Sizes); - - central_widget_to_be_set = spliter; -#else - LOG_ERROR("Qt Dev Tool is not available for this Qt version, try building with Qt 5.11.0 or higher"); -#endif - } - - // register QObjects to be exposed to JavaScript - m_channel->registerObject(QStringLiteral("mediator_object"), this); - - connect(m_view, SIGNAL(loadFinished(bool)), SLOT(on_load_finished(bool))); - - setCentralWidget(central_widget_to_be_set); - //this->setMouseTracking(true); - - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); - - m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); - m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); - m_view->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); - - m_localization.resize(localization_id_couter); - m_localization[localization_id_quit] = "Quit"; - m_localization[localization_id_is_received] = " is received"; - m_localization[localization_id_is_confirmed] = " is confirmed"; - m_localization[localization_id_income_transfer_unconfirmed] = "Income transfer (unconfirmed)"; - m_localization[localization_id_income_transfer_confirmed] = "Income transfer confirmed"; - m_localization[localization_id_locked] = "(locked)"; - m_localization[localization_id_mined] = "(mined)"; - m_localization[localization_id_minimized_title] = "Lethean app is minimized to tray"; - m_localization[localization_id_minimized_text] = "You can restore it with double-click or context menu"; - m_localization[localization_id_tray_menu_show] = "localization_id_tray_menu_show"; - m_localization[localization_id_tray_menu_minimize] = "localization_id_tray_menu_minimize"; - - return true; -} - QString MainWindow::get_default_user_dir(const QString& param) { TRY_ENTRY(); @@ -287,7 +177,7 @@ QString MainWindow::get_options() void MainWindow::tray_quit_requested() { TRY_ENTRY(); - LOG_PRINT_MAGENTA("[GUI]->[HTML] tray_quit_requested", LOG_LEVEL_0); + LOG_PRINT_MAGENTA("[GUI]->[HTML] tray_quit_requested", LOG_LEVEL_0); emit quit_requested("{}"); CATCH_ENTRY2(void()); } @@ -296,7 +186,7 @@ void MainWindow::closeEvent(QCloseEvent *event) { TRY_ENTRY(); LOG_PRINT_L0("[GUI] CLOSE EVENT"); - CHECK_AND_ASSERT_MES(m_gui_deinitialize_done_1 == m_backend_stopped_2, void(), "m_gui_deinitialize_done_1 != m_backend_stopped_2, m_gui_deinitialize_done_1 = " << m_gui_deinitialize_done_1 + CHECK_AND_ASSERT_MES(m_gui_deinitialize_done_1 == m_backend_stopped_2, void(), "m_gui_deinitialize_done_1 != m_backend_stopped_2, m_gui_deinitialize_done_1 = " << m_gui_deinitialize_done_1 << "m_backend_stopped_2 = " << m_backend_stopped_2); @@ -309,7 +199,6 @@ void MainWindow::closeEvent(QCloseEvent *event) } else if (m_gui_deinitialize_done_1 && m_backend_stopped_2) { - store_pos(true); store_app_config(); event->accept(); } @@ -342,53 +231,6 @@ std::string state_to_text(int s) CATCH_ENTRY2(""); } -void MainWindow::changeEvent(QEvent *e) -{ - TRY_ENTRY(); - switch (e->type()) - { - case QEvent::WindowStateChange: - { - QWindowStateChangeEvent* event = static_cast< QWindowStateChangeEvent* >(e); - qDebug() << "Old state: " << state_to_text(event->oldState()).c_str() << ", new state: " << state_to_text(this->windowState()).c_str(); - - if (event->oldState() & Qt::WindowMinimized && !(this->windowState() & Qt::WindowMinimized)) - { - qDebug() << "Window restored (to normal or maximized state)!"; - if (m_tray_icon) - { - //QTimer::singleShot(250, this, SLOT(show())); - } - restore_pos(); - } - else if (!(event->oldState() & Qt::WindowMinimized) && (this->windowState() & Qt::WindowMinimized)) - { - store_pos(); - qDebug() << "Window minimized"; - show_notification(m_localization[localization_id_minimized_title], m_localization[localization_id_minimized_text]); - } - else if (!(event->oldState() & Qt::WindowFullScreen) && (this->windowState() & Qt::WindowFullScreen)) - { - //maximize - store_window_pos(); - this->update(); - } - else if ((event->oldState() & Qt::WindowFullScreen) && !(this->windowState() & Qt::WindowFullScreen)) - { - //restore - this->update(); - } - - break; - } - default: - break; - } - - QWidget::changeEvent(e); - CATCH_ENTRY2(void()); -} - bool MainWindow::store_app_config() { TRY_ENTRY(); @@ -413,42 +255,21 @@ bool MainWindow::load_app_config() bool MainWindow::init(const std::string& html_path) { TRY_ENTRY(); - //QtWebEngine::initialize(); - init_tray_icon(html_path); - set_html_path(html_path); m_threads_pool.init(2); m_backend.subscribe_to_core_events(this); bool r = QSslSocket::supportsSsl(); - if (r) - { + if (r) { LOG_PRINT_GREEN("[Support SSL]: YES", LOG_LEVEL_0); - } - else - { -// QMessageBox::question(this, "OpenSSL support disabled.", "OpenSSL support disabled.", -// QMessageBox::Ok); + } else { LOG_PRINT_RED("[Support SSL]: NO", LOG_LEVEL_0); } - //---- - this->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); - m_view->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); - return true; CATCH_ENTRY2(false); } -void MainWindow::on_menu_show() -{ - TRY_ENTRY(); - qDebug() << "Context menu: show()"; - this->show(); - this->activateWindow(); - CATCH_ENTRY2(void()); -} - -void MainWindow::init_tray_icon(const std::string& html_path) +void MainWindow::init_tray_icon() { TRY_ENTRY(); if (!QSystemTrayIcon::isSystemTrayAvailable()) @@ -457,40 +278,26 @@ void MainWindow::init_tray_icon(const std::string& html_path) return; } - - m_restore_action = std::unique_ptr(new QAction(tr("&Restore"), this)); - connect(m_restore_action.get(), SIGNAL(triggered()), this, SLOT(on_menu_show())); - m_quit_action = std::unique_ptr(new QAction(tr("&Quit"), this)); connect(m_quit_action.get(), SIGNAL(triggered()), this, SLOT(tray_quit_requested())); - m_minimize_action = std::unique_ptr(new QAction(tr("minimizeAction"), this)); - connect(m_minimize_action.get(), SIGNAL(triggered()), this, SLOT(showMinimized())); - m_tray_icon_menu = std::unique_ptr(new QMenu(this)); - m_tray_icon_menu->addAction(m_minimize_action.get()); + m_tray_icon_menu = std::unique_ptr(new QMenu()); //m_tray_icon_menu->addAction(m_restore_action.get()); - m_tray_icon_menu->addSeparator(); m_tray_icon_menu->addAction(m_quit_action.get()); m_tray_icon = std::unique_ptr(new QSystemTrayIcon(this)); m_tray_icon->setContextMenu(m_tray_icon_menu.get()); - //setup icon #ifdef TARGET_OS_MAC - m_normal_icon_path = html_path + "/files/app22macos.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = html_path + "/files/app22macos_blocked.png"; // X11 tray icon size is 22x22 + QIcon qi( ":/lthn.png" ); #else - m_normal_icon_path = html_path + "/files/app22windows.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = html_path + "/files/app22windows_blocked.png"; // X11 tray icon size + QIcon qi( ":/lthn.png" ); #endif //setWindowIcon(QIcon(iconPath.c_str())); - QIcon qi( QString::fromWCharArray(epee::string_encoding::utf8_to_wstring(m_normal_icon_path).c_str()) ); - qi.setIsMask(true); + //qi.setIsMask(true); m_tray_icon->setIcon(qi); - m_tray_icon->setToolTip(CURRENCY_NAME_BASE); - connect(m_tray_icon.get(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); + m_tray_icon->setToolTip( "Lethean Blockchain API Server"); m_tray_icon->show(); CATCH_ENTRY2(void()); } @@ -520,103 +327,6 @@ QString MainWindow::get_log_file() CATCH_ENTRY2(""); } -void MainWindow::store_window_pos() -{ - TRY_ENTRY(); - QPoint pos = this->pos(); - QSize sz = this->size(); - m_config.m_window_position.first = pos.x(); - m_config.m_window_position.second = pos.y(); - m_config.m_window_size.first = sz.height(); - m_config.m_window_size.second = sz.width(); - - CATCH_ENTRY2(void()); -} -void MainWindow::store_pos(bool consider_showed) -{ - TRY_ENTRY(); - m_config.is_maximazed = this->isMaximized(); - //here position supposed to be filled from last unserialize or filled on maximize handler - if (!m_config.is_maximazed) - store_window_pos(); - if (consider_showed) - m_config.is_showed = this->isVisible(); - - CATCH_ENTRY2(void()); -} -void MainWindow::restore_pos(bool consider_showed) -{ - TRY_ENTRY(); - if (m_config.is_maximazed) - { - this->setWindowState(windowState() | Qt::WindowMaximized); - } - else - { - QPoint point = QApplication::desktop()->screenGeometry().bottomRight(); - if (m_config.m_window_position.first + m_config.m_window_size.second > point.x() || - m_config.m_window_position.second + m_config.m_window_size.first > point.y() - ) - { - QSize sz = AUTO_VAL_INIT(sz); - sz.setHeight(770); - sz.setWidth(1200); - this->resize(sz); - store_window_pos(); - //reset position(screen changed or other reason) - } - else - { - QPoint pos = AUTO_VAL_INIT(pos); - QSize sz = AUTO_VAL_INIT(sz); - pos.setX(m_config.m_window_position.first); - pos.setY(m_config.m_window_position.second); - sz.setHeight(m_config.m_window_size.first); - sz.setWidth(m_config.m_window_size.second); - this->move(pos); - this->resize(sz); - } - } - - if (consider_showed) - { - if (m_config.is_showed) - this->showNormal(); - else - this->showMinimized(); - } - - CATCH_ENTRY2(void()); -} -void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason) -{ - TRY_ENTRY(); - if (reason == QSystemTrayIcon::ActivationReason::Trigger) - { - if ( !(this->windowState() & Qt::WindowMinimized)) - { - showMinimized(); - } - else - { - showNormal(); - activateWindow(); - } - - - } - CATCH_ENTRY2(void()); -} - -void MainWindow::load_file(const QString &fileName) -{ - TRY_ENTRY(); - LOG_PRINT_L0("Loading html from path: " << fileName.toStdString()); - QUrl url = QUrl::fromLocalFile(QFileInfo(fileName).absoluteFilePath()); - m_view->load(url); - CATCH_ENTRY2(void()); -} - QString MainWindow::set_clipboard(const QString& param) { TRY_ENTRY(); @@ -647,35 +357,6 @@ QString MainWindow::on_request_quit() CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); } -bool MainWindow::do_close() -{ - TRY_ENTRY(); - this->close(); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::show_inital() -{ - TRY_ENTRY(); - if (load_app_config()) - restore_pos(true); - else - { - m_config = AUTO_VAL_INIT(m_config); - this->show(); - QSize sz = AUTO_VAL_INIT(sz); - sz.setHeight(770); - sz.setWidth(1200); - this->resize(sz); - store_window_pos(); - m_config.is_maximazed = false; - m_config.is_showed = true; - m_config.disable_notifications = false; - } - return true; - CATCH_ENTRY2(false); -} bool MainWindow::on_backend_stopped() { @@ -686,7 +367,7 @@ bool MainWindow::on_backend_stopped() // if (m_quit_requested) // { - /*bool r = */QMetaObject::invokeMethod(this, "do_close", Qt::QueuedConnection); +// /*bool r = */QMetaObject::invokeMethod(this, "do_close", Qt::QueuedConnection); // } return true; CATCH_ENTRY2(false); @@ -712,14 +393,6 @@ bool MainWindow::update_daemon_status(const view::daemon_status_info& info) } -bool MainWindow::show_msg_box(const std::string& message) -{ - TRY_ENTRY(); - QMessageBox::information(this, "Error", message.c_str(), QMessageBox::Ok); - return true; - CATCH_ENTRY2(false); -} - void qt_log_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray local_msg = msg.toLocal8Bit(); @@ -755,13 +428,13 @@ bool MainWindow::remove_ipc() } return true; } - + bool MainWindow::init_ipc_server() { - //in case previous instance wasn't close graceful, ipc channel will remain open and new creation will fail, so we - //trying to close it anyway before open, to make sure there are no dead channels. If there are another running instance, it wom't + //in case previous instance wasn't close graceful, ipc channel will remain open and new creation will fail, so we + //trying to close it anyway before open, to make sure there are no dead channels. If there are another running instance, it wom't //let channel to close, so it will fail later on creating channel remove_ipc(); #define GUI_IPC_BUFFER_SIZE 10000 @@ -790,7 +463,7 @@ bool MainWindow::init_ipc_server() buff.resize(recvd_size, '*'); handle_ipc_event(buff);//todo process token } - } + } remove_ipc(); LOG_PRINT_L0("IPC Handling thread finished"); } @@ -868,20 +541,12 @@ bool MainWindow::init_backend(int argc, char* argv[]) return false; } - if (!init_window()) - { - this->show_msg_box("Failed to main screen launch, check logs for the more detais."); - return false; - } - if (!m_backend.init(this)) { this->show_msg_box("Failed to initialize backend, check debug logs for more details."); return false; } - - if (m_backend.is_qt_logs_enabled()) { qInstallMessageHandler(qt_log_message_handler); @@ -894,6 +559,8 @@ bool MainWindow::init_backend(int argc, char* argv[]) return false; } + init_tray_icon(); + return true; CATCH_ENTRY2(false); } @@ -960,11 +627,11 @@ bool MainWindow::update_wallet_status(const view::wallet_status_info& wsi) { TRY_ENTRY(); m_wallet_states->operator [](wsi.wallet_id) = wsi.wallet_state; - + std::string json_str_pub; epee::serialization::store_t_to_json(static_cast(wsi), json_str_pub, 0, epee::serialization::eol_lf); LOG_PRINT_L0(get_wallet_log_prefix(wsi.wallet_id) + "SENDING SIGNAL -> [update_wallet_status]:" << std::endl << json_str_pub); - + std::string json_str; epee::serialization::store_t_to_json(wsi, json_str, 0, epee::serialization::eol_lf); QMetaObject::invokeMethod(this, "update_wallet_status", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); @@ -1034,7 +701,7 @@ bool MainWindow::update_wallets_info(const view::wallets_summary_info& wsi) std::string json_str; epee::serialization::store_t_to_json(wsi, json_str, 0, epee::serialization::eol_lf); LOG_PRINT_L0("SENDING SIGNAL -> [update_wallets_info]"<< std::endl << json_str ); - + QMetaObject::invokeMethod(this, "update_wallets_info", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); return true; CATCH_ENTRY2(false); @@ -1088,7 +755,7 @@ bool MainWindow::money_transfer(const view::transfer_event_info& tei) else if (tei.ti.unlock_time) msg += m_localization[localization_id_locked]; - + show_notification(title, msg); return true; @@ -1119,21 +786,6 @@ bool MainWindow::wallet_sync_progress(const view::wallet_sync_progres_param& p) CATCH_ENTRY2(false); } -bool MainWindow::set_html_path(const std::string& path) -{ - TRY_ENTRY(); - //init_tray_icon(path); -#ifdef _MSC_VER - QString url = QString::fromUtf8(path.c_str()) + "/index.html"; - load_file(url); -#else -// load_file(QString((std::string("file://") + path + "/index.html").c_str())); - load_file(QString((std::string("") + path + "/index.html").c_str())); -#endif - return true; - CATCH_ENTRY2(false); -} - bool MainWindow::pos_block_found(const currency::block& block_found) { TRY_ENTRY(); @@ -1318,7 +970,7 @@ void MainWindow::on_core_event(const std::string event_name, const currency::cor std::string get_events_que_json_string(const std::list& eq, std::string& methods_list) { TRY_ENTRY(); - //t the moment portable_storage is not supporting polymorphic objects lists, so + //t the moment portable_storage is not supporting polymorphic objects lists, so //there is no hope to make serialization with variant list, lets handle it manual std::stringstream ss; ss << "{ \"events\" : ["; @@ -1350,13 +1002,13 @@ void MainWindow::on_complete_events() TIME_MEASURE_START_MS(json_buff_generate_time); std::string json_buff = get_events_que_json_string(m_events.m_que, methods_list); TIME_MEASURE_FINISH_MS(json_buff_generate_time); - + QMetaObject::invokeMethod(this, "on_core_event", Qt::QueuedConnection, Q_ARG(QString, QString(json_buff.c_str()))); TIME_MEASURE_FINISH_MS(core_events_handl_time); - LOG_PRINT_L0("SENT SIGNAL -> [CORE_EVENTS]: " << m_events.m_que.size() + LOG_PRINT_L0("SENT SIGNAL -> [CORE_EVENTS]: " << m_events.m_que.size() << ", handle_time: " << core_events_handl_time << "(json: " << json_buff_generate_time << ")ms, json_buff size = " << json_buff.size() << ", methods: " << methods_list); LOG_PRINT_L2("CORE_EVENTS sent signal details: " << ENDL << json_buff); m_events.m_que.clear(); @@ -1416,7 +1068,7 @@ QString MainWindow::get_secure_app_data(const QString& param) std::string filename = m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME; std::string res_body; - std::string rsp_code = tools::load_encrypted_file(filename, pwd.pass, res_body, APP_DATA_FILE_BINARY_SIGNATURE); + std::string rsp_code = tools::load_encrypted_file(filename, pwd.pass, res_body, APP_DATA_FILE_BINARY_SIGNATURE); if (rsp_code != API_RETURN_CODE_OK) { view::api_response ar; @@ -1475,7 +1127,7 @@ QString MainWindow::check_master_password(const QString& param) crypto::hash master_password_hash = crypto::cn_fast_hash(&master_password_pre_hash, sizeof master_password_pre_hash); crypto::hash pwd_pre_hash = crypto::cn_fast_hash(pwd.pass.c_str(), pwd.pass.length()); crypto::hash pwd_hash = crypto::cn_fast_hash(&pwd_pre_hash, sizeof pwd_pre_hash); - + if (m_master_password != pwd.pass) { ar.error_code = API_RETURN_CODE_WRONG_PASSWORD; @@ -1561,7 +1213,7 @@ QString MainWindow::store_to_file(const QString& path, const QString& buff) return API_RETURN_CODE_ACCESS_DENIED; } - + CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); } @@ -1686,7 +1338,7 @@ QString MainWindow::set_log_level(const QString& param) epee::log_space::get_set_log_detalisation_level(true, lvl.v); default_ar.error_code = API_RETURN_CODE_OK; LOG_PRINT("[LOG LEVEL]: set to " << lvl.v, LOG_LEVEL_MIN); - + return MAKE_RESPONSE(default_ar); CATCH_ENTRY_FAIL_API_RESPONCE(); } @@ -1724,23 +1376,23 @@ QString MainWindow::set_enable_tor(const QString& param) // QString path = QFileDialog::getOpenFileName(this, "Select file", // "", // ""); -// +// // if (!path.length()) // { // ar.error_code = API_RETURN_CODE_CANCELED; // return MAKE_RESPONSE(ar); // } -// +// // currency::COMMAND_RPC_GET_OFFERS_EX::response rp = AUTO_VAL_INIT(rp); // ar.error_code = m_backend.get_all_offers(rp); -// +// // std::string buff = epee::serialization::store_t_to_json(rp); // bool r = file_io_utils::save_string_to_file(path.toStdString(), buff); // if (!r) // ar.error_code = API_RETURN_CODE_FAIL; // else // ar.error_code = API_RETURN_CODE_OK; -// +// // return MAKE_RESPONSE(ar); // } @@ -1752,55 +1404,6 @@ QString MainWindow::webkit_launched_script() CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); } //////////////////// -QString MainWindow::show_openfile_dialog(const QString& param) -{ - TRY_ENTRY(); - view::system_filedialog_request ofdr = AUTO_VAL_INIT(ofdr); - view::system_filedialog_response ofdres = AUTO_VAL_INIT(ofdres); - if (!epee::serialization::load_t_from_json(ofdr, param.toStdString())) - { - ofdres.error_code = API_RETURN_CODE_BAD_ARG; - return epee::serialization::store_t_to_json(ofdres, 0, epee::serialization::eol_lf).c_str(); - } - - QString path = QFileDialog::getOpenFileName(this, ofdr.caption.c_str(), - ofdr.default_dir.c_str(), - ofdr.filemask.c_str()); - - if (!path.length()) - { - ofdres.error_code = API_RETURN_CODE_CANCELED; - return epee::serialization::store_t_to_json(ofdres, 0, epee::serialization::eol_lf).c_str(); - } - - ofdres.error_code = API_RETURN_CODE_OK; - ofdres.path = path.toStdString(); - return MAKE_RESPONSE(ofdres); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -QString MainWindow::show_savefile_dialog(const QString& param) -{ - TRY_ENTRY(); - PREPARE_ARG_FROM_JSON(view::system_filedialog_request, ofdr); - view::system_filedialog_response ofdres = AUTO_VAL_INIT(ofdres); - - QString path = QFileDialog::getSaveFileName(this, ofdr.caption.c_str(), - ofdr.default_dir.c_str(), - ofdr.filemask.c_str()); - - if (!path.length()) - { - ofdres.error_code = API_RETURN_CODE_CANCELED; - return epee::serialization::store_t_to_json(ofdres, 0, epee::serialization::eol_lf).c_str(); - } - - ofdres.error_code = API_RETURN_CODE_OK; - ofdres.path = path.toStdString(); - return MAKE_RESPONSE(ofdres); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} QString MainWindow::close_wallet(const QString& param) { @@ -2005,7 +1608,7 @@ QString MainWindow::push_offer(const QString& param) ar.error_code = m_backend.push_offer(a.wallet_id, a.od, res_tx); if (ar.error_code != API_RETURN_CODE_OK) return MAKE_RESPONSE(ar); - + ar.response_data.success = true; ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); @@ -2228,43 +1831,6 @@ QString MainWindow::get_seed_phrase_info(const QString& param) CATCH_ENTRY_FAIL_API_RESPONCE(); } -void MainWindow::contextMenuEvent(QContextMenuEvent * event) -{ - TRY_ENTRY(); - - CATCH_ENTRY2(void()); -} -QString MainWindow::print_text(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::print_text_param, ptp); - - //in >> htmlContent; - - QTextDocument *document = new QTextDocument(); - document->setHtml(ptp.html_text.c_str()); - - QPrinter printer; - default_ar.error_code = API_RETURN_CODE_CANCELED; - - QPrintDialog *dialog = new QPrintDialog(&printer, this); - dialog->setOptions(QAbstractPrintDialog::PrintToFile); - auto res = dialog->exec(); - if (res != QDialog::Accepted) - { - LOG_PRINT_L0("[PRINT_TEXT] exec != QDialog::Accepted, res=" << res); - return MAKE_RESPONSE(default_ar); - } - - document->print(&printer); - - delete document; - default_ar.error_code = API_RETURN_CODE_OK; - LOG_PRINT_L0("[PRINT_TEXT] default_ar.error_code = " << default_ar.error_code); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} QString MainWindow::print_log(const QString& param) { @@ -2282,9 +1848,9 @@ void MainWindow::show_notification(const std::string& title, const std::string& { TRY_ENTRY(); LOG_PRINT_L1("system notification: \"" << title << "\", \"" << message << "\""); - + // it's expected that title and message are utf-8 encoded! - + #if !defined(__APPLE__) // use Qt tray icon to show messages on Windows and Linux CHECK_AND_ASSERT_MES(m_tray_icon != nullptr, (void)(0), "m_tray_icon is null!"); @@ -2295,5 +1861,13 @@ void MainWindow::show_notification(const std::string& title, const std::string& #endif CATCH_ENTRY2(void()); } - - +QString MainWindow::get_wallet_info(const QString& param) +{ + TRY_ENTRY(); + LOG_API_TIMING(); + PREPARE_ARG_FROM_JSON(view::wallet_id_obj, waid); + PREPARE_RESPONSE(view::wallet_info, ar); + ar.error_code = m_backend.get_wallet_info(waid.wallet_id, ar.response_data); + return MAKE_RESPONSE(ar); + CATCH_ENTRY_FAIL_API_RESPONCE(); +} diff --git a/src/gui/qt-daemon/application/mainwindow.h b/src/gui/mainwindow.h similarity index 91% rename from src/gui/qt-daemon/application/mainwindow.h rename to src/gui/mainwindow.h index f01dbe93f..46ec587fc 100644 --- a/src/gui/qt-daemon/application/mainwindow.h +++ b/src/gui/mainwindow.h @@ -32,15 +32,15 @@ QT_END_NAMESPACE // class MediatorObject : public QObject // { // Q_OBJECT -// +// // public: -// +// // signals : // /*! // This signal is emitted from the C++ side and the text displayed on the HTML client side. // */ // void from_c_to_html(const QString &text); -// +// // public slots: // /*! // This slot is invoked from the HTML client side and the text displayed on the server side. @@ -49,25 +49,24 @@ QT_END_NAMESPACE // }; // -class MainWindow : public QMainWindow, +class MainWindow : public QObject, public currency::i_core_event_handler, - public view::i_view, + public view::i_view, public QAbstractNativeEventFilter { Q_OBJECT -public: + public: MainWindow(); ~MainWindow(); bool init_backend(int argc, char* argv[]); - bool show_inital(); void show_notification(const std::string& title, const std::string& message); bool handle_ipc_event(const std::string& arguments); struct app_config { - + epee::kvserializable_pair m_window_position; epee::kvserializable_pair m_window_size; bool is_maximazed; @@ -86,12 +85,9 @@ class MainWindow : public QMainWindow, protected slots: void on_load_finished(bool ok); - bool do_close(); public slots: - QString show_openfile_dialog(const QString& param); - QString show_savefile_dialog(const QString& param); QString open_wallet(const QString& param); QString get_my_offers(const QString& param); QString get_fav_offers(const QString& param); @@ -156,7 +152,6 @@ class MainWindow : public QMainWindow, QString toggle_autostart(const QString& param); QString is_valid_restore_wallet_text(const QString& param); QString get_seed_phrase_info(const QString& param); - QString print_text(const QString& param); QString print_log(const QString& param); QString set_clipboard(const QString& param); QString set_localization_strings(const QString str); @@ -166,9 +161,9 @@ class MainWindow : public QMainWindow, QString get_exchange_last_top(const QString& params); QString get_tx_pool_info(); QString get_default_fee(); - QString get_options(); + QString get_options(); void bool_toggle_icon(const QString& param); - + bool get_is_disabled_notifications(); bool set_is_disabled_notifications(const bool& param); QString export_wallet_history(const QString& param); @@ -176,15 +171,13 @@ class MainWindow : public QMainWindow, QString check_available_sources(const QString& param); QString open_url_in_browser(const QString& param); - void trayIconActivated(QSystemTrayIcon::ActivationReason reason); void tray_quit_requested(); - void on_menu_show(); QString is_remnotenode_mode_preconfigured(); QString start_backend(const QString& params); QString async_call(const QString& func_name, const QString& params); QString sync_call(const QString& func_name, const QString& params); - + QString get_wallet_info(const QString& param); //for test purposes onlys QString request_dummy(); @@ -213,7 +206,6 @@ class MainWindow : public QMainWindow, //------- i_view --------- virtual bool update_daemon_status(const view::daemon_status_info& info); virtual bool on_backend_stopped(); - virtual bool show_msg_box(const std::string& message); virtual bool update_wallet_status(const view::wallet_status_info& wsi); virtual bool update_wallets_info(const view::wallets_summary_info& wsi); virtual bool money_transfer(const view::transfer_event_info& tei); @@ -229,34 +221,23 @@ class MainWindow : public QMainWindow, void closeEvent(QCloseEvent *event); - void contextMenuEvent(QContextMenuEvent * event); - void changeEvent(QEvent *e); void on_maximized(); bool handle_deeplink_params_in_commandline(); //void setOrientation(Qt::ScreenOrientation orientation); - - - void init_tray_icon(const std::string& htmlPath); + + + void init_tray_icon(); bool set_html_path(const std::string& path); void load_file(const QString &fileName); - void store_pos(bool consider_showed = false); - void store_window_pos(); - void restore_pos(bool consider_showed = false); bool store_app_config(); bool load_app_config(); bool init_window(); bool init_ipc_server(); bool remove_ipc(); - - - std::string get_wallet_log_prefix(size_t wallet_id) const { return m_backend.get_wallet_log_prefix(wallet_id); } - //MediatorObject mo; - // UI - QWebEngineView *m_view; - QWebChannel* m_channel; + std::string get_wallet_log_prefix(size_t wallet_id) const { return m_backend.get_wallet_log_prefix(wallet_id); } // DATA wallets_manager m_backend; @@ -269,7 +250,6 @@ class MainWindow : public QMainWindow, std::string m_master_password; - app_config m_config; epee::locked_object> m_wallet_states; @@ -277,7 +257,7 @@ class MainWindow : public QMainWindow, struct events_que_struct { std::list m_que; - + BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(m_que) END_KV_SERIALIZE_MAP() @@ -289,10 +269,10 @@ class MainWindow : public QMainWindow, enum localization_string_indices { // order is surprisingly important here! (see also updateLocalisation in AppController.js) - localization_id_quit = 0, + localization_id_quit = 0, localization_id_is_received, - localization_id_is_confirmed, - localization_id_income_transfer_unconfirmed, + localization_id_is_confirmed, + localization_id_income_transfer_unconfirmed, localization_id_income_transfer_confirmed, localization_id_mined, localization_id_locked, diff --git a/src/gui/qt-daemon/application/notification_helper.h b/src/gui/notification_helper.h similarity index 100% rename from src/gui/qt-daemon/application/notification_helper.h rename to src/gui/notification_helper.h diff --git a/src/gui/qt-daemon/application/notification_helper.mm b/src/gui/notification_helper.mm similarity index 100% rename from src/gui/qt-daemon/application/notification_helper.mm rename to src/gui/notification_helper.mm diff --git a/src/gui/qt-daemon/.gitignore b/src/gui/qt-daemon/.gitignore deleted file mode 100644 index 8a9d35c88..000000000 --- a/src/gui/qt-daemon/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.user diff --git a/src/gui/qt-daemon/Info.plist.in b/src/gui/qt-daemon/Info.plist.in deleted file mode 100644 index e966d32ee..000000000 --- a/src/gui/qt-daemon/Info.plist.in +++ /dev/null @@ -1,63 +0,0 @@ - - - - - LSEnvironment - - - BuildMachineOSBuild - 14E46 - CFBundleDevelopmentRegion - English - CFBundleExecutable - Lethean - CFBundleIconFile - app.icns - CFBundleInfoDictionaryVersion - 6.0 - CFBundleLongVersionString - - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - - CFBundleIdentifier - Lethean - CSResourcesFileMapped - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 6E35b - DTPlatformVersion - GM - DTSDKBuild - 14D125 - DTSDKName - macosx10.10 - DTXcode - 0640 - DTXcodeBuild - 6E35b - LSRequiresCarbon - - NSHumanReadableCopyright - - NSHighResolutionCapable - True - CFBundleURLTypes - - - CFBundleURLName - LetheanApp - CFBundleURLSchemes - - lethean - - - - - - diff --git a/src/gui/qt-daemon/app.icns b/src/gui/qt-daemon/app.icns deleted file mode 100644 index 50e0fad5ce9a7d429e6ecacfd5dde34033e2cbe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89211 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�ZNBIeijYhp_bRpQ|mv?{vWwIeS;79xo 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

rQmYP#m8;nJ&9s{|A8U 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 diff --git a/src/gui/qt-daemon/app.qrc b/src/gui/qt-daemon/app.qrc deleted file mode 100644 index b828a4508..000000000 --- a/src/gui/qt-daemon/app.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - app.ico - - \ No newline at end of file diff --git a/src/gui/qt-daemon/app.rc b/src/gui/qt-daemon/app.rc deleted file mode 100644 index 05c8afbc3..000000000 --- a/src/gui/qt-daemon/app.rc +++ /dev/null @@ -1,2 +0,0 @@ - -IDI_ICON1 ICON DISCARDABLE "app.ico" \ No newline at end of file diff --git a/src/gui/qt-daemon/layout b/src/gui/qt-daemon/layout deleted file mode 160000 index f336b3d94..000000000 --- a/src/gui/qt-daemon/layout +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f336b3d94184e0e02e3b49f1819809c78018ffed diff --git a/src/gui/qt-daemon/main.cpp b/src/gui/qt-daemon/main.cpp deleted file mode 100644 index 84edebc74..000000000 --- a/src/gui/qt-daemon/main.cpp +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include -#include "application/mainwindow.h" -#include "qdebug.h" -#include -#include -//#include "qtlogger.h" -#include "include_base_utils.h" -#include "currency_config.h" -#ifdef Q_OS_DARWIN -#include "application/urleventfilter.h" -#endif - -int main(int argc, char *argv[]) -{ -//#if defined(ARCH_CPU_X86_64) && _MSC_VER <= 1800 - // VS2013's CRT only checks the existence of FMA3 instructions, not the - // enabled-ness of them at the OS level (this is fixed in VS2015). We force - // off usage of FMA3 instructions in the CRT to avoid using that path and - // hitting illegal instructions when running on CPUs that support FMA3, but - // OSs that don't. Because we use the static library CRT we have to call - // this function once in each DLL. - // See http://crbug.com/436603. -// _set_FMA3_enable(0); -//#endif // ARCH_CPU_X86_64 && _MSC_VER <= 1800 - - if(argc > 1) - std::cout << argv[1] << std::endl; - -#ifdef _MSC_VER - #ifdef _WIN64 - _set_FMA3_enable(0); - #endif - //mutex to let InnoSetup know about running instance - ::CreateMutex(NULL, FALSE, CURRENCY_NAME_BASE "_instance"); - //::CreateMutex(NULL, FALSE, "Global\\" CURRENCY_NAME_BASE "_instance"); -#endif - - -#ifdef WIN32 - WCHAR sz_file_name[MAX_PATH + 1] = L""; - ::GetModuleFileNameW(NULL, sz_file_name, MAX_PATH + 1); - std::string path_to_process_utf8 = epee::string_encoding::wstring_to_utf8(sz_file_name); -#else - std::string path_to_process_utf8 = argv[0]; -#endif - - TRY_ENTRY(); - epee::string_tools::set_module_name_and_folder(path_to_process_utf8); - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); -#ifdef _MSC_VER -#if _MSC_VER >= 1910 - QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); //HiDPI pixmaps - qputenv("QT_SCALE_FACTOR", "0.75"); -#endif -#endif - - log_space::get_set_log_detalisation_level(true, LOG_LEVEL_0); - log_space::get_set_need_thread_id(true, true); - log_space::log_singletone::enable_channels("core,currency_protocol,tx_pool,p2p,wallet"); - - - QApplication app(argc, argv); - - MainWindow viewer; - if (!viewer.init_backend(argc, argv)) - { - return 1; - } - -#ifdef Q_OS_DARWIN - URLEventFilter url_event_filter(&viewer); - app.installEventFilter(&url_event_filter); -#endif - - app.installNativeEventFilter(&viewer); - viewer.setWindowTitle(CURRENCY_NAME_BASE); - viewer.show_inital(); - - int res = app.exec(); - LOG_PRINT_L0("Process exit with code: " << res); - return res; - CATCH_ENTRY2(0); -} diff --git a/src/gui/qt-daemon/qtlogger.h b/src/gui/qt-daemon/qtlogger.h deleted file mode 100644 index b1ff2e765..000000000 --- a/src/gui/qt-daemon/qtlogger.h +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#pragma once - -#include - -//#define QT_CONSOLE_STREAM qDebug() - -#define QT_CONSOLE_STREAM(s) \ -{std::stringstream ss; ss << s; fputs(ss.str().c_str(), stderr); fflush(stderr);} - - - -//fputs(buf.c_str(), stderr); -//fflush(stderr); - - -void customHandler(QtMsgType type, const char* msg) { - fputs(msg, stderr); - fflush(stderr); -} - - -class qt_console_stream : public epee::log_space::ibase_log_stream -{ - QDebug db; -public: - qt_console_stream() : db(qDebug()) - { - // Somewhere in your program - //qInstallMsgHandler(customHandler); - } - - ~qt_console_stream() - { - } - - int get_type(){ return LOGGER_CONSOLE; } - - inline void set_console_color(int color, bool bright) - { - switch (color) - { - case epee::log_space::console_color_default: - if (bright) - {QT_CONSOLE_STREAM("\033[1;37m");} - else - {QT_CONSOLE_STREAM("\033[0m");} - break; - case epee::log_space::console_color_white: - if (bright) - {QT_CONSOLE_STREAM("\033[1;37m");} - else - {QT_CONSOLE_STREAM("\033[0;37m");} - break; - case epee::log_space::console_color_red: - if (bright) - {QT_CONSOLE_STREAM("\033[1;31m");} - else - {QT_CONSOLE_STREAM("\033[0;31m");} - break; - case epee::log_space::console_color_green: - if (bright) - {QT_CONSOLE_STREAM("\033[1;32m");} - else - {QT_CONSOLE_STREAM("\033[0;32m");} - break; - - case epee::log_space::console_color_blue: - if (bright) - {QT_CONSOLE_STREAM("\033[1;34m");} - else - {QT_CONSOLE_STREAM("\033[0;34m");} - break; - - case epee::log_space::console_color_cyan: - if (bright) - {QT_CONSOLE_STREAM("\033[1;36m");} - else - {QT_CONSOLE_STREAM("\033[0;36m");} - break; - - case epee::log_space::console_color_magenta: - if (bright) - {QT_CONSOLE_STREAM("\033[1;35m");} - else - {QT_CONSOLE_STREAM("\033[0;35m");} - break; - - case epee::log_space::console_color_yellow: - if (bright) - {QT_CONSOLE_STREAM("\033[1;33m");} - else - {QT_CONSOLE_STREAM("\033[0;33m");} - break; - - } - } - - inline void reset_console_color() - { - {QT_CONSOLE_STREAM("\033[0m");} - } - - virtual bool out_buffer(const char* buffer, int buffer_len, int log_level, int color, const char* plog_name = NULL) - { - if (plog_name) - return true; //skip alternative logs from console - - set_console_color(color, log_level < 1); - - std::string buf(buffer, buffer_len); - for (size_t i = 0; i != buf.size(); i++) - { - if (buf[i] == 7 || buf[i] == -107) - buf[i] = '^'; - //remove \n - //if (i == buf.size()-1) - // buf[i] = ' '; - } - - QT_CONSOLE_STREAM(buf.c_str()); - - - reset_console_color(); - return true; - } - - -}; diff --git a/src/gui/resources/app22macos.png b/src/gui/resources/app22macos.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc0f796bd31b0478c4151b4aacfe47603b709b2 GIT binary patch literal 8162 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 literal 0 HcmV?d00001 diff --git a/src/gui/resources/desktop_linux_icon.png b/src/gui/resources/desktop_linux_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad457440bd8c2cd1eec8366cf6416faf51dbae94 GIT binary patch literal 4488 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 Vd2c1TM+^UzP~F$LU2zFX{V)5s9y9;| literal 0 HcmV?d00001 diff --git a/src/gui/resources/files.qrc b/src/gui/resources/files.qrc new file mode 100644 index 000000000..a42e00bb1 --- /dev/null +++ b/src/gui/resources/files.qrc @@ -0,0 +1,7 @@ + + + app22macos.png + app22windows.png + lthn.png + + diff --git a/src/gui/resources/lthn.png b/src/gui/resources/lthn.png new file mode 100644 index 0000000000000000000000000000000000000000..0958f3453276402fe1eddde9017381b0f77f800c GIT binary patch literal 82294 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

RVcw3`>rs+U`h>yUJ>8y*$AhW&xKLt* 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�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�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 + +/*! + \brief Wraps connected QWebSockets clients in WebSocketTransport objects. + + This code is all that is required to connect incoming WebSockets to the WebChannel. Any kind + of remote JavaScript client that supports WebSockets can thus receive messages and access the + published objects. +*/ + +/*! + Construct the client wrapper with the given parent. + + All clients connecting to the QWebSocketServer will be automatically wrapped + in WebSocketTransport objects. +*/ +WebSocketClientWrapper::WebSocketClientWrapper(QWebSocketServer *server, QObject *parent) + : QObject(parent) + , m_server(server) +{ + connect(server, &QWebSocketServer::newConnection, + this, &WebSocketClientWrapper::handleNewConnection); +} + +/*! + Wrap an incoming WebSocket connection in a WebSocketTransport object. +*/ +void WebSocketClientWrapper::handleNewConnection() +{ + emit clientConnected(new WebSocketTransport(m_server->nextPendingConnection())); +} diff --git a/src/gui/websocketclientwrapper.h b/src/gui/websocketclientwrapper.h new file mode 100644 index 000000000..376fad9a1 --- /dev/null +++ b/src/gui/websocketclientwrapper.h @@ -0,0 +1,29 @@ +#ifndef WEBSOCKETCLIENTWRAPPER_H +#define WEBSOCKETCLIENTWRAPPER_H + +#include + +class WebSocketTransport; + +QT_BEGIN_NAMESPACE +class QWebSocketServer; +QT_END_NAMESPACE + +class WebSocketClientWrapper : public QObject +{ + Q_OBJECT + + public: + explicit WebSocketClientWrapper(QWebSocketServer *server, QObject *parent = nullptr); + + signals: + void clientConnected(WebSocketTransport *client); + + private slots: + void handleNewConnection(); + + private: + QWebSocketServer *m_server; +}; + +#endif // WEBSOCKETCLIENTWRAPPER_H diff --git a/src/gui/websockettransport.cpp b/src/gui/websockettransport.cpp new file mode 100644 index 000000000..145ff8b3b --- /dev/null +++ b/src/gui/websockettransport.cpp @@ -0,0 +1,64 @@ +#include "websockettransport.h" + +#include +#include +#include +#include + +/*! + \brief QWebChannelAbstractSocket implementation that uses a QWebSocket internally. + + The transport delegates all messages received over the QWebSocket over its + textMessageReceived signal. Analogously, all calls to sendTextMessage will + be send over the QWebSocket to the remote client. +*/ + +/*! + Construct the transport object and wrap the given socket. + + The socket is also set as the parent of the transport object. +*/ +WebSocketTransport::WebSocketTransport(QWebSocket *socket) + : QWebChannelAbstractTransport(socket) + , m_socket(socket) +{ + connect(socket, &QWebSocket::textMessageReceived, + this, &WebSocketTransport::textMessageReceived); + connect(socket, &QWebSocket::disconnected, + this, &WebSocketTransport::deleteLater); +} + +/*! + Destroys the WebSocketTransport. +*/ +WebSocketTransport::~WebSocketTransport() +{ + m_socket->deleteLater(); +} + +/*! + Serialize the JSON message and send it as a text message via the WebSocket to the client. +*/ +void WebSocketTransport::sendMessage(const QJsonObject &message) +{ + QJsonDocument doc(message); + m_socket->sendTextMessage(QString::fromUtf8(doc.toJson(QJsonDocument::Compact))); +} + +/*! + Deserialize the stringified JSON messageData and emit messageReceived. +*/ +void WebSocketTransport::textMessageReceived(const QString &messageData) +{ + QJsonParseError error; + QJsonDocument message = QJsonDocument::fromJson(messageData.toUtf8(), &error); + if (error.error) { + qWarning() << "Failed to parse text message as JSON object:" << messageData + << "Error is:" << error.errorString(); + return; + } else if (!message.isObject()) { + qWarning() << "Received JSON message that is not an object: " << messageData; + return; + } + emit messageReceived(message.object(), this); +} diff --git a/src/gui/websockettransport.h b/src/gui/websockettransport.h new file mode 100644 index 000000000..b3018385e --- /dev/null +++ b/src/gui/websockettransport.h @@ -0,0 +1,26 @@ +#ifndef WEBSOCKETTRANSPORT_H +#define WEBSOCKETTRANSPORT_H + +#include + +QT_BEGIN_NAMESPACE +class QWebSocket; +QT_END_NAMESPACE + +class WebSocketTransport : public QWebChannelAbstractTransport +{ + Q_OBJECT + public: + explicit WebSocketTransport(QWebSocket *socket); + virtual ~WebSocketTransport(); + + void sendMessage(const QJsonObject &message) override; + + private slots: + void textMessageReceived(const QString &message); + + private: + QWebSocket *m_socket; +}; + +#endif // WEBSOCKETTRANSPORT_H diff --git a/utils/build/testnet_linux_gui.sh b/utils/build/testnet_linux_gui.sh index 07802f6bd..435214ea9 100755 --- a/utils/build/testnet_linux_gui.sh +++ b/utils/build/testnet_linux_gui.sh @@ -1,38 +1,6 @@ #!/bin/bash -x -# Environment prerequisites: -# 1) QT_PREFIX_PATH should be set to Qt libs folder -# 2) BOOST_ROOT should be set to the root of Boost -# 3) OPENSSL_ROOT_DIR should be set to the root of OpenSSL -# -# for example, place these lines to the end of your ~/.bashrc : -# -# export BOOST_ROOT=/home/user/boost_1_66_0 -# export QT_PREFIX_PATH=/home/user/Qt5.10.1/5.10.1/gcc_64 -# export OPENSSL_ROOT_DIR=/home/user/openssl - -ARCHIVE_NAME_PREFIX=lethean-linux-x64- - -: "${BOOST_ROOT:?BOOST_ROOT should be set to the root of Boost, ex.: /home/user/boost_1_66_0}" -: "${QT_PREFIX_PATH:?QT_PREFIX_PATH should be set to Qt libs folder, ex.: /home/user/Qt5.10.1/5.10.1/gcc_64}" -: "${OPENSSL_ROOT_DIR:?OPENSSL_ROOT_DIR should be set to OpenSSL root folder, ex.: /home/user/openssl}" - -if [ -n "$build_prefix" ]; then - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}${build_prefix}- - build_prefix_label="$build_prefix " -fi - -if [ "$testnet" == true ]; then - testnet_def="-D TESTNET=TRUE" - testnet_label="testnet " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}testnet- -fi - -if [ "$testnet" == true ] || [ -n "$qt_dev_tools" ]; then - copy_qt_dev_tools=true - copy_qt_dev_tools_label="devtools " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}devtools- -fi +ARCHIVE_NAME_PREFIX=lethean-gui-bundle-linux-testnet-$(arch) prj_root=$(pwd) @@ -40,81 +8,25 @@ prj_root=$(pwd) echo "---------------- BUILDING PROJECT ----------------" echo "--------------------------------------------------" -echo "Building...." +echo "Building...." -rm -rf build; mkdir -p build/release; cd build/release; -cmake $testnet_def -D STATIC=true -D ARCH=x86-64 -D BUILD_GUI=TRUE -D OPENSSL_ROOT_DIR="$OPENSSL_ROOT_DIR" -D CMAKE_PREFIX_PATH="$QT_PREFIX_PATH" -D CMAKE_BUILD_TYPE=Release ../.. +rm -rf build; mkdir -p build/release; cd build/release; +cmake -D TESTNET=TRUE -D STATIC=true -D ARCH=x86-64 -D BUILD_GUI=TRUE -D CMAKE_BUILD_TYPE=Release ../.. if [ $? -ne 0 ]; then echo "Failed to run cmake" exit 1 fi -make -j daemon simplewallet connectivity_tool +make -j2 Lethean if [ $? -ne 0 ]; then echo "Failed to make!" exit 1 fi -make -j Lethean -if [ $? -ne 0 ]; then - echo "Failed to make!" - exit 1 -fi - - -read version_str <<< $(./src/letheand --version | awk '/^Lethean/ { print $2 }') -version_str=${version_str} -echo $version_str - -rm -rf Lethean; -mkdir -p Lethean; - -rsync -a ../../src/gui/qt-daemon/layout/html ./Lethean --exclude less --exclude package.json --exclude gulpfile.js -cp -Rv ../../utils/Lethean.sh ./Lethean -chmod 777 ./Lethean/Lethean.sh -mkdir ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libicudata.so.56 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libicui18n.so.56 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libicuuc.so.56 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Core.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5DBus.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Gui.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Network.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5OpenGL.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Positioning.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5PrintSupport.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Qml.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Quick.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Sensors.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Sql.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5Widgets.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngine.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngineCore.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngineWidgets.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5WebChannel.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5XcbQpa.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/lib/libQt5QuickWidgets.so.5 ./Lethean/lib -cp $QT_PREFIX_PATH/libexec/QtWebEngineProcess ./Lethean -cp $QT_PREFIX_PATH/resources/qtwebengine_resources.pak ./Lethean -cp $QT_PREFIX_PATH/resources/qtwebengine_resources_100p.pak ./Lethean -cp $QT_PREFIX_PATH/resources/qtwebengine_resources_200p.pak ./Lethean -cp $QT_PREFIX_PATH/resources/icudtl.dat ./Lethean - -if [ "$copy_qt_dev_tools" = true ] ; then - cp $QT_PREFIX_PATH/resources/qtwebengine_devtools_resources.pak ./Lethean -fi - -mkdir ./Lethean/lib/platforms -cp $QT_PREFIX_PATH/plugins/platforms/libqxcb.so ./Lethean/lib/platforms -mkdir ./Lethean/xcbglintegrations -cp $QT_PREFIX_PATH/plugins/xcbglintegrations/libqxcb-glx-integration.so ./Lethean/xcbglintegrations - -cp -Rv src/letheand src/Lethean src/simplewallet src/connectivity_tool ./Lethean - -package_filename=${ARCHIVE_NAME_PREFIX}${version_str}.tar.bz2 +package_filename=${ARCHIVE_NAME_PREFIX}.tar.bz2 rm -f ./$package_filename -tar -cjvf $package_filename Lethean +tar -cjvf ../../$package_filename src/lethean-gui-server if [ $? -ne 0 ]; then echo "Failed to pack" exit 1 @@ -122,6 +34,4 @@ fi echo "Build success" - - exit 0 diff --git a/utils/build/testnet_mac_osx_cli.sh b/utils/build/testnet_mac_osx_cli.sh index 983172f03..11cf3d249 100755 --- a/utils/build/testnet_mac_osx_cli.sh +++ b/utils/build/testnet_mac_osx_cli.sh @@ -39,8 +39,6 @@ fi rm -rf Lethean; mkdir -p Lethean; - - chmod 0777 ./src/letheand src/simplewallet src/connectivity_tool cp -Rv src/letheand src/simplewallet src/connectivity_tool ./Lethean diff --git a/utils/build/testnet_mac_osx_gui.sh b/utils/build/testnet_mac_osx_gui.sh index 7172909e9..423e2addb 100755 --- a/utils/build/testnet_mac_osx_gui.sh +++ b/utils/build/testnet_mac_osx_gui.sh @@ -9,41 +9,22 @@ curr_path=${BASH_SOURCE%/*} : "${CMAKE_OSX_SYSROOT:?CMAKE_OSX_SYSROOT should be set to macOS SDK path, e.g.: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk}" : "${OPENSSL_ROOT_DIR:?variable not set, see also macosx_build_config.command}" -ARCHIVE_NAME_PREFIX=lethean-macos-x64- - -if [ -n "$build_prefix" ]; then - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}${build_prefix}- - build_prefix_label="$build_prefix " -fi - -testnet_def="-D TESTNET=TRUE" -testnet_label="testnet " -ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}testnet- - +ARCHIVE_NAME_PREFIX=lethean-gui-bundle-macos-testnet-$(arch) rm -rf build; mkdir -p build/release; cd build/release; -cmake $testnet_def -D OPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR -D CMAKE_OSX_SYSROOT=$CMAKE_OSX_SYSROOT -D BUILD_GUI=TRUE -D CMAKE_PREFIX_PATH="$ZANO_QT_PATH" -D CMAKE_BUILD_TYPE=Release -D BOOST_ROOT="$ZANO_BOOST_ROOT" -D BOOST_LIBRARYDIR="$ZANO_BOOST_LIBS_PATH" ../.. +cmake -D TESTNET=TRUE -D OPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR -D CMAKE_OSX_SYSROOT=$CMAKE_OSX_SYSROOT -D BUILD_GUI=TRUE -D CMAKE_PREFIX_PATH="$ZANO_QT_PATH" -D CMAKE_BUILD_TYPE=Release -D BOOST_ROOT="$ZANO_BOOST_ROOT" -D BOOST_LIBRARYDIR="$ZANO_BOOST_LIBS_PATH" ../.. if [ $? -ne 0 ]; then echo "Failed to cmake" exit 1 fi - - -make -j Lethean +make -j2 Lethean if [ $? -ne 0 ]; then echo "Failed to make Lethean" exit 1 fi -make -j connectivity_tool daemon simplewallet -if [ $? -ne 0 ]; then - echo "Failed to make binaries!" - exit 1 -fi - - cd src/ if [ $? -ne 0 ]; then echo "Failed to cd src" @@ -51,167 +32,33 @@ if [ $? -ne 0 ]; then fi # copy all necessary libs into the bundle in order to workaround El Capitan's SIP restrictions -mkdir -p Lethean.app/Contents/Frameworks/boost_libs -cp -R "$ZANO_BOOST_LIBS_PATH/" Lethean.app/Contents/Frameworks/boost_libs/ +mkdir -p lethean-gui-server.app/Contents/Frameworks/boost_libs +cp -R "$ZANO_BOOST_LIBS_PATH/" lethean-gui-server.app/Contents/Frameworks/boost_libs/ if [ $? -ne 0 ]; then echo "Failed to cp workaround to MacOS" exit 1 fi -# rename process name to big letter -mv Lethean.app/Contents/MacOS/lethean Lethean.app/Contents/MacOS/Lethean -if [ $? -ne 0 ]; then - echo "Failed to rename process" - exit 1 -fi - -cp letheand simplewallet Lethean.app/Contents/MacOS/ -if [ $? -ne 0 ]; then - echo "Failed to copy binaries to Lethean.app folder" - exit 1 -fi - # fix boost libs paths in main executable and libs to workaround El Capitan's SIP restrictions source $(pwd)/../../../utils/build/extras/macos/fix_boost_libs_path.sh -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Lethean.app/Contents/MacOS/Lethean -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Lethean.app/Contents/MacOS/simplewallet -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Lethean.app/Contents/MacOS/letheand -fix_boost_libs_in_libs @executable_path/../Frameworks/boost_libs Lethean.app/Contents/Frameworks/boost_libs +fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs lethean-gui-server.app/Contents/MacOS/lethean-gui-server +fix_boost_libs_in_libs @executable_path/../Frameworks/boost_libs lethean-gui-server.app/Contents/Frameworks/boost_libs -"$ZANO_QT_PATH/bin/macdeployqt" Lethean.app +"$ZANO_QT_PATH/bin/macdeployqt" lethean-gui-server.app if [ $? -ne 0 ]; then - echo "Failed to macdeployqt Lethean.app" + echo "Failed to macdeployqt lethean-gui-server.app" exit 1 fi - - -rsync -a ../../../src/gui/qt-daemon/layout/html Lethean.app/Contents/MacOS --exclude less --exclude package.json --exclude gulpfile.js -if [ $? -ne 0 ]; then - echo "Failed to cp html to MacOS" - exit 1 -fi - -cp ../../../src/gui/qt-daemon/app.icns Lethean.app/Contents/Resources -if [ $? -ne 0 ]; then - echo "Failed to cp app.icns to resources" - exit 1 -fi - -codesign -s "Developer ID Application: Lethean LTD (W2DNA5L5DY)" --timestamp --options runtime -f --entitlements ../../../utils/build/extras/macos/entitlements.plist --deep ./Lethean.app -if [ $? -ne 0 ]; then - echo "Failed to sign Lethean.app" - exit 1 -fi - - -read version_str <<< $(DYLD_LIBRARY_PATH=$ZANO_BOOST_LIBS_PATH ./connectivity_tool --version | awk '/^Lethean/ { print $2 }') -version_str=${version_str} -echo $version_str - - echo "############### Prepearing archive... ################" -mkdir package_folder -if [ $? -ne 0 ]; then - echo "Failed to zip app" - exit 1 -fi - -mv Lethean.app package_folder -if [ $? -ne 0 ]; then - echo "Failed to top app package" - exit 1 -fi +package_filename=${ARCHIVE_NAME_PREFIX}.tar.bz2 -#fi - -package_filename=${ARCHIVE_NAME_PREFIX}${version_str}.dmg - -source ../../../utils/macosx_dmg_builder.sh -build_fancy_dmg package_folder $package_filename -if [ $? -ne 0 ]; then - echo "Failed to create fancy dmg" - exit 1 -fi +rm -f ./$package_filename +cd lethean-gui-server.app +tar -cjvf ../../../../$package_filename * echo "Build success" - -echo "############### Uploading... ################" - -package_filepath=$package_filename - -scp $package_filepath lethean_build_server:/var/www/html/builds/ -if [ $? -ne 0 ]; then - echo "Failed to upload to remote server" - exit 1 -fi - - -read checksum <<< $( shasum -a 256 $package_filepath | awk '/^/ { print $1 }' ) - -mail_msg="New ${build_prefix_label}${testnet_label}build for macOS-x64:
-https://build.lethean.org/builds/$package_filename
-sha256: $checksum" - -echo "$mail_msg" - -echo "$mail_msg" | mail -s "Lethean macOS-x64 ${build_prefix_label}${testnet_label}build $version_str" ${emails} - - -###################### -# notarization -###################### - -cd package_folder - -echo "Notarizing..." - -# creating archive for notarizing -echo "Creating archive for notarizing" -rm -f Lethean.zip -/usr/bin/ditto -c -k --keepParent ./Lethean.app ./Lethean.zip - -tmpfile="tmptmptmp" -xcrun altool --notarize-app --primary-bundle-id "org.lethean.desktop" -u "hello@lt.hn" -p "@keychain:Developer-altool" --file ./Lethean.zip > $tmpfile 2>&1 -NOTARIZE_RES=$? -NOTARIZE_OUTPUT=$( cat $tmpfile ) -rm $tmpfile -echo "NOTARIZE_OUTPUT=$NOTARIZE_OUTPUT" -if [ $NOTARIZE_RES -ne 0 ]; then - echo "Notarization failed" - exit 1 -fi - -GUID=$(echo "$NOTARIZE_OUTPUT" | egrep -Ewo '[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}') -if [ ${#GUID} -ne 36 ]; then - echo "Couldn't get correct GUID from the response, got only \"$GUID\"" - exit 1 -fi - - -success=0 - -# check notarization status -for i in {1..10}; do - xcrun altool --notarization-info $GUID -u "hello@lt.hn" -p "@keychain:Developer-altool" > $tmpfile 2>&1 - NOTARIZE_OUTPUT=$( cat $tmpfile ) - rm $tmpfile - NOTARIZATION_LOG_URL=$(echo "$NOTARIZE_OUTPUT" | sed -n "s/.*LogFileURL\: \([[:graph:]]*\).*/\1/p") - if [ ${#NOTARIZATION_LOG_URL} -ge 30 ]; then - success=1 - curl -L $NOTARIZATION_LOG_URL - break - fi - sleep 60 -done - -if [ $success -ne 1 ]; then - echo "Build notarization failed" - exit 1 -fi - -echo "Notarization done" diff --git a/utils/build/testnet_windows_gui.bat b/utils/build/testnet_windows_gui.bat index f9979b0b1..6049295e5 100644 --- a/utils/build/testnet_windows_gui.bat +++ b/utils/build/testnet_windows_gui.bat @@ -4,17 +4,12 @@ call utils\build\extras\win\configure_local_paths.cmd SET LOCAL_BOOST_LIB_PATH=%LOCAL_BOOST_PATH%\lib64-msvc-14.2 SET QT_MSVC_PATH=%QT_PREFIX_PATH%\msvc2019_64 -SET ACHIVE_NAME_PREFIX=lethean-win-gui-x64- +SET ACHIVE_NAME_PREFIX=lethean-gui-bundle-win-testnet-x64 SET MY_PATH=%~dp0 SET SOURCES_PATH=%MY_PATH:~0,-13% -IF NOT [%build_prefix%] == [] ( - SET ACHIVE_NAME_PREFIX=%ACHIVE_NAME_PREFIX%%build_prefix%- -) - SET TESTNET_DEF=-D TESTNET=TRUE SET TESTNET_LABEL=testnet -SET ACHIVE_NAME_PREFIX=%ACHIVE_NAME_PREFIX%testnet- SET PARAM=%~1 @@ -55,16 +50,6 @@ IF %ERRORLEVEL% NEQ 0 ( goto error ) -msbuild src/daemon.vcxproj /p:SubSystem="CONSOLE,5.02" /p:Configuration=Release /t:Build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - -msbuild src/simplewallet.vcxproj /p:SubSystem="CONSOLE,5.02" /p:Configuration=Release /t:Build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - msbuild src/Lethean.vcxproj /p:SubSystem="WINDOWS,5.02" /p:Configuration=Release /t:Build IF %ERRORLEVEL% NEQ 0 ( @@ -76,16 +61,10 @@ IF %ERRORLEVEL% NEQ 0 ( echo "sources are built successfully" - - :skip_build cd %SOURCES_PATH%/build -set cmd=src\Release\simplewallet.exe --version -FOR /F "tokens=3" %%a IN ('%cmd%') DO set version=%%a -echo '%version%' - -set build_zip_filename=%ACHIVE_NAME_PREFIX%%version%.zip +set build_zip_filename=%ACHIVE_NAME_PREFIX%.zip set build_zip_path=%SOURCES_PATH%\%build_zip_filename% del /F /Q %build_zip_path% @@ -99,12 +78,15 @@ cd src\release mkdir bunch -copy /Y Lethean.exe bunch +copy /Y lethean-gui-server.exe bunch copy /Y letheand.exe bunch copy /Y simplewallet.exe bunch copy /Y *.pdb bunch -%QT_MSVC_PATH%\bin\windeployqt.exe bunch\Lethean.exe +copy /Y %OPENSSL_ROOT_DIR%\bin\libcrypto-1_1-x64.dll bunch +copy /Y %OPENSSL_ROOT_DIR%\bin\libssl-1_1-x64.dll bunch + +%QT_MSVC_PATH%\bin\windeployqt.exe bunch\lethean-gui-server.exe cd bunch @@ -113,16 +95,6 @@ IF %ERRORLEVEL% NEQ 0 ( goto error ) - -@echo "Add html" - -cd %SOURCES_PATH%\src\gui\qt-daemon\layout -zip -x html/package.json html/gulpfile.js html/less/* -r %build_zip_path% html -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - @echo "Add runtime stuff" @@ -138,36 +110,9 @@ IF %ERRORLEVEL% NEQ 0 ( goto error ) - -@echo "---------------------------------------------------------------" -@echo "-------------------Building installer--------------------------" -@echo "---------------------------------------------------------------" - -mkdir installer_src - - -unzip -o %build_zip_path% -d installer_src -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -"%INNOSETUP_PATH%" /dBinariesPath=../../../../build/installer_src /DMyAppVersion=%version% /o%SOURCES_PATH% /f%ACHIVE_NAME_PREFIX%%version%-installer ..\utils\build\extras\win\setup_64.iss -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - @echo "---------------------------------------------------------------" @echo "---------------------------------------------------------------" -set installer_file=%ACHIVE_NAME_PREFIX%%version%-installer.exe -set installer_path=%SOURCES_PATH%\%installer_file% - -call :sha256 %installer_path% installer_checksum - -call :sha256 %build_zip_path% build_zip_checksum - goto success :error