diff --git a/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/DICOMweb.cpp b/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/DICOMweb.cpp new file mode 100644 index 0000000000..2f3e491a2f --- /dev/null +++ b/Plugins/org.mitk.gui.qt.segmentation.rework/src/internal/DICOMweb.cpp @@ -0,0 +1,203 @@ +/*=================================================================== + +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 "DICOMweb.h" + +DICOMweb::DICOMweb() {} + +DICOMweb::DICOMweb(utility::string_t baseURI) : m_BaseURI(baseURI) { + MITK_INFO << "base uri: " << mitk::RESTUtil::convertToUtf8(m_BaseURI); +} + +utility::string_t DICOMweb::CreateQIDOUri(mitk::RESTUtil::ParamMap map) +{ + MitkUriBuilder queryBuilder(m_BaseURI.append(U("rs/instances"))); + + for (auto const &element : map) + { + queryBuilder.append_query(element.first, element.second); + } + + return queryBuilder.to_string(); +} + +/** + * @brief Creates a WADO request URI with the given parameter + */ +utility::string_t DICOMweb::CreateWADOUri(utility::string_t studyUID, + utility::string_t seriesUID, + utility::string_t instanceUID) +{ + MitkUriBuilder builder(m_BaseURI.append(U("wado"))); + builder.append_query(U("requestType"), U("WADO")); + builder.append_query(U("studyUID"), studyUID); + builder.append_query(U("seriesUID"), seriesUID); + builder.append_query(U("objectUID"), instanceUID); + builder.append_query(U("contentType"), U("application/dicom")); + + return builder.to_string(); +} + +/** + * @brief Creates a STOW request URI with the given parameter map + */ +utility::string_t DICOMweb::CreateSTOWUri(utility::string_t studyUID) +{ + MitkUriBuilder builder(m_BaseURI.append(U("rs/studies"))); + builder.append_path(studyUID); + return builder.to_string(); +} + +pplx::task DICOMweb::SendSTOW(utility::string_t filePath, utility::string_t studyUID) +{ + auto uri = CreateSTOWUri(studyUID); + auto manager = RESTManager(); + + // TODO: complete STOW + return manager->SendRequest(uri, mitk::IRESTManager::RequestType::Post, {}, {}, filePath) + .then([=](web::json::value result){}); +} + +pplx::task DICOMweb::SendWADO(utility::string_t filePath, + utility::string_t studyUID, + utility::string_t seriesUID, + utility::string_t instanceUID, + mitk::IRESTManager *manager) +{ + auto uri = CreateWADOUri(studyUID, seriesUID, instanceUID); + + // don't want return something + return manager->SendRequest(uri, mitk::IRESTManager::RequestType::Get, {}, {}, filePath) + .then([=](web::json::value result){}); +} + +pplx::task DICOMweb::SendWADO(utility::string_t folderPath, + utility::string_t studyUID, + utility::string_t seriesUID) +{ + mitk::RESTUtil::ParamMap seriesInstances; + seriesInstances.insert(mitk::RESTUtil::ParamMap::value_type(U("StudyInstanceUID"), studyUID)); + seriesInstances.insert(mitk::RESTUtil::ParamMap::value_type(U("SeriesInstanceUID"), seriesUID)); + + auto *manager = RESTManager(); + + return SendQIDO(seriesInstances).then([=](web::json::value jsonResult) -> pplx::task { + auto jsonListResult = jsonResult; + auto resultArray = jsonListResult.as_array(); + + auto firstFileName = std::string(); + + std::vector> tasks; + + for (unsigned short i = 0; i < resultArray.size(); i++) + { + try + { + auto firstResult = resultArray[i]; + auto sopInstanceUIDKey = firstResult.at(U("00080018")); + auto sopInstanceObject = sopInstanceUIDKey.as_object(); + auto valueKey = sopInstanceObject.at(U("Value")); + auto valueArray = valueKey.as_array(); + auto sopInstanceUID = valueArray[0].as_string(); + + auto fileName = utility::string_t(sopInstanceUID).append(U(".dcm")); + + // save first file name as result to load series + if (i == 0) + { + firstFileName = utility::conversions::to_utf8string(fileName); + } + + auto filePath = utility::string_t(folderPath).append(fileName); + auto task = SendWADO(filePath, studyUID, seriesUID, sopInstanceUID, manager); + tasks.push_back(task); + } + catch (const web::json::json_exception &e) + { + MITK_ERROR << e.what(); + } + } + + auto joinTask = pplx::when_all(begin(tasks), end(tasks)); + + auto returnTask = joinTask.then([=](void) -> std::string { + auto folderPathUtf8 = utility::conversions::to_utf8string(folderPath); + auto result = folderPathUtf8 + firstFileName; + + return result; + }); + + return returnTask; + }); +} + +pplx::task DICOMweb::SendQIDO(mitk::RESTUtil::ParamMap map) +{ + auto uri = CreateQIDOUri(map); + + mitk::IRESTManager *manager = RESTManager(); + + mitk::RESTUtil::ParamMap headers; + headers.insert(mitk::RESTUtil::ParamMap::value_type(U("Accept"), U("application/json"))); + + return manager->SendRequest(uri, mitk::IRESTManager::RequestType::Get, {}, headers); + // return manager->SendRequest(queryBuilder.to_string()).then([=](pplx::task taskResponse) { + // try + // { + // MitkResponse response = taskResponse.get(); + // auto status = response.status_code(); + // MITK_INFO << " status: " << status; + + // if (status != web::http::status_codes::OK) + // { + // MITK_ERROR << "no dicom series found for query " + // << utility::conversions::to_utf8string(queryBuilder.to_string()); + // mitkThrow() << "no dicom series found for query " + // << utility::conversions::to_utf8string(queryBuilder.to_string()); + // } + + // if (response.headers()[U("Content-Type")] == U("application/dicom+json")) + // { + // response.headers().remove(U("Content-Type")); + // response.headers().add(U("Content-Type"), U("application/json")); + // } + + // return response.extract_json().get(); + // } + // catch (std::exception &e) + // { + // mitkThrow() << e.what(); + // } + //}); +} + +mitk::IRESTManager* DICOMweb::RESTManager() +{ + auto *context = us::GetModuleContext(); + auto managerRef = context->GetServiceReference(); + if (managerRef) + { + auto managerService = context->GetService(managerRef); + if (managerService) + { + return managerService; + } + } + return nullptr; +} +