diff --git a/CMakeLists.txt b/CMakeLists.txt index 047cede2..a8fd8f97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,6 +146,7 @@ set(Qt5PrintSupport_DIR "$ENV{QT_DIR}/cmake/Qt5PrintSupport/") find_package(Qt5Widgets) find_package(Qt5PrintSupport) +find_package(Qt5Network) if(Qt5Widgets_FOUND) MESSAGE(STATUS "Found Qt ${Qt5Widgets_VERSION_STRING}") @@ -203,6 +204,7 @@ target_include_directories(${APP_PROJECT_NAME} SYSTEM # Use the Widgets module from Qt 5. qt5_use_modules(${APP_PROJECT_NAME} Widgets) +qt5_use_modules(${APP_PROJECT_NAME} Network) # configure platform specific include file configure_file( @@ -245,6 +247,9 @@ if (APPLE) get_property(QT_PRINT_PATH TARGET ${Qt5PrintSupport_LIBRARIES} PROPERTY LOCATION) get_filename_component(QT_PRINT_PATH ${QT_PRINT_PATH} REALPATH) + + #get_property(QT_NETWORK_PATH TARGET ${Qt5Network_LIBRARIES} PROPERTY LOCATION) + #get_filename_component(QT_NETWORK_PATH ${QT_NETWORK_PATH} REALPATH) list(APPEND MACOSX_QT_FRAMEWORKS ${QT_CORE_PATH} ${QT_GUI_PATH} ${QT_WIDGETS_PATH} ${QT_PRINT_PATH}) string(REPLACE ";" " " MACOSX_QT_FRAMEWORKS "${MACOSX_QT_FRAMEWORKS}") diff --git a/README.md b/README.md index 77348774..0a3307d9 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,7 @@ $ ninja -j4 check-all $ cd ../release_build $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ../llvm $ ninja -j4 check-all + +##### Remarks + +* Boost lib dir: rename library directory for your system (e.g.: 'lib32-msvc-12.0') to 'lib' \ No newline at end of file diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt index ef77bdfd..c547a434 100644 --- a/bin/test/data/log/test_log.txt +++ b/bin/test/data/log/test_log.txt @@ -1,4 +1,310 @@ ConfigManager.cpp WARNING: value path/to/nowhere is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. +Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml +ConfigManager.cpp WARNING: value source/HeaderSearchPaths/HeaderSearchPath is not present in config. Token.cpp ERROR: Location Id was not referenced by this Token. Edge.cpp ERROR: Edge type_of can't go from Node undefined to Node undefined Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class diff --git a/setup/dynamic_libraries/windows/app/Debug/Qt5Networkd.dll b/setup/dynamic_libraries/windows/app/Debug/Qt5Networkd.dll new file mode 100644 index 00000000..a2ac1c87 Binary files /dev/null and b/setup/dynamic_libraries/windows/app/Debug/Qt5Networkd.dll differ diff --git a/setup/dynamic_libraries/windows/app/Release/Qt5Network.dll b/setup/dynamic_libraries/windows/app/Release/Qt5Network.dll new file mode 100644 index 00000000..419dcd75 Binary files /dev/null and b/setup/dynamic_libraries/windows/app/Release/Qt5Network.dll differ diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index eca7a4ab..877456fa 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -39,6 +39,13 @@ add_files( qt/graphics/QtRoundedRectItem.h qt/graphics/QtStraightLineItem.cpp qt/graphics/QtStraightLineItem.h + + qt/network/QtIDECommunicationController.cpp + qt/network/QtIDECommunicationController.h + qt/network/QtNetworkFactory.cpp + qt/network/QtNetworkFactory.h + qt/network/QtTcpWrapper.cpp + qt/network/QtTcpWrapper.h qt/utility/QtDeviceScaledPixmap.cpp qt/utility/QtDeviceScaledPixmap.h diff --git a/src/app/main.cpp b/src/app/main.cpp index f1a2c473..72e9feef 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -9,10 +9,13 @@ #include "Application.h" #include "includes.h" // defines 'void setup(int argc, char *argv[])' #include "qt/window/QtSplashScreen.h" +#include "qt/network/QtNetworkFactory.h" #include "qt/utility/utilityQt.h" #include "qt/view/QtViewFactory.h" #include "version.h" +#include "component/controller/helper/NetworkProtocolHelper.h" // remove when done + void init() { std::shared_ptr consoleLogger = std::make_shared(); @@ -44,7 +47,9 @@ int main(int argc, char *argv[]) init(); QtViewFactory viewFactory; - std::shared_ptr app = Application::create(&viewFactory); + QtNetworkFactory networkFactory; + + std::shared_ptr app = Application::create(&viewFactory, &networkFactory); if (splash) { diff --git a/src/app/qt/network/QtIDECommunicationController.cpp b/src/app/qt/network/QtIDECommunicationController.cpp new file mode 100644 index 00000000..978fca28 --- /dev/null +++ b/src/app/qt/network/QtIDECommunicationController.cpp @@ -0,0 +1,17 @@ +#include "QtIDECommunicationController.h" + +#include + +QtIDECommunicationController::QtIDECommunicationController(QObject* parent) + : m_tcpWrapper(parent) +{ + m_tcpWrapper.setReadCallback(std::bind(&QtIDECommunicationController::handleIncomingMessage, this, std::placeholders::_1)); +} + +QtIDECommunicationController::~QtIDECommunicationController() +{} + +void QtIDECommunicationController::sendMessage(const std::string& message) const +{ + m_tcpWrapper.sendMessage(message); +} \ No newline at end of file diff --git a/src/app/qt/network/QtIDECommunicationController.h b/src/app/qt/network/QtIDECommunicationController.h new file mode 100644 index 00000000..c45c33af --- /dev/null +++ b/src/app/qt/network/QtIDECommunicationController.h @@ -0,0 +1,23 @@ +#ifndef QT_IDE_COMMUNICATION_CONTROLLER +#define QT_IDE_COMMUNICATION_CONTROLLER + +#include + +#include "QtTcpWrapper.h" + +#include "component/controller/IDECommunicationController.h" + +class QtIDECommunicationController + : public IDECommunicationController +{ +public: + QtIDECommunicationController(QObject* parent); + ~QtIDECommunicationController(); + +private: + virtual void sendMessage(const std::string& message) const; + + QtTcpWrapper m_tcpWrapper; +}; + +#endif // QT_IDE_COMMUNICATION_CONTROLLER \ No newline at end of file diff --git a/src/app/qt/network/QtNetworkFactory.cpp b/src/app/qt/network/QtNetworkFactory.cpp new file mode 100644 index 00000000..7d3eb4ae --- /dev/null +++ b/src/app/qt/network/QtNetworkFactory.cpp @@ -0,0 +1,16 @@ +#include "QtNetworkFactory.h" + +#include "QtIDECommunicationController.h" + +QtNetworkFactory::QtNetworkFactory() +{ +} + +QtNetworkFactory::~QtNetworkFactory() +{ +} + +std::shared_ptr QtNetworkFactory::createIDECommunicationController() const +{ + return std::make_shared(nullptr); +} \ No newline at end of file diff --git a/src/app/qt/network/QtNetworkFactory.h b/src/app/qt/network/QtNetworkFactory.h new file mode 100644 index 00000000..4361d73c --- /dev/null +++ b/src/app/qt/network/QtNetworkFactory.h @@ -0,0 +1,15 @@ +#ifndef QT_NETWORK_FACTORY_H +#define QT_NETWORK_FACTORY_H + +#include "component/controller/NetworkFactory.h" + +class QtNetworkFactory : public NetworkFactory +{ +public: + QtNetworkFactory(); + virtual ~QtNetworkFactory(); + + virtual std::shared_ptr createIDECommunicationController() const; +}; + +#endif // QT_NETWORK_FACTORY_H \ No newline at end of file diff --git a/src/app/qt/network/QtTcpWrapper.cpp b/src/app/qt/network/QtTcpWrapper.cpp new file mode 100644 index 00000000..474c4978 --- /dev/null +++ b/src/app/qt/network/QtTcpWrapper.cpp @@ -0,0 +1,91 @@ +#include "QtTcpWrapper.h" + +#include "utility/logging/logging.h" + +QtTcpWrapper::QtTcpWrapper(QObject* parent) + : QObject(parent) + , m_port(6667) + , m_ip("127.0.0.1") +{ + QHostAddress address(m_ip.c_str()); + + m_tcpServer = new QTcpServer(this); + + connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); + + if (!m_tcpServer->listen(QHostAddress::LocalHost, m_port)) + { + LOG_ERROR_STREAM(<< "TCP server failed to start. Unable to listen for IDE plugin messages."); + } +} + +QtTcpWrapper::QtTcpWrapper(QObject* parent, const std::string& ip, const quint16 port) + : QObject(parent) + , m_port(port) + , m_ip(ip) +{ + QHostAddress address(m_ip.c_str()); + + m_tcpServer = new QTcpServer(this); + + connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); + + if (!m_tcpServer->listen(QHostAddress::LocalHost, m_port)) + { + LOG_ERROR_STREAM(<< "TCP server failed to start. Unable to listen for IDE plugin messages."); + } +} + +QtTcpWrapper::~QtTcpWrapper() +{ + if (m_tcpServer != NULL) + { + if (m_tcpServer->isListening()) + { + m_tcpServer->close(); + } + + delete m_tcpServer; + } +} + +void QtTcpWrapper::sendMessage(const std::string& message) const +{ + QByteArray data; + data.append(message.c_str()); + + QTcpSocket socket; + socket.connectToHost(QHostAddress::LocalHost, 6666); + + if (socket.waitForConnected()) + { + socket.write(data); + socket.flush(); + socket.waitForBytesWritten(); + socket.close(); + } +} + +void QtTcpWrapper::setReadCallback(const std::function& callback) +{ + m_readCallback = callback; +} + +void QtTcpWrapper::acceptConnection() +{ + m_tcpClient = m_tcpServer->nextPendingConnection(); + + connect(m_tcpClient, SIGNAL(readyRead()), this, SLOT(startRead())); +} + +void QtTcpWrapper::startRead() +{ + char buffer[1024] = { 0 }; + m_tcpClient->read(buffer, m_tcpClient->bytesAvailable()); + m_tcpClient->close(); + + if (m_readCallback != NULL) + { + m_readCallback(buffer); + } +} diff --git a/src/app/qt/network/QtTcpWrapper.h b/src/app/qt/network/QtTcpWrapper.h new file mode 100644 index 00000000..87c4134f --- /dev/null +++ b/src/app/qt/network/QtTcpWrapper.h @@ -0,0 +1,40 @@ +#ifndef QT_SOCKET_WRAPPER_H +#define QT_SOCKET_WRAPPER_H + +#include +#include +#include + +#include +#include + +class QtTcpWrapper : public QObject +{ + Q_OBJECT + +public: + QtTcpWrapper(QObject* parent); + QtTcpWrapper(QObject* parent, const std::string& ip, const quint16 port); + ~QtTcpWrapper(); + + void sendMessage(const std::string& message) const; + + void setReadCallback(const std::function& callback); + +signals: + +public slots: + void acceptConnection(); + void startRead(); + +private: + quint16 m_port; + std::string m_ip; + + std::function m_readCallback; + + QTcpServer* m_tcpServer; + QTcpSocket* m_tcpClient; +}; + +#endif // QT_SOCKET_WRAPPER_H \ No newline at end of file diff --git a/src/app/qt/networkPrototype/SocketTest.cpp b/src/app/qt/networkPrototype/SocketTest.cpp new file mode 100644 index 00000000..c9dca9b2 --- /dev/null +++ b/src/app/qt/networkPrototype/SocketTest.cpp @@ -0,0 +1,49 @@ +#include "SocketTest.h" + +#include "utility/logging/logging.h" + +SocketTest::SocketTest(QObject* parent) + : QObject(parent) + , m_socket(NULL) +{ + m_socket = new QUdpSocket(this); + QHostAddress address("127.0.0.1"); + m_socket->bind(address, 6666); + + connect(m_socket, SIGNAL(readyRead()), this, SLOT(readyRead())); +} + +SocketTest::~SocketTest() +{ + if(m_socket != NULL) + { + delete m_socket; + } +} + +void SocketTest::sendTestMessage() +{ + LOG_WARNING("SocketTest::sendTestMessage"); + + QByteArray Data; + Data.append("qt foo"); + + m_socket->writeDatagram(Data, QHostAddress::Any, 6666); +} + +void SocketTest::readyRead() +{ + LOG_WARNING("SocketTest::readyRead"); + + QByteArray buffer; + buffer.resize(m_socket->pendingDatagramSize()); + + QHostAddress sender; + quint16 senderPort; + + m_socket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort); + + std::string message = buffer.data(); + + LOG_WARNING(message); +} diff --git a/src/app/qt/networkPrototype/SocketTest.h b/src/app/qt/networkPrototype/SocketTest.h new file mode 100644 index 00000000..8d5389c3 --- /dev/null +++ b/src/app/qt/networkPrototype/SocketTest.h @@ -0,0 +1,26 @@ +#ifndef SOCKET_TEST_H +#define SOCKET_TEST_H + +#include +#include + +class SocketTest : public QObject +{ + Q_OBJECT + +public: + SocketTest(QObject* parent); + ~SocketTest(); + + void sendTestMessage(); + +signals: + +public slots: + void readyRead(); + +private: + QUdpSocket* m_socket; +}; + +#endif // SOCKET_TEST_H \ No newline at end of file diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index f4db89dd..ea61e6a6 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -7,13 +7,14 @@ #include "utility/scheduling/TaskScheduler.h" #include "component/view/GraphViewStyle.h" +#include "component/controller/NetworkFactory.h" #include "component/view/MainView.h" #include "component/view/ViewFactory.h" #include "data/StorageCache.h" #include "settings/ApplicationSettings.h" #include "settings/ColorScheme.h" -std::shared_ptr Application::create(ViewFactory* viewFactory) +std::shared_ptr Application::create(ViewFactory* viewFactory, NetworkFactory* networkFactory) { loadSettings(); @@ -41,6 +42,8 @@ std::shared_ptr Application::create(ViewFactory* viewFactory) ptr->m_mainView->showStartScreen(); } + ptr->m_ideCommunicationController = networkFactory->createIDECommunicationController(); + return ptr; } diff --git a/src/lib/Application.h b/src/lib/Application.h index 049653f8..f2266295 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -11,6 +11,8 @@ #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageSaveProject.h" +class IDECommunicationController; +class NetworkFactory; class ViewFactory; class MainView; class StorageCache; @@ -22,7 +24,7 @@ class Application , public MessageListener { public: - static std::shared_ptr create(ViewFactory* viewFactory); + static std::shared_ptr create(ViewFactory* viewFactory, NetworkFactory* networkFactory); static void loadSettings(); ~Application(); @@ -46,6 +48,10 @@ private: std::shared_ptr m_mainView; std::shared_ptr m_componentManager; + + std::shared_ptr m_ideCommunicationController; + + bool m_isInitialParse; }; #endif // APPLICATION_H diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 779a7967..dcf32d40 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -45,6 +45,8 @@ add_files( component/controller/helper/GraphLayouter.h component/controller/helper/GraphPostprocessor.cpp component/controller/helper/GraphPostprocessor.h + component/controller/helper/NetworkProtocolHelper.cpp + component/controller/helper/NetworkProtocolHelper.h component/controller/helper/SnippetMerger.cpp component/controller/helper/SnippetMerger.h @@ -56,6 +58,11 @@ add_files( component/controller/FeatureController.h component/controller/GraphController.cpp component/controller/GraphController.h + + component/controller/IDECommunicationController.cpp + component/controller/IDECommunicationController.h + component/controller/NetworkFactory.cpp + component/controller/NetworkFactory.h component/controller/RefreshController.cpp component/controller/RefreshController.h component/controller/SearchController.cpp @@ -252,6 +259,7 @@ add_files( utility/messaging/type/MessageGraphNodeMove.h utility/messaging/type/MessageInterruptTasks.h utility/messaging/type/MessageLoadProject.h + utility/messaging/type/MessageMoveIDECursor.h utility/messaging/type/MessageRedo.h utility/messaging/type/MessageRefresh.h utility/messaging/type/MessageSaveProject.h diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index c1d128d4..a6b7341e 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -1,5 +1,7 @@ #include "component/ComponentManager.h" +#include "component/controller/NetworkFactory.h" + #include "component/view/CodeView.h" #include "component/view/CompositeView.h" #include "component/view/GraphView.h" diff --git a/src/lib/component/ComponentManager.h b/src/lib/component/ComponentManager.h index c135da52..5195b2cc 100644 --- a/src/lib/component/ComponentManager.h +++ b/src/lib/component/ComponentManager.h @@ -8,6 +8,7 @@ #include "component/ComponentFactory.h" class CompositeView; +class NetworkFactory; class StorageAccess; class View; class ViewFactory; diff --git a/src/lib/component/controller/IDECommunicationController.cpp b/src/lib/component/controller/IDECommunicationController.cpp new file mode 100644 index 00000000..cf98eba5 --- /dev/null +++ b/src/lib/component/controller/IDECommunicationController.cpp @@ -0,0 +1,33 @@ +#include "IDECommunicationController.h" + +#include "utility/messaging/type/MessageActivateTokens.h" +#include "utility/logging/logging.h" + +#include "component/controller/helper/NetworkProtocolHelper.h" + +IDECommunicationController::IDECommunicationController() +{ +} + +IDECommunicationController::~IDECommunicationController() +{ +} + +void IDECommunicationController::handleIncomingMessage(const std::string& message) +{ + LOG_WARNING_STREAM(<< message); + + NetworkProtocolHelper::NetworkMessage parsedMessage = NetworkProtocolHelper::parseMessage(message); + + if (parsedMessage.valid) + { + // TODO: set active token + } +} + +void IDECommunicationController::handleMessage(MessageMoveIDECursor* message) +{ + std::string networkMessage = NetworkProtocolHelper::buildMessage(message->FilePosition, message->Row, message->Column); + + sendMessage(networkMessage); +} \ No newline at end of file diff --git a/src/lib/component/controller/IDECommunicationController.h b/src/lib/component/controller/IDECommunicationController.h new file mode 100644 index 00000000..864d1eca --- /dev/null +++ b/src/lib/component/controller/IDECommunicationController.h @@ -0,0 +1,26 @@ +#ifndef IDE_COMMUNICATION_CONTROLLER_H +#define IDE_COMMUNICATION_CONTROLLER_H + +#include + +#include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageMoveIDECursor.h" + +#include "component/controller/Controller.h" + +class IDECommunicationController + : public Controller + , public MessageListener +{ +public: + IDECommunicationController(); + virtual ~IDECommunicationController(); + + void handleIncomingMessage(const std::string& message); + +private: + virtual void handleMessage(MessageMoveIDECursor* message); + virtual void sendMessage(const std::string& message) const = 0; +}; + +#endif // IDE_COMMUNICATION_CONTROLLER_H \ No newline at end of file diff --git a/src/lib/component/controller/NetworkFactory.cpp b/src/lib/component/controller/NetworkFactory.cpp new file mode 100644 index 00000000..efb98c25 --- /dev/null +++ b/src/lib/component/controller/NetworkFactory.cpp @@ -0,0 +1,9 @@ +#include "component/controller/NetworkFactory.h" + +NetworkFactory::NetworkFactory() +{ +} + +NetworkFactory::~NetworkFactory() +{ +} \ No newline at end of file diff --git a/src/lib/component/controller/NetworkFactory.h b/src/lib/component/controller/NetworkFactory.h new file mode 100644 index 00000000..9e8f0e0f --- /dev/null +++ b/src/lib/component/controller/NetworkFactory.h @@ -0,0 +1,17 @@ +#ifndef NETWORK_FACTORY_H +#define NETWORK_FACTORY_H + +#include + +class IDECommunicationController; + +class NetworkFactory +{ +public: + NetworkFactory(); + virtual ~NetworkFactory(); + + virtual std::shared_ptr createIDECommunicationController() const = 0; +}; + +#endif // NETWORK_FACTORY_H \ No newline at end of file diff --git a/src/lib/component/controller/helper/GraphPostprocessor.cpp b/src/lib/component/controller/helper/GraphPostprocessor.cpp index 4b7deecd..e4c84463 100644 --- a/src/lib/component/controller/helper/GraphPostprocessor.cpp +++ b/src/lib/component/controller/helper/GraphPostprocessor.cpp @@ -2,12 +2,14 @@ #include "component/view/GraphViewStyle.h" -unsigned int GraphPostprocessor::s_cellSize = GraphViewStyle::s_gridCellSize; +unsigned int GraphPostprocessor::s_cellWidth = GraphViewStyle::s_gridCellSize; +unsigned int GraphPostprocessor::s_cellHeight = GraphViewStyle::s_gridCellSize; unsigned int GraphPostprocessor::s_cellPadding = GraphViewStyle::s_gridCellPadding; void GraphPostprocessor::doPostprocessing(std::vector& nodes) { - unsigned int atomarGridSize = s_cellSize; + unsigned int atomarGridWidth = s_cellWidth; + unsigned int atomarGridHeight = s_cellHeight; if (nodes.size() < 2) { @@ -16,42 +18,43 @@ void GraphPostprocessor::doPostprocessing(std::vector& nodes) } // determine center of mass (CoD) which is used to get outliers closer to the rest of the graph - int divisor = 999999; - int maxNodeSize = 0; + int divisorWidth = 999999; + int divisorHeight = 999999; + int maxNodeWidth = 0; + int maxNodeHeight = 0; Vec2i centerOfMass(0, 0); float totalMass = 0.0f; for (const DummyNode& node : nodes) { - const Vec2i& size = node.size; - - if (size.x < divisor) + if (node.size.x < divisorWidth) { - divisor = size.x; + divisorWidth = node.size.x; } - if (size.y < divisor) + if (node.size.y < divisorHeight) { - divisor = size.y; + divisorHeight = node.size.y; } - if (size.x > maxNodeSize) + if (node.size.x > maxNodeWidth) { - maxNodeSize = size.x; + maxNodeWidth = node.size.x; } - else if (size.y > maxNodeSize) + else if (node.size.y > maxNodeHeight) { - maxNodeSize = size.y; + maxNodeHeight = node.size.y; } - float nodeMass = size.getLengthSquared(); + float nodeMass = node.size.x * node.size.y; centerOfMass += node.position * nodeMass; totalMass += nodeMass; } centerOfMass /= totalMass; - divisor = (int)atomarGridSize + s_cellPadding; //std::min(divisor, (int)atomarGridSize); + divisorWidth = (int)atomarGridWidth + s_cellPadding; //std::min(divisor, (int)atomarGridSize); + divisorHeight = (int)atomarGridHeight + s_cellPadding; resolveOutliers(nodes, centerOfMass); @@ -62,9 +65,9 @@ void GraphPostprocessor::doPostprocessing(std::vector& nodes) alignNodeOnRaster(node); } - MatrixDynamicBase heatMap = buildHeatMap(nodes, divisor, maxNodeSize); + MatrixDynamicBase heatMap = buildHeatMap(nodes, divisorWidth, divisorHeight, maxNodeWidth, maxNodeHeight); - resolveOverlap(nodes, heatMap, divisor); + resolveOverlap(nodes, heatMap, divisorWidth, divisorHeight); } void GraphPostprocessor::alignNodeOnRaster(DummyNode& node) @@ -74,7 +77,7 @@ void GraphPostprocessor::alignNodeOnRaster(DummyNode& node) Vec2i GraphPostprocessor::alignOnRaster(Vec2i position) { - int rasterPosDivisor = s_cellSize + s_cellPadding; + int rasterPosDivisor = s_cellWidth + s_cellPadding; if (position.x % rasterPosDivisor != 0) { @@ -148,20 +151,17 @@ void GraphPostprocessor::resolveOutliers(std::vector& nodes, const Ve } MatrixDynamicBase GraphPostprocessor::buildHeatMap( - const std::vector& nodes, const int atomarNodeSize, const int maxNodeSize -){ - // theoretically the nodes could horizontally or vertically far from the center, therefore '*5' (it's kinda arbitrary, - // generally *2 should suffice, I use *5 to prevent problems in extrem cases) - int heatMapWidth = (maxNodeSize * nodes.size() / atomarNodeSize) * 5; - int heatMapHeight = heatMapWidth; + const std::vector& nodes, const int atomarNodeWidth, const int atomarNodeHeight, const int maxNodeWidth, const int maxNodeHeight) +{ + int heatMapWidth = (maxNodeWidth * nodes.size() / atomarNodeWidth) * 5; // theoretically the nodes could horizontally or vertically far from the center, therefore '*5' (it's kinda arbitrary, generally *2 should suffice, I use *5 to prevent problems in extrem cases) + int heatMapHeight = (maxNodeHeight * nodes.size() / atomarNodeHeight) * 5; MatrixDynamicBase heatMap(heatMapWidth, heatMapHeight); for (const DummyNode& node : nodes) { - int left = node.position.x / atomarNodeSize + heatMapWidth / 2; - int up = node.position.y / atomarNodeSize + heatMapHeight / 2; - + int left = node.position.x / atomarNodeWidth + heatMapWidth/2; + int up = node.position.y / atomarNodeHeight + heatMapHeight/2; Vec2i size = calculateRasterNodeSize(node); int width = size.x; int height = size.y; @@ -193,8 +193,8 @@ MatrixDynamicBase GraphPostprocessor::buildHeatMap( } void GraphPostprocessor::resolveOverlap( - std::vector& nodes, MatrixDynamicBase& heatMap, const int divisor -){ + std::vector& nodes, MatrixDynamicBase& heatMap, const int divisorWidth, const int divisorHeight) +{ int heatMapWidth = heatMap.getColumnsCount(); int heatMapHeight = heatMap.getRowsCount(); @@ -211,9 +211,9 @@ void GraphPostprocessor::resolveOverlap( for (DummyNode& node : nodes) { - Vec2i nodePos; - nodePos.x = node.position.x / divisor + heatMapWidth / 2; - nodePos.y = node.position.y / divisor + heatMapHeight / 2; + Vec2i nodePos(0, 0); + nodePos.x = node.position.x / divisorWidth + heatMapWidth/2; + nodePos.y = node.position.y / divisorHeight + heatMapHeight/2; Vec2i nodeSize = calculateRasterNodeSize(node); if (nodePos.x + nodeSize.x > heatMapWidth || nodePos.x < 0) @@ -254,28 +254,29 @@ void GraphPostprocessor::resolveOverlap( modifyHeatmapArea(heatMap, nodePos, nodeSize, -1); // move node to new position - int xOffset = grad.x * divisor; - int yOffset = grad.y * divisor; + int xOffset = grad.x * divisorWidth; + int yOffset = grad.y * divisorHeight; - - int maxOffset = 2 * divisor; + int maxXOffset = 2*divisorWidth; + int maxYOffset = 2*divisorHeight; + // prevent the graph from "exploding" again... - if (xOffset > maxOffset) + if (xOffset > maxXOffset) { - xOffset = maxOffset; + xOffset = maxXOffset; } - else if (xOffset < -maxOffset) + else if (xOffset < -maxXOffset) { - xOffset = -maxOffset; + xOffset = -maxXOffset; } - if (yOffset > maxOffset) + if (yOffset > maxYOffset) { - yOffset = maxOffset; + yOffset = maxYOffset; } - else if (yOffset < -maxOffset) + else if (yOffset < -maxYOffset) { - yOffset = -maxOffset; + yOffset = -maxYOffset; } node.position += Vec2i(xOffset, yOffset); @@ -283,8 +284,8 @@ void GraphPostprocessor::resolveOverlap( alignNodeOnRaster(node); // re-add node to heat map at new position - nodePos.x = node.position.x / divisor + heatMapWidth / 2; - nodePos.y = node.position.y / divisor + heatMapHeight / 2; + nodePos.x = node.position.x / divisorWidth + heatMapWidth/2; + nodePos.y = node.position.y / divisorHeight + heatMapHeight/2; modifyHeatmapArea(heatMap, nodePos, nodeSize, 1); @@ -442,8 +443,8 @@ Vec2i GraphPostprocessor::calculateRasterNodeSize(const DummyNode& node) while (size.x > 0) { - size.x = size.x - s_cellSize; - if (size.x > 0) + size.x = size.x - s_cellWidth; + if(size.x > 0) { size.x = size.x - s_cellPadding; } @@ -453,8 +454,8 @@ Vec2i GraphPostprocessor::calculateRasterNodeSize(const DummyNode& node) while (size.y > 0) { - size.y = size.y - s_cellSize; - if (size.y > 0) + size.y = size.y - s_cellHeight; + if(size.y > 0) { size.y = size.y - s_cellPadding; } diff --git a/src/lib/component/controller/helper/GraphPostprocessor.h b/src/lib/component/controller/helper/GraphPostprocessor.h index 88003f18..964bf376 100644 --- a/src/lib/component/controller/helper/GraphPostprocessor.h +++ b/src/lib/component/controller/helper/GraphPostprocessor.h @@ -17,12 +17,14 @@ public: static Vec2i alignOnRaster(Vec2i position); private: - static unsigned int s_cellSize; + static unsigned int s_cellWidth; + static unsigned int s_cellHeight; static unsigned int s_cellPadding; - static MatrixDynamicBase buildHeatMap(const std::vector& nodes, const int atomarNodeSize, const int maxNodeSize); + static MatrixDynamicBase buildHeatMap(const std::vector& nodes, const int atomarNodeWidth, const int atomarNodeHeight, const int maxNodeWidth, const int maxNodeHeight); static void resolveOutliers(std::vector& nodes, const Vec2i& centerPoint); - static void resolveOverlap(std::vector& nodes, MatrixDynamicBase& heatMap, const int divisor); + static void resolveOverlap(std::vector& nodes, MatrixDynamicBase& heatMap, const int divisorWidth, const int divisorHeight); + static void modifyHeatmapArea(MatrixDynamicBase& heatMap, const Vec2i& leftUpperCorner, const Vec2i& size, const int modifier); static bool getHeatmapGradient(Vec2f& outGradient, const MatrixDynamicBase& heatMap, const Vec2i& leftUpperCorner, const Vec2i& size); static Vec2f heatMapRayCast(const MatrixDynamicBase& heatMap, const Vec2f& startPosition, const Vec2f& direction, unsigned int minValue); diff --git a/src/lib/component/controller/helper/NetworkProtocolHelper.cpp b/src/lib/component/controller/helper/NetworkProtocolHelper.cpp new file mode 100644 index 00000000..2db6df4e --- /dev/null +++ b/src/lib/component/controller/helper/NetworkProtocolHelper.cpp @@ -0,0 +1,95 @@ +#include "NetworkProtocolHelper.h" + +#include +#include + +std::string NetworkProtocolHelper::m_divider = ">>"; +std::string NetworkProtocolHelper::m_setActiveTokenPrefix = "setActiveToken"; +std::string NetworkProtocolHelper::m_moveCursorPrefix = "moveCursor"; +std::string NetworkProtocolHelper::m_endOfMessageToken = ""; + +NetworkProtocolHelper::NetworkMessage NetworkProtocolHelper::parseMessage(const std::string& message) +{ + NetworkMessage networkMessage; + + std::string tmpMessage = removeEndOfMessageToken(message); + + size_t pos = tmpMessage.find(m_setActiveTokenPrefix); + + if(pos != std::string::npos) + { + tmpMessage = ""; + getSubstringAfterString(message, m_divider, tmpMessage); // just get rid of message type + + std::string fileLocation = getSubstringAfterString(tmpMessage, m_divider, tmpMessage); + std::string row = getSubstringAfterString(tmpMessage, m_divider, tmpMessage); + std::string column = tmpMessage; // getSubstringAfterString(tmpMessage, "", tmpMessage); // there should be nothing left in the message but the column number + + if(fileLocation.length() <= 0 + || row.length() <= 0 + || column.length() <= 0 + || isDigits(row) == false + || isDigits(column) == false) + { + return networkMessage; + } + else + { + networkMessage.fileLocation = fileLocation; + networkMessage.row = std::stoi(row); + networkMessage.column = std::stoi(column); + networkMessage.valid = true; + } + } + + return networkMessage; +} + +std::string NetworkProtocolHelper::buildMessage(const std::string& fileLocation, const unsigned int row, const unsigned int column) +{ + std::stringstream messageStream; + + messageStream << m_moveCursorPrefix; + messageStream << m_divider; + messageStream << fileLocation; + messageStream << m_divider; + messageStream << row; + messageStream << m_divider; + messageStream << column; + messageStream << m_endOfMessageToken; + + return messageStream.str(); +} + +std::string NetworkProtocolHelper::removeEndOfMessageToken(const std::string& message) +{ + size_t pos = message.find(m_endOfMessageToken); + if (pos != std::string::npos) + { + return message.substr(0, pos); + } + else + { + return message; + } +} + +std::string NetworkProtocolHelper::getSubstringAfterString(const std::string& message, const std::string& searchString, std::string& subMessage) +{ + std::string result = ""; + + size_t pos = message.find(searchString); + + if(pos != std::string::npos) + { + result = message.substr(0, pos); + subMessage = message.substr(pos + searchString.length()); + } + + return result; +} + +bool NetworkProtocolHelper::isDigits(const std::string& text) +{ + return (text.find_first_not_of("0123456789") == std::string::npos); +} diff --git a/src/lib/component/controller/helper/NetworkProtocolHelper.h b/src/lib/component/controller/helper/NetworkProtocolHelper.h new file mode 100644 index 00000000..a52ef7c7 --- /dev/null +++ b/src/lib/component/controller/helper/NetworkProtocolHelper.h @@ -0,0 +1,40 @@ +#ifndef NETWORK_PROTOCOL_HELPER_H +#define NETWORK_PROTOCOL_HELPER_H + +#include + +class NetworkProtocolHelper +{ +public: + struct NetworkMessage + { + public: + NetworkMessage() + : fileLocation("") + , row(0) + , column(0) + , valid(false) + {} + + std::string fileLocation; + unsigned int row; + unsigned int column; + bool valid; + }; + + static NetworkMessage parseMessage(const std::string& message); + static std::string buildMessage(const std::string& fileLocation, const unsigned int row, const unsigned int column); + +private: + static std::string removeEndOfMessageToken(const std::string& message); + + static std::string getSubstringAfterString(const std::string& message, const std::string& searchString, std::string& subMessage); + static bool isDigits(const std::string& text); + + static std::string m_divider; + static std::string m_setActiveTokenPrefix; + static std::string m_moveCursorPrefix; + static std::string m_endOfMessageToken; +}; + +#endif // NETWORK_PROTOCOL_HELPER_H \ No newline at end of file diff --git a/src/lib/utility/messaging/type/MessageMoveIDECursor.h b/src/lib/utility/messaging/type/MessageMoveIDECursor.h new file mode 100644 index 00000000..aa9c4733 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageMoveIDECursor.h @@ -0,0 +1,26 @@ +#ifndef MESSAGE_MOVE_IDE_CURSOR_H +#define MESSAGE_MOVE_IDE_CURSOR_H + +#include "utility/messaging/Message.h" + +class MessageMoveIDECursor : public Message +{ +public: + MessageMoveIDECursor(const std::string& FilePos, const unsigned int Row, const unsigned int Column) + : FilePosition(FilePos) + , Row(Row) + , Column(Column) + { + } + + static const std::string getStaticType() + { + return "MessageMoveIDECursor"; + } + + const std::string FilePosition; + const unsigned int Row; + const unsigned int Column; +}; + +#endif // MESSAGE_MOVE_IDE_CURSOR_H \ No newline at end of file diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index c63160e1..810fc94a 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -20,6 +20,7 @@ add_files( LogManagerTestSuite.h MatrixBaseTestSuite.h MessageQueueTestSuite.h + NetworkProtocolHelperTestSuite.h SettingsTestSuite.h SearchIndexTestSuite.h SqliteStorageTestSuite.h diff --git a/src/test/NetworkProtocolHelperTestSuite.h b/src/test/NetworkProtocolHelperTestSuite.h new file mode 100644 index 00000000..b1bd66bf --- /dev/null +++ b/src/test/NetworkProtocolHelperTestSuite.h @@ -0,0 +1,62 @@ +#include + +#include "component/controller/helper/NetworkProtocolHelper.h" + +class NetworkProtocolHelperTestSuite : public CxxTest::TestSuite +{ +public: + void test_parse_message(void) + { + std::string type = "setActiveToken"; + std::string divider = ">>"; + std::string filePath = "C:\\Users\\Manuel\\imporant\\file\\location\\fileName.cpp"; + int row = 1; + int column = 2; + + // valid message + std::stringstream message; + message << type << divider << filePath << divider << row << divider << column; + + NetworkProtocolHelper::NetworkMessage networkMessage = NetworkProtocolHelper::parseMessage(message.str()); + + TS_ASSERT_EQUALS(networkMessage.fileLocation, filePath); + TS_ASSERT_EQUALS(networkMessage.row, row); + TS_ASSERT_EQUALS(networkMessage.column, column); + + // invalid type + message.str(""); + message << "foo" << divider << filePath << divider << row << divider << column; + networkMessage = NetworkProtocolHelper::parseMessage(message.str()); + + TS_ASSERT_EQUALS(networkMessage.fileLocation, ""); + TS_ASSERT_EQUALS(networkMessage.row, 0); + TS_ASSERT_EQUALS(networkMessage.column, 0); + + // missing divider + message.str(""); + message << type << divider << filePath << row << divider << column; + networkMessage = NetworkProtocolHelper::parseMessage(message.str()); + + TS_ASSERT_EQUALS(networkMessage.fileLocation, ""); + TS_ASSERT_EQUALS(networkMessage.row, 0); + TS_ASSERT_EQUALS(networkMessage.column, 0); + + // invalid row + message.str(""); + message << type << divider << filePath << divider << "potato" << divider << column; + networkMessage = NetworkProtocolHelper::parseMessage(message.str()); + + TS_ASSERT_EQUALS(networkMessage.fileLocation, ""); + TS_ASSERT_EQUALS(networkMessage.row, 0); + TS_ASSERT_EQUALS(networkMessage.column, 0); + + // invalid column + message.str(""); + message << type << divider << filePath << divider << row << divider << "laz0r"; + networkMessage = NetworkProtocolHelper::parseMessage(message.str()); + + TS_ASSERT_EQUALS(networkMessage.fileLocation, ""); + TS_ASSERT_EQUALS(networkMessage.row, 0); + TS_ASSERT_EQUALS(networkMessage.column, 0); + } +}; \ No newline at end of file