20 InitializeRESTManager();
27 for (
auto const &element : map)
29 queryBuilder.append_query(element.first, element.second);
32 return queryBuilder.to_string();
35 utility::string_t mitk::DICOMweb::CreateWADOUri(utility::string_t studyUID,
36 utility::string_t seriesUID,
37 utility::string_t instanceUID)
40 builder.append_query(U(
"requestType"), U(
"WADO"));
41 builder.append_query(U(
"studyUID"), studyUID);
42 builder.append_query(U(
"seriesUID"), seriesUID);
43 builder.append_query(U(
"objectUID"), instanceUID);
44 builder.append_query(U(
"contentType"), U(
"application/dicom"));
46 return builder.to_string();
49 utility::string_t mitk::DICOMweb::CreateSTOWUri(utility::string_t studyUID)
52 builder.append_path(studyUID);
53 return builder.to_string();
58 auto uri = CreateSTOWUri(studyUID);
61 std::ifstream input(filePath, std::ios::binary);
64 MITK_WARN <<
"could not read file to POST";
65 return pplx::task<void>();
68 std::vector<unsigned char> result;
69 std::vector<unsigned char> buffer;
72 input.unsetf(std::ios::skipws);
74 input.seekg(0, std::ios::end);
75 const std::streampos fileSize = input.tellg();
76 input.seekg(0, std::ios::beg);
78 MITK_INFO << fileSize <<
" bytes will be sent.";
79 buffer.reserve(fileSize);
81 std::istream_iterator<unsigned char>(input), std::istream_iterator<unsigned char>(), std::back_inserter(buffer));
84 std::string head =
"";
85 head +=
"\r\n--boundary";
88 std::vector<unsigned char> bodyVector(head.begin(), head.end());
90 std::string tail =
"";
91 tail +=
"\r\n--boundary--";
93 result.insert(result.end(), bodyVector.begin(), bodyVector.end());
94 result.insert(result.end(), buffer.begin(), buffer.end());
95 result.insert(result.end(), tail.begin(), tail.end());
98 headers.insert(mitk::RESTUtil::ParamMap::value_type(
99 U(
"Content-Type"), U(
"multipart/related; type=\"application/dicom\"; boundary=boundary")));
104 .then([=](web::json::value result) {
110 catch (std::exception &e)
115 return pplx::task<void>();
119 utility::string_t studyUID,
120 utility::string_t seriesUID,
121 utility::string_t instanceUID)
123 auto uri = CreateWADOUri(studyUID, seriesUID, instanceUID);
129 .then([=](web::json::value result) { result.is_null(); });
138 utility::string_t studyUID,
139 utility::string_t seriesUID)
142 seriesInstances.insert(mitk::RESTUtil::ParamMap::value_type(U(
"StudyInstanceUID"), studyUID));
143 seriesInstances.insert(mitk::RESTUtil::ParamMap::value_type(U(
"SeriesInstanceUID"), seriesUID));
145 return SendQIDO(seriesInstances).then([=](web::json::value jsonResult) -> pplx::task<std::string> {
146 auto jsonListResult = jsonResult;
147 auto resultArray = jsonListResult.as_array();
149 auto firstFileName = std::string();
151 std::vector<pplx::task<void>> tasks;
153 for (
unsigned short i = 0; i < resultArray.size(); i++)
157 auto firstResult = resultArray[i];
158 auto sopInstanceUIDKey = firstResult.at(U(
"00080018"));
159 auto sopInstanceObject = sopInstanceUIDKey.as_object();
160 auto valueKey = sopInstanceObject.at(U(
"Value"));
161 auto valueArray = valueKey.as_array();
162 auto sopInstanceUID = valueArray[0].as_string();
164 auto fileName = utility::string_t(sopInstanceUID).append(U(
".dcm"));
169 firstFileName = utility::conversions::to_utf8string(fileName);
172 auto filePath = utility::string_t(folderPath).append(fileName);
173 auto task =
SendWADO(filePath, studyUID, seriesUID, sopInstanceUID);
174 tasks.push_back(task);
176 catch (
const web::json::json_exception &e)
183 auto joinTask = pplx::when_all(begin(tasks), end(tasks));
185 auto returnTask = joinTask.then([=](
void) -> std::string {
186 auto folderPathUtf8 = utility::conversions::to_utf8string(folderPath);
187 auto result = folderPathUtf8 + firstFileName;
198 auto uri = CreateQIDOUri(map);
201 headers.insert(mitk::RESTUtil::ParamMap::value_type(U(
"Accept"), U(
"application/json")));
205 void mitk::DICOMweb::InitializeRESTManager()
211 auto managerService = context->GetService(managerRef);
214 m_RESTManager = managerService;
virtual pplx::task< web::json::value > SendJSONRequest(const web::uri &uri, const RequestType &type=RequestType::Get, const web::json::value *body=nullptr, const std::map< utility::string_t, utility::string_t > headers={}, const utility::string_t &filePath={})=0
Executes a HTTP request in the mitkRESTClient class.
This is a microservice interface for managing REST requests.
virtual pplx::task< web::json::value > SendBinaryRequest(const web::uri &uri, const RequestType &type=RequestType::Get, const std::vector< unsigned char > *body={}, const std::map< utility::string_t, utility::string_t > headers={})=0
Executes a HTTP request in the mitkRESTClient class.
An object of this class represents an exception of MITK. Please don't instantiate exceptions manually...
web::http::uri_builder MitkUriBuilder
pplx::task< web::json::value > SendQIDO(mitk::RESTUtil::ParamMap map)
Sends a QIDO request containing the given parameters to filter the query.
static std::string convertToUtf8(const utility::string_t &string)
Converts the given std::wstring into a std::string representation.
std::map< utility::string_t, utility::string_t > ParamMap
pplx::task< void > SendWADO(utility::string_t filePath, utility::string_t studyUID, utility::string_t seriesUID, utility::string_t instanceUID)
Sends a WADO request for an DICOM object instance matching the given uid parameters and stores it at ...
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
pplx::task< void > SendSTOW(utility::string_t filePath, utility::string_t studyUID)
Sends a STOW request with the file in the given path to the study given bei its UID.