diff --git a/Modules/CppRestSdk/CMakeLists.txt b/Modules/CppRestSdk/CMakeLists.txt index ca3ae8fc8f..2d2cff193c 100644 --- a/Modules/CppRestSdk/CMakeLists.txt +++ b/Modules/CppRestSdk/CMakeLists.txt @@ -1,14 +1,14 @@ if(MITK_USE_CppRestSdk) MITK_CREATE_MODULE( DEPENDS MitkCore MitkQtWidgetsExt PACKAGE_DEPENDS Qt5|Core WARNINGS_NO_ERRORS - AUTOLOAD_WITH MitkCore + #AUTOLOAD_WITH MitkCore ) find_package(OpenSSL REQUIRED) target_link_libraries(${MODULE_TARGET} PRIVATE cpprestsdk::cpprest) target_link_libraries(${MODULE_TARGET} PUBLIC OpenSSL::SSL) endif(MITK_USE_CppRestSdk) diff --git a/Modules/CppRestSdk/files.cmake b/Modules/CppRestSdk/files.cmake index 3e7afe2fa4..e113f9def5 100644 --- a/Modules/CppRestSdk/files.cmake +++ b/Modules/CppRestSdk/files.cmake @@ -1,15 +1,17 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkRESTServer.cpp mitkRESTClient.cpp mitkDICOMWeb.cpp mitkRESTClientMicroService.cpp mitkRESTServerMicroService.cpp mitkCppRestSdkActivator.cpp mitkIRESTManager.cpp mitkRESTManager.cpp - mitkRESTTest.cpp - mitkRESTTest2.cpp mitkIRESTObserver.cpp + mitkCppRestSdk.cpp ) +set(MOC_H_FILES +include/mitkRESTServerMicroService.h +include/mitkRESTManager.h) \ No newline at end of file diff --git a/Modules/CppRestSdk/include/mitkCppRestSdk.h b/Modules/CppRestSdk/include/mitkCppRestSdk.h new file mode 100644 index 0000000000..e858bb2fdd --- /dev/null +++ b/Modules/CppRestSdk/include/mitkCppRestSdk.h @@ -0,0 +1,10 @@ +#ifndef mitkCppRestSdk_h +#define mitkCppRestSdk_h +#include + +namespace mitk +{ + + MITKCPPRESTSDK_EXPORT void ForceLinkage(); +} +#endif // !mitkCppRestSdk_h diff --git a/Modules/CppRestSdk/include/mitkIRESTManager.h b/Modules/CppRestSdk/include/mitkIRESTManager.h index 5c163e23ce..cbf371e942 100644 --- a/Modules/CppRestSdk/include/mitkIRESTManager.h +++ b/Modules/CppRestSdk/include/mitkIRESTManager.h @@ -1,32 +1,38 @@ #ifndef mitkIRESTManager_h #define mitkIRESTManager_h #include "cpprest/uri.h" #include "cpprest/json.h" + #include #include + #include namespace mitk { class IRESTManager { + + public: virtual ~IRESTManager(); enum RequestType { get, post, put }; - virtual void sendRequest(RequestType type) = 0; - virtual void receiveRequest(web::uri uri, IRESTObserver *observer) = 0; - virtual web::json::value handle(web::uri, web::json::value) = 0; - virtual void handleDeleteClient(IRESTObserver *observer) = 0; + + virtual void SendRequest(RequestType type) = 0; + + virtual void ReceiveRequest(web::uri uri, IRESTObserver *observer) = 0; + virtual web::json::value Handle(web::uri, web::json::value) = 0; + virtual void HandleDeleteObserver(IRESTObserver *observer) = 0; }; } // namespace mitk MITK_DECLARE_SERVICE_INTERFACE(mitk::IRESTManager, "org.mitk.IRESTManager") #endif diff --git a/Modules/CppRestSdk/include/mitkIRESTObserver.h b/Modules/CppRestSdk/include/mitkIRESTObserver.h index 3fd32d4acc..2210808c98 100644 --- a/Modules/CppRestSdk/include/mitkIRESTObserver.h +++ b/Modules/CppRestSdk/include/mitkIRESTObserver.h @@ -1,19 +1,20 @@ #ifndef mitkIRESTObserver_h #define mitkIRESTObserver_h #include "cpprest/json.h" +#include namespace mitk { - class IRESTObserver + class MITKCPPRESTSDK_EXPORT IRESTObserver { public: virtual ~IRESTObserver(); - virtual web::json::value notify(web::json::value data) = 0; + virtual web::json::value Notify(web::json::value data) = 0; private: }; } #endif // !mitkIRESTObserver diff --git a/Modules/CppRestSdk/include/mitkRESTManager.h b/Modules/CppRestSdk/include/mitkRESTManager.h index c324af383a..48873c819a 100644 --- a/Modules/CppRestSdk/include/mitkRESTManager.h +++ b/Modules/CppRestSdk/include/mitkRESTManager.h @@ -1,32 +1,40 @@ #ifndef mitkRESTManager_h #define mitkRESTManager_h +#include +#include + #include +#include #include #include -#include + +#include namespace mitk { - class RESTManager : public IRESTManager + class MITKCPPRESTSDK_EXPORT RESTManager : public QObject, public IRESTManager { + Q_OBJECT + public: RESTManager(); ~RESTManager() override; - //calls RESTClient - void sendRequest(RequestType type) override; - //calls RESTServer - void receiveRequest(web::uri uri, IRESTObserver *observer) override; + // calls RESTClient + void SendRequest(RequestType type) override; + // calls RESTServer + void ReceiveRequest(web::uri uri, IRESTObserver *observer) override; - web::json::value handle(web::uri, web::json::value) override; + web::json::value Handle(web::uri, web::json::value) override; - virtual void handleDeleteClient(IRESTObserver *observer) override; + virtual void HandleDeleteObserver(IRESTObserver *observer) override; private: - std::map m_ClientMap; // Map with port client pairs - std::map m_ServerMap; // Map with port server pairs - std::map, IRESTObserver*> m_Observer; //Map with all observers + std::map m_ClientMap; // Map with port client pairs + std::map m_ServerMap; // Map with port server pairs + std::map m_ServerThreadMap; // Map with threads for servers + std::map, IRESTObserver *> m_Observer; // Map with all observers }; } // namespace mitk #endif // !mitkRESTManager_h diff --git a/Modules/CppRestSdk/include/mitkRESTServerMicroService.h b/Modules/CppRestSdk/include/mitkRESTServerMicroService.h index 08b539911b..e38984b43e 100644 --- a/Modules/CppRestSdk/include/mitkRESTServerMicroService.h +++ b/Modules/CppRestSdk/include/mitkRESTServerMicroService.h @@ -1,41 +1,47 @@ #ifndef mitkRESTServerMicroService_h #define mitkRESTServerMicroService_h +#include #include "cpprest/asyncrt_utils.h" #include "cpprest/containerstream.h" #include "cpprest/filestream.h" #include "cpprest/http_listener.h" #include "cpprest/json.h" #include "cpprest/producerconsumerstream.h" #include "cpprest/uri.h" #include "MitkCppRestSdkExports.h" #include #include #include #include typedef web::http::experimental::listener::http_listener MitkListener; typedef web::http::http_request MitkRequest; typedef web::http::http_response MitkResponse; typedef web::http::methods MitkRESTMethods; typedef web::http::status_codes MitkRestStatusCodes; typedef web::json::json_exception MitkJsonException; namespace mitk { - class RESTServerMicroService + class RESTServerMicroService : public QObject { + Q_OBJECT + + public: RESTServerMicroService(web::uri uri); ~RESTServerMicroService(); web::uri GetUri(); private: - pplx::task openListener(); - pplx::task closeListener(); void HandleGet(MitkRequest request); MitkListener m_Listener; web::uri m_Uri; + + public slots: + void OpenListener(); + void CloseListener(); }; } // namespace mitk #endif \ No newline at end of file diff --git a/Modules/CppRestSdk/include/mitkRESTTest.h b/Modules/CppRestSdk/include/mitkRESTTest.h deleted file mode 100644 index dd17110590..0000000000 --- a/Modules/CppRestSdk/include/mitkRESTTest.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MITKRESTTEST_H_ -#define MITKRESTTEST_H_ -#include "mitkIRESTManager.h" -#include -#include -#include -#include "mitkIRESTObserver.h" -#include "cpprest/json.h" - -namespace mitk -{ - class RestTest: public IRESTObserver - { - public: - RestTest(); - ~RestTest(); - void TestRESTServer(); - web::json::value notify(web::json::value data) override; - - private: - }; -} // namespace mitk -#endif // !mitkRESTTest_h diff --git a/Modules/CppRestSdk/include/mitkRESTTest2.h b/Modules/CppRestSdk/include/mitkRESTTest2.h deleted file mode 100644 index b3b66ffaa1..0000000000 --- a/Modules/CppRestSdk/include/mitkRESTTest2.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MITKRESTTEST2_H_ -#define MITKRESTTEST2_H_ -#include "cpprest/json.h" -#include "mitkIRESTManager.h" -#include "mitkIRESTObserver.h" -#include -#include -#include - -namespace mitk -{ - class RestTest2 : public IRESTObserver - { - public: - RestTest2(); - ~RestTest2(); - void TestRESTServer(); - web::json::value notify(web::json::value data) override; - - private: - }; -} // namespace mitk -#endif // !mitkRESTTest_h \ No newline at end of file diff --git a/Modules/CppRestSdk/src/mitkCppRestSdk.cpp b/Modules/CppRestSdk/src/mitkCppRestSdk.cpp new file mode 100644 index 0000000000..f91b75413c --- /dev/null +++ b/Modules/CppRestSdk/src/mitkCppRestSdk.cpp @@ -0,0 +1,5 @@ +#include + +void mitk::ForceLinkage() +{ +} \ No newline at end of file diff --git a/Modules/CppRestSdk/src/mitkCppRestSdkActivator.cpp b/Modules/CppRestSdk/src/mitkCppRestSdkActivator.cpp index 68027499fc..0f7af349eb 100644 --- a/Modules/CppRestSdk/src/mitkCppRestSdkActivator.cpp +++ b/Modules/CppRestSdk/src/mitkCppRestSdkActivator.cpp @@ -1,36 +1,26 @@ #include "mitkCppRestSdkActivator.h" - -#include +#include #include #include #include #include #include #include #include #include #include - - - +#include void MitkCppRestSdkActivator::Load(us::ModuleContext *context) { //Registration of the RESTManagerMicroservice m_RESTManager.reset(new mitk::RESTManager); context->RegisterService(m_RESTManager.get()); - - //Test use of the RESTManagerMicroservice, later done in Module - - m_Test.TestRESTServer(); - m_Test2.TestRESTServer(); - - m_Test.~RestTest(); } void MitkCppRestSdkActivator::Unload(us::ModuleContext *) { } US_EXPORT_MODULE_ACTIVATOR(MitkCppRestSdkActivator) diff --git a/Modules/CppRestSdk/src/mitkCppRestSdkActivator.h b/Modules/CppRestSdk/src/mitkCppRestSdkActivator.h index 6bc6e3d093..9d7a416ad2 100644 --- a/Modules/CppRestSdk/src/mitkCppRestSdkActivator.h +++ b/Modules/CppRestSdk/src/mitkCppRestSdkActivator.h @@ -1,25 +1,21 @@ #ifndef MITKCPPRESTSDKACTIVATOR_H_ #define MITKCPPRESTSDKACTIVATOR_H_ #include #include #include #include #include -#include -#include class MitkCppRestSdkActivator : public us::ModuleActivator { + public: void Load(us::ModuleContext *context) override; void Unload(us::ModuleContext *) override; private: std::unique_ptr m_RESTManager; - mitk::RestTest m_Test; - mitk::RestTest2 m_Test2; - }; #endif diff --git a/Modules/CppRestSdk/src/mitkIRESTObserver.cpp b/Modules/CppRestSdk/src/mitkIRESTObserver.cpp index b370c8364e..ccbd3f099c 100644 --- a/Modules/CppRestSdk/src/mitkIRESTObserver.cpp +++ b/Modules/CppRestSdk/src/mitkIRESTObserver.cpp @@ -1,20 +1,19 @@ #include "mitkIRESTObserver.h" #include #include #include #include #include mitk::IRESTObserver::~IRESTObserver() { us::ModuleContext *context = us::GetModuleContext(); auto managerRef = context->GetServiceReference(); if (managerRef) { auto managerService = context->GetService(managerRef); if (managerService) { - managerService->handleDeleteClient(this); + managerService->HandleDeleteObserver(this); } } - MITK_INFO << "virtual destructor was called"; } diff --git a/Modules/CppRestSdk/src/mitkRESTManager.cpp b/Modules/CppRestSdk/src/mitkRESTManager.cpp index e698960b60..9521f14d35 100644 --- a/Modules/CppRestSdk/src/mitkRESTManager.cpp +++ b/Modules/CppRestSdk/src/mitkRESTManager.cpp @@ -1,126 +1,159 @@ #include "mitkRESTManager.h" #include mitk::RESTManager::RESTManager() {} mitk::RESTManager::~RESTManager() {} -void mitk::RESTManager::sendRequest(RequestType type) +void mitk::RESTManager::SendRequest(RequestType type) { switch (type) { case get: // Call get in mitkRESTClientMicroService break; case post: // Call post in mitkRESTClientMicroService break; case put: // Call put in mitkRESTClientMicroService break; } } -void mitk::RESTManager::receiveRequest(web::uri uri, mitk::IRESTObserver *observer) +void mitk::RESTManager::ReceiveRequest(web::uri uri, mitk::IRESTObserver *observer) { // New instance of RESTServerMicroservice in m_ServerMap, key is port of the request int port = uri.port(); // Checking if port is free to add a new Server if (m_ServerMap.count(port) == 0) { // new observer has to be added std::pair key(uri.port(), uri.path()); m_Observer[key] = observer; // testing if entry has been added to observer map utility::string_t uristringt = uri.path(); std::string uristring(uristringt.begin(), uristringt.end()); - MITK_INFO << uristring << " : Number of elements in map: " << m_Observer.count(key); + MITK_INFO <<"[" <moveToThread(m_ServerThreadMap[port]); + + connect(m_ServerThreadMap[port], &QThread::finished, server, &QObject::deleteLater); + + //starting Server + m_ServerThreadMap[port]->start(); + QMetaObject::invokeMethod(server, "OpenListener"); + utility::string_t host = uri.authority().to_string(); std::string hoststring(host.begin(), host.end()); MITK_INFO << "new server" << hoststring << " at port" << port; } // If there is already a server under this port else { // Same host, means new observer but not a new server instance if (m_ServerMap[port]->GetUri() == uri.authority()) { // new observer has to be added std::pair key(uri.port(), uri.path()); - m_Observer[key] = observer; + //only add a new observer if there isn't already an observer for this uri + if (m_Observer.count(key) == 0) + { + m_Observer[key] = observer; - // testing if entry has been added to map - utility::string_t uristringt = uri.to_string(); - std::string uristring(uristringt.begin(), uristringt.end()); - MITK_INFO << uristring << " : Number of elements in map: " << m_Observer.count(key); + // testing if entry has been added to map + utility::string_t uristringt = uri.path(); + std::string uristring(uristringt.begin(), uristringt.end()); + MITK_INFO << "[" << uri.port() << ", " << uristring<< "] : Number of elements in map: " << m_Observer.count(key); - // info output - MITK_INFO << "started listening, no new server instance has been created"; + // info output + MITK_INFO << "started listening, no new server instance has been created"; + } + else + { + MITK_ERROR << "Threre is already a observer handeling this data"; + } } // Error, since another server can't be added under this port else { - MITK_ERROR << "there is already another server listening under this port"; + MITK_ERROR << "There is already another server listening under this port"; } } } -web::json::value mitk::RESTManager::handle(web::uri uri, web::json::value data) +web::json::value mitk::RESTManager::Handle(web::uri uri, web::json::value data) { // Checking if is there is a observer for the port and path std::pair key(uri.port(), uri.path()); if (m_Observer.count(key) != 0) { MITK_INFO << "Manager: Data send to observer"; - return m_Observer[key]->notify(data); + return m_Observer[key]->Notify(data); } //No map under this port, delete Server Object to release port for other servers else { MITK_WARN << "No Observer can handle the data"; return NULL; } } -void mitk::RESTManager::handleDeleteClient(mitk::IRESTObserver *observer) +void mitk::RESTManager::HandleDeleteObserver(mitk::IRESTObserver *observer) { for (auto it = m_Observer.begin(); it != m_Observer.end();) { mitk::IRESTObserver *obsMap = it->second; //Check weather observer is at this place in map if (obsMap == observer) { - + // if yes + // 1. store port in a temporary variable int port = it->first.first; utility::string_t path = it->first.second; std::pair key(port, path); MITK_INFO << "Number of elements at key [ " << port << ", " << std::string(key.second.begin(), key.second.end()) << "]: " << m_Observer.count(key); + // 2. delete map entry it = m_Observer.erase(it); MITK_INFO << "Number of elements at key [ " << port << ", " << std::string(key.second.begin(), key.second.end()) << "]: " << m_Observer.count(key); - //if yes - // 1. store port in a temporary variable - // 2. delete map entry // 3. check, if there is another observer under this port in observer map (with bool flag) - // 3.1. if no, delete m_ServerMap entry for this port + bool noObserverForPort = true; + for (auto o : m_Observer) + { + if (o.first.first == port) + { + //there still exists an observer for this port + noObserverForPort = false; + } + } + if (noObserverForPort) + { + // there isn't an observer at this port, delete m_ServerMap entry for this port + //close listener + QMetaObject::invokeMethod(m_ServerMap[port], "CloseListener"); + //end thread + m_ServerThreadMap[port]->quit(); + m_ServerThreadMap[port]->wait(); + //delete server from map + m_ServerMap.erase(port); + } } else { ++it; } } - MITK_INFO << "Handle delete client"; - //TODO implement } diff --git a/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp b/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp index e45ad4617c..914845ae75 100644 --- a/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp +++ b/Modules/CppRestSdk/src/mitkRESTServerMicroService.cpp @@ -1,69 +1,69 @@ #include "mitkRESTServerMicroService.h" #include #include #include mitk::RESTServerMicroService::RESTServerMicroService(web::uri uri) : m_Listener(uri) { m_Uri = uri; - m_Listener.support(MitkRESTMethods::GET, std::bind(&RESTServerMicroService::HandleGet, this, std::placeholders::_1)); - openListener(); } mitk::RESTServerMicroService::~RESTServerMicroService() { - closeListener(); } -pplx::task mitk::RESTServerMicroService::openListener() +void mitk::RESTServerMicroService::OpenListener() { - return m_Listener.open(); + m_Listener = MitkListener(m_Uri); + m_Listener.support(web::http::methods::GET, + std::bind(&mitk::RESTServerMicroService::HandleGet, this, std::placeholders::_1)); + m_Listener.open().wait(); } -pplx::task mitk::RESTServerMicroService::closeListener() +void mitk::RESTServerMicroService::CloseListener() { - return m_Listener.close(); + m_Listener.close().wait(); } web::uri mitk::RESTServerMicroService::GetUri() { return m_Uri; } void mitk::RESTServerMicroService::HandleGet(MitkRequest request) { int port = m_Listener.uri().port(); //getting exact request uri has to be a parameter in handle function web::uri_builder build(m_Listener.uri()); build.append(request.absolute_uri()); utility::string_t uriStringT = build.to_uri().to_string(); std::string uriString(uriStringT.begin(), uriStringT.end()); - MITK_INFO << "Test for Server at port " << port << " Exact request uri: " << uriString; + MITK_INFO << "Get Request fot server at port " << port << " Exact request uri: " << uriString; web::json::value content; us::ModuleContext *context = us::GetModuleContext(); auto managerRef = context->GetServiceReference(); if (managerRef) { auto managerService = context->GetService(managerRef); if (managerService) { web::json::value data = request.extract_json().get(); MITK_INFO << "Server: Data send to manager"; - content = managerService->handle(build.to_uri(), data); + content = managerService->Handle(build.to_uri(), data); MITK_INFO << "server: Data received from manager"; } } if (content!=NULL) { //content handled by observer request.reply(MitkRestStatusCodes::OK, content); } else { //no observer to handle data request.reply(MitkRestStatusCodes::NotFound); } } \ No newline at end of file diff --git a/Modules/CppRestSdk/src/mitkRESTTest.cpp b/Modules/CppRestSdk/src/mitkRESTTest.cpp deleted file mode 100644 index ecd4facae5..0000000000 --- a/Modules/CppRestSdk/src/mitkRESTTest.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "mitkRESTTest.h" -#include -#include -#include - -mitk::RestTest::RestTest() {} - -mitk::RestTest::~RestTest() {} - -void mitk::RestTest::TestRESTServer() -{ - us::ModuleContext *context = us::GetModuleContext(); - auto managerRef = context->GetServiceReference(); - if (managerRef) - { - auto managerService = context->GetService(managerRef); - if (managerService) - { - managerService->receiveRequest(L"http://localhost:8080/test", this); - } - } -} - -//TODO get Data, return modified Data -web::json::value mitk::RestTest::notify(web::json::value data) -{ - MITK_INFO << "Observer: Data in observer"; - //data[L"key 1"] = web::json::value::string(U("Data modified by /test Observer")); - return data.at(U("key 1")); -} diff --git a/Modules/CppRestSdk/src/mitkRESTTest2.cpp b/Modules/CppRestSdk/src/mitkRESTTest2.cpp deleted file mode 100644 index 988887a359..0000000000 --- a/Modules/CppRestSdk/src/mitkRESTTest2.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "mitkRESTTest2.h" -#include -#include -#include - -mitk::RestTest2::RestTest2() {} - -mitk::RestTest2::~RestTest2() {} - -void mitk::RestTest2::TestRESTServer() -{ - us::ModuleContext *context = us::GetModuleContext(); - auto managerRef = context->GetServiceReference(); - if (managerRef) - { - auto managerService = context->GetService(managerRef); - if (managerService) - { - managerService->receiveRequest(L"http://localhost:8080/example", this); - managerService->receiveRequest(L"http://localhost:8090", this); - } - } -} - -// TODO get Data, return modified Data -web::json::value mitk::RestTest2::notify(web::json::value data) -{ - MITK_INFO << "Observer: Data in observer"; - data[L"key 1"] = web::json::value::string(U("Data modified by /example and port 8090 observer")); - return data; -} \ No newline at end of file diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake index 90ce5191ff..d8426ee60b 100644 --- a/Plugins/PluginList.cmake +++ b/Plugins/PluginList.cmake @@ -1,115 +1,116 @@ # Plug-ins must be ordered according to their dependencies set(MITK_PLUGINS org.blueberry.core.runtime:ON org.blueberry.core.expressions:OFF org.blueberry.core.commands:OFF org.blueberry.core.jobs:OFF org.blueberry.ui.qt:OFF org.blueberry.ui.qt.help:ON org.blueberry.ui.qt.log:ON org.blueberry.ui.qt.objectinspector:OFF #org.blueberry.test:ON #org.blueberry.uitest:ON #Testing/org.blueberry.core.runtime.tests:ON #Testing/org.blueberry.osgi.tests:ON org.mitk.core.services:ON org.mitk.gui.common:ON org.mitk.planarfigure:ON org.mitk.core.ext:OFF org.mitk.core.jobs:OFF org.mitk.gui.qt.application:ON org.mitk.gui.qt.coreapplication:OFF org.mitk.gui.qt.ext:OFF org.mitk.gui.qt.extapplication:OFF org.mitk.gui.qt.common:ON org.mitk.gui.qt.stdmultiwidgeteditor:ON org.mitk.gui.qt.common.legacy:OFF org.mitk.gui.qt.cmdlinemodules:OFF org.mitk.gui.qt.diffusionimagingapp:OFF org.mitk.gui.qt.datamanager:ON org.mitk.gui.qt.datamanagerlight:OFF org.mitk.gui.qt.datastorageviewertest:OFF org.mitk.gui.qt.properties:ON org.mitk.gui.qt.basicimageprocessing:OFF org.mitk.gui.qt.dicom:OFF org.mitk.gui.qt.dicominspector:OFF org.mitk.gui.qt.diffusionimaging:OFF org.mitk.gui.qt.diffusionimaging.connectomics:OFF org.mitk.gui.qt.diffusionimaging.denoising:OFF org.mitk.gui.qt.diffusionimaging.fiberfox:OFF org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF org.mitk.gui.qt.diffusionimaging.ivim:OFF org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF org.mitk.gui.qt.diffusionimaging.partialvolume:OFF org.mitk.gui.qt.diffusionimaging.preprocessing:OFF org.mitk.gui.qt.diffusionimaging.reconstruction:OFF org.mitk.gui.qt.diffusionimaging.registration:OFF org.mitk.gui.qt.diffusionimaging.tbss:OFF org.mitk.gui.qt.diffusionimaging.tractography:OFF org.mitk.gui.qt.diffusionimaging.python:OFF org.mitk.gui.qt.dosevisualization:OFF org.mitk.gui.qt.geometrytools:OFF org.mitk.gui.qt.igtexamples:OFF org.mitk.gui.qt.igttracking:OFF org.mitk.gui.qt.lasercontrol:OFF org.mitk.gui.qt.openigtlink:OFF org.mitk.gui.qt.imagecropper:OFF org.mitk.gui.qt.imagenavigator:ON org.mitk.gui.qt.viewnavigator:OFF org.mitk.gui.qt.materialeditor:OFF org.mitk.gui.qt.measurementtoolbox:OFF org.mitk.gui.qt.moviemaker:OFF org.mitk.gui.qt.pointsetinteraction:OFF org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF org.mitk.gui.qt.python:OFF org.mitk.gui.qt.remeshing:OFF org.mitk.gui.qt.segmentation:OFF org.mitk.gui.qt.segmentation.rework:OFF org.mitk.gui.qt.aicpregistration:OFF org.mitk.gui.qt.renderwindowmanager:OFF org.mitk.gui.qt.toftutorial:OFF org.mitk.gui.qt.tofutil:OFF org.mitk.gui.qt.tubegraph:OFF org.mitk.gui.qt.ugvisualization:OFF org.mitk.gui.qt.photoacoustics.pausviewer:OFF org.mitk.gui.qt.photoacoustics.pausmotioncompensation:OFF org.mitk.gui.qt.photoacoustics.imageprocessing:OFF org.mitk.gui.qt.photoacoustics.simulation:OFF org.mitk.gui.qt.photoacoustics.spectralunmixing:OFF org.mitk.gui.qt.ultrasound:OFF org.mitk.gui.qt.volumevisualization:OFF org.mitk.gui.qt.eventrecorder:OFF org.mitk.gui.qt.xnat:OFF org.mitk.gui.qt.igt.app.echotrack:OFF org.mitk.gui.qt.spectrocamrecorder:OFF org.mitk.gui.qt.classificationsegmentation:OFF org.mitk.gui.qt.overlaymanager:OFF org.mitk.gui.qt.igt.app.hummelprotocolmeasurements:OFF org.mitk.gui.qt.multilabelsegmentation:OFF org.mitk.matchpoint.core.helper:OFF org.mitk.gui.qt.matchpoint.algorithm.browser:OFF org.mitk.gui.qt.matchpoint.algorithm.control:OFF org.mitk.gui.qt.matchpoint.algorithm.batch:OFF org.mitk.gui.qt.matchpoint.mapper:OFF org.mitk.gui.qt.matchpoint.framereg:OFF org.mitk.gui.qt.matchpoint.visualizer:OFF org.mitk.gui.qt.matchpoint.evaluator:OFF org.mitk.gui.qt.matchpoint.manipulator:OFF org.mitk.gui.qt.preprocessing.resampling:OFF org.mitk.gui.qt.radiomics:OFF org.mitk.gui.qt.cest:OFF org.mitk.gui.qt.fit.demo:OFF org.mitk.gui.qt.fit.inspector:OFF org.mitk.gui.qt.fit.genericfitting:OFF org.mitk.gui.qt.pharmacokinetics.mri:OFF org.mitk.gui.qt.pharmacokinetics.pet:OFF org.mitk.gui.qt.pharmacokinetics.simulation:OFF org.mitk.gui.qt.pharmacokinetics.curvedescriptor:OFF org.mitk.gui.qt.pharmacokinetics.concentration.mri:OFF + org.mitk.gui.qt.thread:ON ) diff --git a/Plugins/org.mitk.gui.qt.thread/CMakeLists.txt b/Plugins/org.mitk.gui.qt.thread/CMakeLists.txt new file mode 100644 index 0000000000..85d40e1438 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/CMakeLists.txt @@ -0,0 +1,7 @@ +project(org_mitk_gui_qt_thread) + +mitk_create_plugin( + EXPORT_DIRECTIVE THREAD_EXPORT + EXPORTED_INCLUDE_SUFFIXES src + MODULE_DEPENDS PRIVATE MitkQtWidgets MitkCppRestSdk +) diff --git a/Plugins/org.mitk.gui.qt.thread/files.cmake b/Plugins/org.mitk.gui.qt.thread/files.cmake new file mode 100644 index 0000000000..505c01fec8 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/files.cmake @@ -0,0 +1,21 @@ +set(CPP_FILES + src/internal/PluginActivator.cpp + src/internal/QmitkThreadView.cpp +) + +set(UI_FILES + src/internal/QmitkThreadView.ui +) + +set(MOC_H_FILES + src/internal/PluginActivator.h + src/internal/QmitkThreadView.h +) + +set(CACHED_RESOURCE_FILES + resources/ThreadIcon.png + plugin.xml +) + +set(QRC_FILES +) diff --git a/Plugins/org.mitk.gui.qt.thread/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.thread/manifest_headers.cmake new file mode 100644 index 0000000000..47d7e9e9c2 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/manifest_headers.cmake @@ -0,0 +1,5 @@ +set(Plugin-Name "Thread Plugin") +set(Plugin-Version "1.0") +set(Plugin-Vendor "CAMIC") +set(Plugin-ContactAddress "https://mitk.org") +set(Require-Plugin org.mitk.gui.qt.common) diff --git a/Plugins/org.mitk.gui.qt.thread/plugin.xml b/Plugins/org.mitk.gui.qt.thread/plugin.xml new file mode 100644 index 0000000000..a0aa4d1217 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/plugin.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/Plugins/org.mitk.gui.qt.thread/resources/ThreadIcon.png b/Plugins/org.mitk.gui.qt.thread/resources/ThreadIcon.png new file mode 100644 index 0000000000..67039a6cfb Binary files /dev/null and b/Plugins/org.mitk.gui.qt.thread/resources/ThreadIcon.png differ diff --git a/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.cpp b/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.cpp new file mode 100644 index 0000000000..eb9114ca56 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.cpp @@ -0,0 +1,27 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "PluginActivator.h" +#include "QmitkThreadView.h" + +void PluginActivator::start(ctkPluginContext* context) +{ + BERRY_REGISTER_EXTENSION_CLASS(QmitkThreadView, context) +} + +void PluginActivator::stop(ctkPluginContext*) +{ +} diff --git a/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.h b/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.h new file mode 100644 index 0000000000..4a8cacfbb5 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/src/internal/PluginActivator.h @@ -0,0 +1,33 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef PluginActivator_h +#define PluginActivator_h + +#include + +class PluginActivator : public QObject, public ctkPluginActivator +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_exampleplugin") + Q_INTERFACES(ctkPluginActivator) + +public: + void start(ctkPluginContext* context); + void stop(ctkPluginContext* context); +}; + +#endif diff --git a/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.cpp b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.cpp new file mode 100644 index 0000000000..6775892af1 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.cpp @@ -0,0 +1,95 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "QmitkThreadView.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +const std::string QmitkThreadView::VIEW_ID = "org.mitk.views.threadview"; + +QmitkThreadView::QmitkThreadView() + : m_Ui(new Ui::QmitkThreadView) +{ + mitk::ForceLinkage(); +} + +web::json::value QmitkThreadView::Notify(web::json::value data) +{ + MITK_INFO << "Observer: Data in observer"; + return data.at(U("key 1")); +} + +QmitkThreadView::~QmitkThreadView() +{ + delete m_Ui; +} + +void QmitkThreadView::CreateQtPartControl(QWidget* parent) +{ + m_Ui->setupUi(parent); + m_Ui->stopPushButton->setDisabled(true); + + connect(m_Ui->startPushButton, &QPushButton::clicked, this, &QmitkThreadView::OnStartButtonClicked); + connect(m_Ui->stopPushButton, &QPushButton::clicked, this, &QmitkThreadView::OnStopButtonClicked); +} + +void QmitkThreadView::SetFocus() +{ + m_Ui->startPushButton->setFocus(); +} + +void QmitkThreadView::OnStartButtonClicked() +{ + us::ModuleContext *context = us::ModuleRegistry::GetModule(1)->GetModuleContext(); + + auto managerRef = context->GetServiceReference(); + if (managerRef) + { + auto managerService = context->GetService(managerRef); + if (managerService) + { + managerService->ReceiveRequest(L"http://localhost:8080/test", this); + managerService->ReceiveRequest(L"http://localhost:8090", this); + managerService->ReceiveRequest(L"http://localhost:8080/example", this); + } + } + m_Ui->stopPushButton->setEnabled(true); +} + +void QmitkThreadView::OnStopButtonClicked() +{ + us::ModuleContext *context = us::ModuleRegistry::GetModule(1)->GetModuleContext(); + + auto managerRef = context->GetServiceReference(); + if (managerRef) + { + auto managerService = context->GetService(managerRef); + if (managerService) + { + managerService->HandleDeleteObserver(this); + } + } + m_Ui->stopPushButton->setDisabled(true); + m_Ui->startPushButton->setEnabled(true); +} diff --git a/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.h b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.h new file mode 100644 index 0000000000..afbfd701c0 --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.h @@ -0,0 +1,57 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef QmitkThreadView_h +#define QmitkThreadView_h + +#include +#include + + +namespace Ui +{ + class QmitkThreadView; +} + +namespace mitk +{ + class RESTManager; +} + +class QmitkThreadView : public QmitkAbstractView, public mitk::IRESTObserver +{ + Q_OBJECT + +public: + static const std::string VIEW_ID; + + QmitkThreadView(); + ~QmitkThreadView() override; + + void CreateQtPartControl(QWidget *parent) override; + web::json::value Notify(web::json::value data) override; + +private slots: + void OnStartButtonClicked(); + void OnStopButtonClicked(); + +private: + void SetFocus() override; + + Ui::QmitkThreadView *m_Ui; +}; + +#endif diff --git a/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.ui b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.ui new file mode 100644 index 0000000000..90430d834d --- /dev/null +++ b/Plugins/org.mitk.gui.qt.thread/src/internal/QmitkThreadView.ui @@ -0,0 +1,65 @@ + + + QmitkThreadView + + + + 0 + 0 + 220 + 160 + + + + Thread View + + + + + + Start Listening + + + + + + + Process selected image + + + Stop Listening + + + + + + + + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 220 + + + + + + + + + +