diff --git a/Modules/CppRestSdk/include/mitkIRESTManager.h b/Modules/CppRestSdk/include/mitkIRESTManager.h index cd6d73b3a1..5c163e23ce 100644 --- a/Modules/CppRestSdk/include/mitkIRESTManager.h +++ b/Modules/CppRestSdk/include/mitkIRESTManager.h @@ -1,32 +1,32 @@ #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() = 0; + virtual void handleDeleteClient(IRESTObserver *observer) = 0; }; } // namespace mitk MITK_DECLARE_SERVICE_INTERFACE(mitk::IRESTManager, "org.mitk.IRESTManager") #endif diff --git a/Modules/CppRestSdk/include/mitkRESTManager.h b/Modules/CppRestSdk/include/mitkRESTManager.h index 3475d14be4..c324af383a 100644 --- a/Modules/CppRestSdk/include/mitkRESTManager.h +++ b/Modules/CppRestSdk/include/mitkRESTManager.h @@ -1,32 +1,32 @@ #ifndef mitkRESTManager_h #define mitkRESTManager_h #include #include #include #include namespace mitk { class RESTManager : public IRESTManager { public: RESTManager(); ~RESTManager() 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; - virtual void handleDeleteClient() override; + virtual void handleDeleteClient(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 }; } // namespace mitk #endif // !mitkRESTManager_h diff --git a/Modules/CppRestSdk/src/mitkIRESTObserver.cpp b/Modules/CppRestSdk/src/mitkIRESTObserver.cpp index f2c1de13fc..b370c8364e 100644 --- a/Modules/CppRestSdk/src/mitkIRESTObserver.cpp +++ b/Modules/CppRestSdk/src/mitkIRESTObserver.cpp @@ -1,20 +1,20 @@ #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(); + managerService->handleDeleteClient(this); } } MITK_INFO << "virtual destructor was called"; } diff --git a/Modules/CppRestSdk/src/mitkRESTManager.cpp b/Modules/CppRestSdk/src/mitkRESTManager.cpp index d6ea95658f..e698960b60 100644 --- a/Modules/CppRestSdk/src/mitkRESTManager.cpp +++ b/Modules/CppRestSdk/src/mitkRESTManager.cpp @@ -1,100 +1,126 @@ #include "mitkRESTManager.h" #include mitk::RESTManager::RESTManager() {} mitk::RESTManager::~RESTManager() {} 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) { // 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); // creating server instance RESTServerMicroService *server = new RESTServerMicroService(uri.authority()); // add reference to server instance to map m_ServerMap[port] = server; // info output 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; // 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); // info output MITK_INFO << "started listening, no new server instance has been created"; } // Error, since another server can't be added under this port else { MITK_ERROR << "there is already another server listening under this port"; } } } 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); } //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() +void mitk::RESTManager::handleDeleteClient(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) + { + + 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); + 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 + } + else + { + ++it; + } + } MITK_INFO << "Handle delete client"; //TODO implement }