Mercurial > hg > orthanc-dicomweb
changeset 451:f9abaad46bba
preparing for transcoding in WADO-RS retrieve
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 22 Jun 2020 15:02:56 +0200 |
parents | 00a018f4ec05 |
children | 36d04c9586c1 |
files | Plugin/WadoRs.cpp |
diffstat | 1 files changed, 45 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/Plugin/WadoRs.cpp Mon Jun 22 14:55:53 2020 +0200 +++ b/Plugin/WadoRs.cpp Mon Jun 22 15:02:56 2020 +0200 @@ -56,8 +56,11 @@ -static bool AcceptMultipartDicom(const OrthancPluginHttpRequest* request) +static bool AcceptMultipartDicom(bool& transcode, + Orthanc::DicomTransferSyntax& transferSyntax /* only if transcoding */, + const OrthancPluginHttpRequest* request) { + transcode = false; std::string accept; if (!OrthancPlugins::LookupHttpHeader(accept, request, "accept")) @@ -90,16 +93,23 @@ static const char* const TRANSFER_SYNTAX = "transfer-syntax"; - /** - * The "*" case below is related to Google Healthcare API: - * https://groups.google.com/d/msg/orthanc-users/w1Ekrsc6-U8/T2a_DoQ5CwAJ - **/ - if (attributes.find(TRANSFER_SYNTAX) != attributes.end() && - attributes[TRANSFER_SYNTAX] != "*") + std::map<std::string, std::string>::const_iterator found = attributes.find(TRANSFER_SYNTAX); + if (found != attributes.end()) { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, - "This WADO-RS plugin cannot change the transfer syntax to " + - attributes["transfer-syntax"]); + /** + * The "*" case below is related to Google Healthcare API: + * https://groups.google.com/d/msg/orthanc-users/w1Ekrsc6-U8/T2a_DoQ5CwAJ + **/ + if (found->second == "*") + { + transcode = false; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, + "This WADO-RS plugin cannot change the transfer syntax to " + + found->second); + } } return true; @@ -222,7 +232,9 @@ static void AnswerListOfDicomInstances(OrthancPluginRestOutput* output, Orthanc::ResourceType level, - const std::string& publicId) + const std::string& publicId, + bool transcode, + Orthanc::DicomTransferSyntax transferSyntax /* only if transcoding */) { if (level != Orthanc::ResourceType_Study && level != Orthanc::ResourceType_Series && @@ -263,11 +275,16 @@ std::string uri = "/instances/" + instances[i]["ID"].asString() + "/file"; OrthancPlugins::MemoryBuffer dicom; - if (dicom.RestApiGet(uri, false) && + if (dicom.RestApiGet(uri, false)) + { + if (! OrthancPluginSendMultipartItem(context, output, dicom.GetData(), dicom.GetSize()) != 0) { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } + + /*instance.reset(OrthancPlugins::DicomInstance::Transcode( + content.GetData(), content.GetSize(), GetTransferSyntaxUid(targetSyntax)));*/ } } @@ -867,7 +884,10 @@ const char* url, const OrthancPluginHttpRequest* request) { - if (!AcceptMultipartDicom(request)) + bool transcode; + Orthanc::DicomTransferSyntax transferSyntax; + + if (!AcceptMultipartDicom(transcode, transferSyntax, request)) { OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */); } @@ -876,7 +896,7 @@ std::string orthancId, studyInstanceUid; if (LocateStudy(output, orthancId, studyInstanceUid, request)) { - AnswerListOfDicomInstances(output, Orthanc::ResourceType_Study, orthancId); + AnswerListOfDicomInstances(output, Orthanc::ResourceType_Study, orthancId, transcode, transferSyntax); } } } @@ -886,7 +906,10 @@ const char* url, const OrthancPluginHttpRequest* request) { - if (!AcceptMultipartDicom(request)) + bool transcode; + Orthanc::DicomTransferSyntax transferSyntax; + + if (!AcceptMultipartDicom(transcode, transferSyntax, request)) { OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */); } @@ -895,7 +918,7 @@ std::string orthancId, studyInstanceUid, seriesInstanceUid; if (LocateSeries(output, orthancId, studyInstanceUid, seriesInstanceUid, request)) { - AnswerListOfDicomInstances(output, Orthanc::ResourceType_Series, orthancId); + AnswerListOfDicomInstances(output, Orthanc::ResourceType_Series, orthancId, transcode, transferSyntax); } } } @@ -906,18 +929,19 @@ const char* url, const OrthancPluginHttpRequest* request) { - OrthancPluginContext* context = OrthancPlugins::GetGlobalContext(); - - if (!AcceptMultipartDicom(request)) + bool transcode; + Orthanc::DicomTransferSyntax transferSyntax; + + if (!AcceptMultipartDicom(transcode, transferSyntax, request)) { - OrthancPluginSendHttpStatusCode(context, output, 400 /* Bad request */); + OrthancPluginSendHttpStatusCode(OrthancPlugins::GetGlobalContext(), output, 400 /* Bad request */); } else { std::string orthancId, studyInstanceUid, seriesInstanceUid, sopInstanceUid; if (LocateInstance(output, orthancId, studyInstanceUid, seriesInstanceUid, sopInstanceUid, request)) { - AnswerListOfDicomInstances(output, Orthanc::ResourceType_Instance, orthancId); + AnswerListOfDicomInstances(output, Orthanc::ResourceType_Instance, orthancId, transcode, transferSyntax); } } }