annotate OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp @ 5828:7030fa489669 find-refactoring

tools/find: QueryMetadata
author Alain Mazy <am@orthanc.team>
date Mon, 07 Oct 2024 15:19:26 +0200
parents d73dfb4548c6
children 963945d780d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1860
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1281
diff changeset
4 * Department, University Hospital of Liege, Belgium
5640
f7adfb22e20e updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5558
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
f7adfb22e20e updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5558
diff changeset
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium
5485
48b8dae6dc77 upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5467
diff changeset
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * This program is free software: you can redistribute it and/or
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * modify it under the terms of the GNU General Public License as
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * published by the Free Software Foundation, either version 3 of the
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * License, or (at your option) any later version.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful, but
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * General Public License for more details.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 *
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 824
diff changeset
24 #include "../PrecompiledHeadersServer.h"
5608
3d0aa94b44b3 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5607
diff changeset
25 #include "../ResourceFinder.h"
3d0aa94b44b3 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5607
diff changeset
26
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 #include "OrthancRestApi.h"
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
29 #include "../../../OrthancFramework/Sources/Compression/GzipCompressor.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
30 #include "../../../OrthancFramework/Sources/DicomFormat/DicomImageInformation.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
31 #include "../../../OrthancFramework/Sources/DicomParsing/DicomWebJsonVisitor.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
32 #include "../../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
33 #include "../../../OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
34 #include "../../../OrthancFramework/Sources/HttpServer/HttpContentNegociation.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
35 #include "../../../OrthancFramework/Sources/Images/Image.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
36 #include "../../../OrthancFramework/Sources/Images/ImageProcessing.h"
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
37 #include "../../../OrthancFramework/Sources/Images/NumpyWriter.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
38 #include "../../../OrthancFramework/Sources/Logging.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
39 #include "../../../OrthancFramework/Sources/MultiThreading/Semaphore.h"
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
40 #include "../../../OrthancFramework/Sources/SerializationToolbox.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
41
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
42 #include "../OrthancConfiguration.h"
3094
61da3c9b4121 cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3085
diff changeset
43 #include "../Search/DatabaseLookup.h"
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
44 #include "../Search/DatabaseMetadataConstraint.h"
1437
02f5a3f5c0a0 access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1385
diff changeset
45 #include "../ServerContext.h"
2131
bb199bccdc45 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2129
diff changeset
46 #include "../ServerToolbox.h"
1702
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
47 #include "../SliceOrdering.h"
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
3687
e6d6f8d23d02 fix linking
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3686
diff changeset
49 // This "include" is mandatory for Release builds using Linux Standard Base
e6d6f8d23d02 fix linking
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3686
diff changeset
50 #include <boost/math/special_functions/round.hpp>
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
51 #include <boost/shared_ptr.hpp>
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
3926
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
53 /**
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
54 * This semaphore is used to limit the number of concurrent HTTP
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
55 * requests on CPU-intensive routes of the REST API, in order to
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
56 * prevent exhaustion of resources (new in Orthanc 1.7.0).
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
57 **/
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
58 static Orthanc::Semaphore throttlingSemaphore_(4); // TODO => PARAMETER?
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
59
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
60
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
61 static const std::string CHECK_REVISIONS = "CheckRevisions";
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
62
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
63 static const char* const IGNORE_LENGTH = "ignore-length";
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
64 static const char* const RECONSTRUCT_FILES = "ReconstructFiles";
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
65 static const char* const LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS = "LimitToThisLevelMainDicomTags";
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
66 static const char* const ARG_WHOLE = "whole";
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
67
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
68
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 namespace Orthanc
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 {
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
71 static std::string GetDocumentationSampleResource(ResourceType type)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
72 {
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
73 switch (type)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
74 {
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
75 case Orthanc::ResourceType_Instance:
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
76 return "https://orthanc.uclouvain.be/demo/instances/6582b1c0-292ad5ab-ba0f088f-f7a1766f-9a29a54f";
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
77 break;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
78
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
79 case Orthanc::ResourceType_Series:
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
80 return "https://orthanc.uclouvain.be/demo/series/37836232-d13a2350-fa1dedc5-962b31aa-010f8e52";
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
81 break;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
82
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
83 case Orthanc::ResourceType_Study:
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
84 return "https://orthanc.uclouvain.be/demo/studies/27f7126f-4f66fb14-03f4081b-f9341db2-53925988";
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
85 break;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
86
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
87 case Orthanc::ResourceType_Patient:
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
88 return "https://orthanc.uclouvain.be/demo/patients/46e6332c-677825b6-202fcf7c-f787bc5f-7b07c382";
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
89 break;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
90
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
91 default:
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
92 throw OrthancException(ErrorCode_ParameterOutOfRange);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
93 }
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
94 }
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
95
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
96
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
97 static void AnswerDicomAsJson(RestApiCall& call,
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
98 const Json::Value& dicom,
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
99 DicomToJsonFormat mode)
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
100 {
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
101 if (mode != DicomToJsonFormat_Full)
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
102 {
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
103 Json::Value simplified;
4055
9214e3a7b0a2 moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
104 Toolbox::SimplifyDicomAsJson(simplified, dicom, mode);
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
105 call.GetOutput().AnswerJson(simplified);
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
106 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
107 else
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
108 {
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
109 call.GetOutput().AnswerJson(dicom);
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
110 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
111 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
112
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
113
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
114 static void ParseSetOfTags(std::set<DicomTag>& target,
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
115 const RestApiGetCall& call,
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
116 const std::string& argument)
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
117 {
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
118 target.clear();
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
119
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
120 if (call.HasArgument(argument))
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
121 {
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
122 std::vector<std::string> tags;
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
123 Toolbox::TokenizeString(tags, call.GetArgument(argument, ""), ',');
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
124
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
125 for (size_t i = 0; i < tags.size(); i++)
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
126 {
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
127 target.insert(FromDcmtkBridge::ParseTag(tags[i]));
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
128 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
129 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
130 }
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
131
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
132
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
133 static bool ExpandResource(Json::Value& target,
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5713
diff changeset
134 ServerContext& context,
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
135 ResourceType level,
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
136 const std::string& identifier,
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
137 DicomToJsonFormat format,
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
138 bool retrieveMetadata)
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
139 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
140 ResourceFinder finder(level, true /* expand */);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
141 finder.SetOrthancId(level, identifier);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
142 finder.SetRetrieveMetadata(retrieveMetadata);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
143
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5713
diff changeset
144 return finder.ExecuteOneResource(target, context, format, retrieveMetadata);
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
145 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
146
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
147
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 // List all the patients, studies, series or instances ----------------------
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
150 static void AnswerListOfResources1(RestApiOutput& output,
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
151 ServerContext& context,
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
152 const std::list<std::string>& resources,
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
153 const std::map<std::string, std::string>& instancesIds, // optional: the id of an instance for each found resource.
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
154 const std::map<std::string, boost::shared_ptr<DicomMap> >& resourcesMainDicomTags, // optional: all tags read from DB for a resource (current level and upper levels)
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
155 const std::map<std::string, boost::shared_ptr<Json::Value> >& resourcesDicomAsJson, // optional: the dicom-as-json for each resource
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
156 ResourceType level,
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
157 bool expand,
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
158 DicomToJsonFormat format,
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
159 const std::set<DicomTag>& requestedTags,
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
160 bool allowStorageAccess)
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
161 {
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
162 Json::Value answer = Json::arrayValue;
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
163
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
164 for (std::list<std::string>::const_iterator
1384
d6971e18a324 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1374
diff changeset
165 resource = resources.begin(); resource != resources.end(); ++resource)
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
166 {
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
167 if (expand)
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
168 {
4554
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
169 Json::Value expanded;
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
170
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
171 std::map<std::string, std::string>::const_iterator instanceId = instancesIds.find(*resource);
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
172 if (instanceId != instancesIds.end()) // if it is found in instancesIds, it is also in resourcesDicomAsJson and mainDicomTags
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
173 {
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
174 // reuse data already collected before (e.g during lookup)
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
175 std::map<std::string, boost::shared_ptr<DicomMap> >::const_iterator mainDicomTags = resourcesMainDicomTags.find(*resource);
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
176 std::map<std::string, boost::shared_ptr<Json::Value> >::const_iterator dicomAsJson = resourcesDicomAsJson.find(*resource);
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
177
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
178 context.ExpandResource(expanded, *resource,
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
179 *(mainDicomTags->second.get()),
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
180 instanceId->second,
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
181 dicomAsJson->second.get(),
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
182 level, format, requestedTags, allowStorageAccess);
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
183 }
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
184 else
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
185 {
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
186 context.ExpandResource(expanded, *resource, level, format, requestedTags, allowStorageAccess);
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
187 }
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
188
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
189 if (expanded.type() == Json::objectValue)
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
190 {
4554
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
191 answer.append(expanded);
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
192 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
193 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
194 else
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
195 {
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
196 answer.append(*resource);
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
197 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
198 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
199
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
200 output.AnswerJson(answer);
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
201 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
202
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
203
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
204 static void AnswerListOfResources2(RestApiOutput& output,
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
205 ServerContext& context,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
206 const std::list<std::string>& resources,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
207 ResourceType level,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
208 bool expand,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
209 DicomToJsonFormat format,
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
210 const std::set<DicomTag>& requestedTags,
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
211 bool allowStorageAccess)
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
212 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
213 std::map<std::string, std::string> unusedInstancesIds;
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
214 std::map<std::string, boost::shared_ptr<DicomMap> > unusedResourcesMainDicomTags;
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
215 std::map<std::string, boost::shared_ptr<Json::Value> > unusedResourcesDicomAsJson;
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
216
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
217 AnswerListOfResources1(output, context, resources, unusedInstancesIds, unusedResourcesMainDicomTags, unusedResourcesDicomAsJson, level, expand, format, requestedTags, allowStorageAccess);
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
218 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
219
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
220
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 template <enum ResourceType resourceType>
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
222 static void ListResources(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
224 if (call.IsDocumentation())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
225 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
226 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
227 OrthancRestApi::DocumentRequestedTags(call);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
228
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
229 const std::string resources = GetResourceTypeText(resourceType, true /* plural */, false /* lower case */);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
230 call.GetDocumentation()
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
231 .SetTag(GetResourceTypeText(resourceType, true /* plural */, true /* upper case */))
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
232 .SetSummary("List the available " + resources)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
233 .SetDescription("List the Orthanc identifiers of all the available DICOM " + resources)
4403
ad646ff506d0 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4401
diff changeset
234 .SetHttpGetArgument("limit", RestApiCallDocumentation::Type_Number, "Limit the number of results", false)
ad646ff506d0 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4401
diff changeset
235 .SetHttpGetArgument("since", RestApiCallDocumentation::Type_Number, "Show only the resources since the provided index", false)
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
236 .SetHttpGetArgument("expand", RestApiCallDocumentation::Type_String,
4403
ad646ff506d0 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4401
diff changeset
237 "If present, retrieve detailed information about the individual " + resources, false)
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
238 .AddAnswerType(MimeType_Json, "JSON array containing either the Orthanc identifiers, or detailed information "
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
239 "about the reported " + resources + " (if `expand` argument is provided)")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
240 .SetHttpGetSample("https://orthanc.uclouvain.be/demo/" + resources + "?since=0&limit=2", true);
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
241 return;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
242 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
243
1342
9ec7ac03152d "?expand" flag for URIs "/patients", "/studies" and "/series"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1303
diff changeset
244 ServerIndex& index = OrthancRestApi::GetIndex(call);
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
245 ServerContext& context = OrthancRestApi::GetContext(call);
1342
9ec7ac03152d "?expand" flag for URIs "/patients", "/studies" and "/series"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1303
diff changeset
246
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
247 if (true)
1509
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
248 {
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
249 /**
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
250 * EXPERIMENTAL VERSION
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
251 **/
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
252
5574
5a13483d12c5 find-refactoring: attachments
Alain Mazy <am@orthanc.team>
parents: 5569
diff changeset
253 // TODO-FIND: include the FindRequest options parsing in a method (parse from get-arguments and from post payload)
5a13483d12c5 find-refactoring: attachments
Alain Mazy <am@orthanc.team>
parents: 5569
diff changeset
254 // TODO-FIND: support other values for expand like expand=MainDicomTags,Labels,Parent,SeriesStatus
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
255 const bool expand = (call.HasArgument("expand") &&
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
256 call.GetBooleanArgument("expand", true));
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
257
5574
5a13483d12c5 find-refactoring: attachments
Alain Mazy <am@orthanc.team>
parents: 5569
diff changeset
258 std::set<DicomTag> requestedTags;
5a13483d12c5 find-refactoring: attachments
Alain Mazy <am@orthanc.team>
parents: 5569
diff changeset
259 OrthancRestApi::GetRequestedTags(requestedTags, call);
5a13483d12c5 find-refactoring: attachments
Alain Mazy <am@orthanc.team>
parents: 5569
diff changeset
260
5600
8796c100aaf8 introduction of ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5596
diff changeset
261 ResourceFinder finder(resourceType, expand);
5609
4690a0d2b01e preliminary support of requestedTags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5608
diff changeset
262 finder.AddRequestedTags(requestedTags);
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
263
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
264 if (call.HasArgument("limit") ||
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
265 call.HasArgument("since"))
1509
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
266 {
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
267 if (!call.HasArgument("limit"))
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
268 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
269 throw OrthancException(ErrorCode_BadRequest,
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
270 "Missing \"limit\" argument for GET request against: " +
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
271 call.FlattenUri());
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
272 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
273
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
274 if (!call.HasArgument("since"))
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
275 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
276 throw OrthancException(ErrorCode_BadRequest,
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
277 "Missing \"since\" argument for GET request against: " +
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
278 call.FlattenUri());
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
279 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
280
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
281 uint64_t since = boost::lexical_cast<uint64_t>(call.GetArgument("since", ""));
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
282 uint64_t limit = boost::lexical_cast<uint64_t>(call.GetArgument("limit", ""));
5693
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
283 finder.SetLimitsSince(since);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
284 finder.SetLimitsCount(limit);
1509
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
285 }
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
286
5600
8796c100aaf8 introduction of ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5596
diff changeset
287 Json::Value answer;
5713
d851a54e49b7 removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5709
diff changeset
288 finder.Execute(answer, context, OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Human), false /* no "Metadata" field */);
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
289 call.GetOutput().AnswerJson(answer);
1509
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
290 }
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
291 else
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
292 {
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
293 /**
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
294 * VERSION IN ORTHANC <= 1.12.4
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
295 **/
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
296
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
297 std::list<std::string> result;
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
298
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
299 std::set<DicomTag> requestedTags;
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
300 OrthancRestApi::GetRequestedTags(requestedTags, call);
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
301
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
302 if (call.HasArgument("limit") ||
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
303 call.HasArgument("since"))
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
304 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
305 if (!call.HasArgument("limit"))
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
306 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
307 throw OrthancException(ErrorCode_BadRequest,
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
308 "Missing \"limit\" argument for GET request against: " +
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
309 call.FlattenUri());
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
310 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
311
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
312 if (!call.HasArgument("since"))
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
313 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
314 throw OrthancException(ErrorCode_BadRequest,
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
315 "Missing \"since\" argument for GET request against: " +
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
316 call.FlattenUri());
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
317 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
318
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
319 size_t since = boost::lexical_cast<size_t>(call.GetArgument("since", ""));
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
320 size_t limit = boost::lexical_cast<size_t>(call.GetArgument("limit", ""));
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
321 index.GetAllUuids(result, resourceType, since, limit);
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
322 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
323 else
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
324 {
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
325 index.GetAllUuids(result, resourceType);
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
326 }
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
327
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
328 AnswerListOfResources2(call.GetOutput(), context, result, resourceType, call.HasArgument("expand") && call.GetBooleanArgument("expand", true),
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
329 OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Human),
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
330 requestedTags,
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
331 true /* allowStorageAccess */);
1509
0586ed8897f1 limit and since arguments while retrieving DICOM resources in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1486
diff changeset
332 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
335
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
336
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 template <enum ResourceType resourceType>
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
338 static void GetSingleResource(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
340 if (call.IsDocumentation())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
341 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
342 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
343 OrthancRestApi::DocumentRequestedTags(call);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
344
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
345 const std::string resource = GetResourceTypeText(resourceType, false /* plural */, false /* lower case */);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
346 call.GetDocumentation()
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
347 .SetTag(GetResourceTypeText(resourceType, true /* plural */, true /* upper case */))
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
348 .SetSummary("Get information about some " + resource)
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
349 .SetDescription("Get detailed information about the DICOM " + resource + " whose Orthanc identifier is provided in the URL")
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
350 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest")
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
351 .AddAnswerType(MimeType_Json, "Information about the DICOM " + resource)
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
352 .SetHttpGetSample(GetDocumentationSampleResource(resourceType), true);
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
353 return;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
354 }
4551
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
355
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
356 const DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Human);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
357
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
358 std::set<DicomTag> requestedTags;
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
359 OrthancRestApi::GetRequestedTags(requestedTags, call);
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
360
5615
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
361 if (true)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 {
5615
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
363 /**
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
364 * EXPERIMENTAL VERSION
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
365 **/
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
366
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
367 ResourceFinder finder(resourceType, true /* expand */);
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
368 finder.AddRequestedTags(requestedTags);
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
369 finder.SetOrthancId(resourceType, call.GetUriComponent("id", ""));
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
370
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
371 Json::Value json;
5713
d851a54e49b7 removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5709
diff changeset
372 if (finder.ExecuteOneResource(json, OrthancRestApi::GetContext(call), format, false /* no "Metadata" field */))
5615
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
373 {
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
374 call.GetOutput().AnswerJson(json);
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
375 }
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
376 }
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
377 else
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
378 {
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
379 /**
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
380 * VERSION IN ORTHANC <= 1.12.4
5615
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
381 **/
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
382
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
383 Json::Value json;
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
384 if (OrthancRestApi::GetContext(call).ExpandResource(
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
385 json, call.GetUriComponent("id", ""), resourceType, format, requestedTags, true /* allowStorageAccess */))
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
386 {
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
387 call.GetOutput().AnswerJson(json);
a10978a5e65c expansion of single resources using ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5609
diff changeset
388 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
389 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
391
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
392 template <enum ResourceType resourceType>
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
393 static void DeleteSingleResource(RestApiDeleteCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
395 if (call.IsDocumentation())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
396 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
397 const std::string resource = GetResourceTypeText(resourceType, false /* plural */, false /* lower case */);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
398 call.GetDocumentation()
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
399 .SetTag(GetResourceTypeText(resourceType, true /* plural */, true /* upper case */))
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
400 .SetSummary("Delete some " + resource)
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
401 .SetDescription("Delete the DICOM " + resource + " whose Orthanc identifier is provided in the URL")
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
402 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest");
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
403 return;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
404 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
405
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
406 Json::Value remainingAncestor;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
407 if (OrthancRestApi::GetContext(call).DeleteResource(remainingAncestor, call.GetUriComponent("id", ""), resourceType))
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
408 {
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
409 call.GetOutput().AnswerJson(remainingAncestor);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
410 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
411 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
414 // Get information about a single patient -----------------------------------
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
415
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
416 static void IsProtectedPatient(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
418 if (call.IsDocumentation())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
419 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
420 call.GetDocumentation()
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
421 .SetTag("Patients")
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
422 .SetSummary("Is the patient protected against recycling?")
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
423 .SetUriArgument("id", "Orthanc identifier of the patient of interest")
4403
ad646ff506d0 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4401
diff changeset
424 .AddAnswerType(MimeType_PlainText, "`1` if protected, `0` if not protected");
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
425 return;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
426 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
427
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 bool isProtected = OrthancRestApi::GetIndex(call).IsProtectedPatient(publicId);
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
430 call.GetOutput().AnswerBuffer(isProtected ? "1" : "0", MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
434 static void SetPatientProtection(RestApiPutCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
436 if (call.IsDocumentation())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
437 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
438 call.GetDocumentation()
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
439 .SetTag("Patients")
5467
68e9f7815fb8 Clarified recycle/reject + protection
Alain Mazy <am@osimis.io>
parents: 5446
diff changeset
440 .SetSummary("Protect/Unprotect a patient against recycling")
68e9f7815fb8 Clarified recycle/reject + protection
Alain Mazy <am@osimis.io>
parents: 5446
diff changeset
441 .SetDescription("Protects a patient by sending `1` or `true` in the payload request. "
68e9f7815fb8 Clarified recycle/reject + protection
Alain Mazy <am@osimis.io>
parents: 5446
diff changeset
442 "Unprotects a patient by sending `0` or `false` in the payload requests. "
68e9f7815fb8 Clarified recycle/reject + protection
Alain Mazy <am@osimis.io>
parents: 5446
diff changeset
443 "More info: https://orthanc.uclouvain.be/book/faq/features.html#recycling-protection")
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
444 .SetUriArgument("id", "Orthanc identifier of the patient of interest");
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
445 return;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
446 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4330
diff changeset
447
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
451
4473
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
452 context.GetIndex().SetProtectedPatient(publicId, call.ParseBooleanBody());
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
453 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
455
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
456
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
457 // Get information about a single instance ----------------------------------
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
458
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
459 static void GetInstanceFile(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
460 {
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
461 static const char* const TRANSCODE = "transcode";
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
462
4405
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
463 if (call.IsDocumentation())
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
464 {
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
465 call.GetDocumentation()
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
466 .SetTag("Instances")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
467 .SetSummary("Download DICOM")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
468 .SetDescription("Download one DICOM instance")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
469 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
470 .SetHttpHeader("Accept", "This HTTP header can be set to retrieve the DICOM instance in DICOMweb format")
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
471 .SetHttpGetArgument(TRANSCODE, RestApiCallDocumentation::Type_String,
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
472 "If present, the DICOM file will be transcoded to the provided "
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
473 "transfer syntax: https://orthanc.uclouvain.be/book/faq/transcoding.html", false)
4405
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
474 .AddAnswerType(MimeType_Dicom, "The DICOM instance")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
475 .AddAnswerType(MimeType_DicomWebJson, "The DICOM instance, in DICOMweb JSON format")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
476 .AddAnswerType(MimeType_DicomWebXml, "The DICOM instance, in DICOMweb XML format");
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
477 return;
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
478 }
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
479
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
480 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 std::string publicId = call.GetUriComponent("id", "");
3203
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
483
4330
a01b1c9cbef4 moving generic type definitions from IHttpHandler to HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4294
diff changeset
484 HttpToolbox::Arguments::const_iterator accept = call.GetHttpHeaders().find("accept");
3203
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
485 if (accept != call.GetHttpHeaders().end())
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
486 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
487 // New in Orthanc 1.5.4
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
488 try
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
489 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
490 MimeType mime = StringToMimeType(accept->second.c_str());
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
491
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
492 if (mime == MimeType_DicomWebJson ||
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
493 mime == MimeType_DicomWebXml)
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
494 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
495 DicomWebJsonVisitor visitor;
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
496
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
497 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
498 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), publicId);
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
499 locker.GetDicom().Apply(visitor);
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
500 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
501
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
502 if (mime == MimeType_DicomWebJson)
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
503 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
504 std::string s = visitor.GetResult().toStyledString();
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
505 call.GetOutput().AnswerBuffer(s, MimeType_DicomWebJson);
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
506 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
507 else
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
508 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
509 std::string xml;
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
510 visitor.FormatXml(xml);
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
511 call.GetOutput().AnswerBuffer(xml, MimeType_DicomWebXml);
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
512 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
513
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
514 return;
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
515 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
516 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
517 catch (OrthancException&)
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
518 {
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
519 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
520 }
810772486249 URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3187
diff changeset
521
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
522 if (call.HasArgument(TRANSCODE))
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
523 {
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
524 std::string source;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
525 std::string attachmentId;
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
526 std::string transcoded;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
527 context.ReadDicom(source, attachmentId, publicId);
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
528
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
529 if (context.TranscodeWithCache(transcoded, source, publicId, attachmentId, GetTransferSyntax(call.GetArgument(TRANSCODE, ""))))
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
530 {
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
531 call.GetOutput().AnswerBuffer(transcoded, MimeType_Dicom);
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
532 }
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
533 }
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
534 else
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
535 {
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
536 // return the attachment without any transcoding
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
537 context.AnswerAttachment(call.GetOutput(), publicId, FileContentType_Dicom);
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5424
diff changeset
538 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
539 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
542 static void ExportInstanceFile(RestApiPostCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 {
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
544 if (call.IsDocumentation())
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
545 {
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
546 call.GetDocumentation()
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
547 .SetTag("Instances")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
548 .SetSummary("Write DICOM onto filesystem")
5200
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
549 .SetDescription("Write the DICOM file onto the filesystem where Orthanc is running. This is insecure for "
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
550 "Orthanc servers that are remotely accessible since one could overwrite any system file. "
5275
8686476e9d12 fix inclusion of winsock.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5274
diff changeset
551 "Since Orthanc 1.12.0, this route is disabled by default, but can be enabled using "
8686476e9d12 fix inclusion of winsock.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5274
diff changeset
552 "the `RestApiWriteToFileSystemEnabled` configuration option.")
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
553 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
554 .AddRequestType(MimeType_PlainText, "Target path on the filesystem");
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
555 return;
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
556 }
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
557
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559
5200
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
560 if (!context.IsRestApiWriteToFileSystemEnabled())
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
561 {
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
562 LOG(ERROR) << "The URI /instances/../export is disallowed for security, "
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
563 << "check your configuration option `RestApiWriteToFileSystemEnabled`";
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
564 call.GetOutput().SignalError(HttpStatus_403_Forbidden);
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
565 return;
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
566 }
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
567
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 std::string dicom;
2124
2b1520efa282 cleaning up
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2122
diff changeset
571 context.ReadDicom(dicom, publicId);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572
1446
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
573 std::string target;
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
574 call.BodyToString(target);
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2136
diff changeset
575 SystemToolbox::WriteFile(dicom, target);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
577 call.GetOutput().AnswerBuffer("{}", MimeType_Json);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
578 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
581 template <DicomToJsonFormat format>
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
582 static void GetInstanceTagsInternal(RestApiGetCall& call,
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
583 bool whole)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 std::string publicId = call.GetUriComponent("id", "");
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
588
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
589 std::set<DicomTag> ignoreTagLength;
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
590 ParseSetOfTags(ignoreTagLength, call, IGNORE_LENGTH);
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
591
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
592 if (whole)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 {
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
594 // This is new in Orthanc 1.12.4. Reference:
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
595 // https://discourse.orthanc-server.org/t/private-tags-with-group-7fe0-are-not-provided-via-rest-api/4744
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
596 const DicomToJsonFlags flags = static_cast<DicomToJsonFlags>(DicomToJsonFlags_Default & ~DicomToJsonFlags_StopAfterPixelData);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
597
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
598 Json::Value answer;
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
599
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
600 {
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
601 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), publicId);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
602 locker.GetDicom().DatasetToJson(answer, format, flags,
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
603 ORTHANC_MAXIMUM_TAG_LENGTH, ignoreTagLength);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
604 }
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
605
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
606 call.GetOutput().AnswerJson(answer);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
608 else
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
609 {
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
610 if (format != DicomToJsonFormat_Full ||
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
611 !ignoreTagLength.empty())
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
612 {
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
613 Json::Value full;
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
614 context.ReadDicomAsJson(full, publicId, ignoreTagLength);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
615 AnswerDicomAsJson(call, full, format);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
616 }
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
617 else
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
618 {
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
619 // This path allows one to avoid the JSON decoding if no
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
620 // simplification is asked, and if no "ignore-length" argument
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
621 // is present
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
622 Json::Value full;
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
623 context.ReadDicomAsJson(full, publicId);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
624 call.GetOutput().AnswerJson(full);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
625 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
628
964
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
629
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
630 static void DocumentGetInstanceTags(RestApiGetCall& call)
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
631 {
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
632 call.GetDocumentation()
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
633 .SetTag("Instances")
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
634 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
635 .SetHttpGetArgument(
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
636 IGNORE_LENGTH, RestApiCallDocumentation::Type_JsonListOfStrings,
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
637 "Also include the DICOM tags that are provided in this list, even if their associated value is long", false)
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
638 .SetHttpGetArgument(
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
639 ARG_WHOLE, RestApiCallDocumentation::Type_Boolean, "Whether to read the whole DICOM file from the "
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
640 "storage area (new in Orthanc 1.12.4). If set to \"false\" (default value), the DICOM file is read "
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
641 "until the pixel data tag (7fe0,0010) to optimize access to storage. Setting the option "
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
642 "to \"true\" provides access to the DICOM tags stored after the pixel data tag.", false)
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
643 .AddAnswerType(MimeType_Json, "JSON object containing the DICOM tags and their associated value");
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
644 }
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
645
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
646
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
647 static void GetInstanceTags(RestApiGetCall& call)
964
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
648 {
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
649 if (call.IsDocumentation())
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
650 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
651 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Full);
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
652 DocumentGetInstanceTags(call);
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
653 call.GetDocumentation()
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
654 .SetSummary("Get DICOM tags")
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
655 .SetDescription("Get the DICOM tags in the specified format. By default, the `full` format is used, which "
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
656 "combines hexadecimal tags with human-readable description.")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
657 .SetTruncatedJsonHttpGetSample("https://orthanc.uclouvain.be/demo/instances/7c92ce8e-bbf67ed2-ffa3b8c1-a3b35d94-7ff3ae26/tags", 10);
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
658 return;
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
659 }
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
660
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
661 const bool whole = call.GetBooleanArgument(ARG_WHOLE, false);
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
662
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
663 switch (OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Full))
964
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
664 {
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
665 case DicomToJsonFormat_Human:
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
666 GetInstanceTagsInternal<DicomToJsonFormat_Human>(call, whole);
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
667 break;
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
668
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
669 case DicomToJsonFormat_Short:
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
670 GetInstanceTagsInternal<DicomToJsonFormat_Short>(call, whole);
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
671 break;
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
672
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
673 case DicomToJsonFormat_Full:
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
674 GetInstanceTagsInternal<DicomToJsonFormat_Full>(call, whole);
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
675 break;
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
676
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
677 default:
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
678 throw OrthancException(ErrorCode_InternalError);
964
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
679 }
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
680 }
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
681
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
682
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
683 static void GetInstanceSimplifiedTags(RestApiGetCall& call)
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
684 {
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
685 if (call.IsDocumentation())
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
686 {
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
687 DocumentGetInstanceTags(call);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
688 call.GetDocumentation()
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
689 .SetSummary("Get human-readable tags")
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
690 .SetDescription("Get the DICOM tags in human-readable format (same as the `/instances/{id}/tags?simplify` route)")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
691 .SetTruncatedJsonHttpGetSample("https://orthanc.uclouvain.be/demo/instances/7c92ce8e-bbf67ed2-ffa3b8c1-a3b35d94-7ff3ae26/simplified-tags", 10);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
692 return;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
693 }
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
694 else
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
695 {
5647
f048683aa619 added "?whole" option to "/instances/{id}/tags" to access tags stored after pixel data
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5640
diff changeset
696 GetInstanceTagsInternal<DicomToJsonFormat_Human>(call, call.GetBooleanArgument(ARG_WHOLE, false));
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
697 }
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
698 }
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
699
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
700
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
701 static void ListFrames(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
702 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
703 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
704 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
705 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
706 .SetTag("Instances")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
707 .SetSummary("List available frames")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
708 .SetDescription("List the frames that are available in the DICOM instance of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
709 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
710 .AddAnswerType(MimeType_Json, "The list of the indices of the available frames")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
711 .SetHttpGetSample("https://orthanc.uclouvain.be/demo/instances/7c92ce8e-bbf67ed2-ffa3b8c1-a3b35d94-7ff3ae26/frames", true);
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
712 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
713 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
714
1950
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
715 std::string publicId = call.GetUriComponent("id", "");
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
716
1950
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
717 unsigned int numberOfFrames;
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
718
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
719 {
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
720 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), publicId);
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
721 numberOfFrames = locker.GetDicom().GetFramesCount();
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 }
1950
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
723
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
724 Json::Value result = Json::arrayValue;
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
725 for (unsigned int i = 0; i < numberOfFrames; i++)
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
726 {
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
727 result.append(i);
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
728 }
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
729
533ff46e944b return a single raw frame from DICOM videos
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1929
diff changeset
730 call.GetOutput().AnswerJson(result);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
731 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
734 namespace
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
735 {
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
736 class ImageToEncode
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
737 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
738 private:
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
739 std::unique_ptr<ImageAccessor>& image_;
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
740 ImageExtractionMode mode_;
2281
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
741 bool invert_;
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
742 MimeType format_;
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
743 std::string answer_;
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
744
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
745 public:
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
746 ImageToEncode(std::unique_ptr<ImageAccessor>& image,
2281
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
747 ImageExtractionMode mode,
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
748 bool invert) :
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
749 image_(image),
2281
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
750 mode_(mode),
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
751 invert_(invert),
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
752 format_(MimeType_Binary)
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
753 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
754 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
755
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
756 void Answer(RestApiOutput& output)
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
757 {
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
758 output.AnswerBuffer(answer_, format_);
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
759 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
760
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
761 void EncodeUsingPng()
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
762 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
763 format_ = MimeType_Png;
2281
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
764 DicomImageDecoder::ExtractPngImage(answer_, image_, mode_, invert_);
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
765 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
766
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
767 void EncodeUsingPam()
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
768 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
769 format_ = MimeType_Pam;
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
770 DicomImageDecoder::ExtractPamImage(answer_, image_, mode_, invert_);
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
771 }
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
772
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
773 void EncodeUsingJpeg(uint8_t quality)
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
774 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
775 format_ = MimeType_Jpeg;
2281
e002430baa41 Fix issue #44 (Bad interpretation of photometric interpretation MONOCHROME1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
776 DicomImageDecoder::ExtractJpegImage(answer_, image_, mode_, invert_, quality);
1824
b530c3dfe2a6 refactoring image decoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1784
diff changeset
777 }
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
778 };
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
779
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
780 class EncodePng : public HttpContentNegociation::IHandler
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
781 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
782 private:
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
783 ImageToEncode& image_;
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
785 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
786 explicit EncodePng(ImageToEncode& image) : image_(image)
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
787 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
788 }
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
789
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
790 virtual void Handle(const std::string& type,
5338
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
791 const std::string& subtype,
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
792 const HttpContentNegociation::Dictionary& parameters) ORTHANC_OVERRIDE
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
793 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
794 assert(type == "image");
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
795 assert(subtype == "png");
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
796 image_.EncodeUsingPng();
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
797 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
798 };
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
799
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
800 class EncodePam : public HttpContentNegociation::IHandler
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
801 {
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
802 private:
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
803 ImageToEncode& image_;
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
804
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
805 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
806 explicit EncodePam(ImageToEncode& image) : image_(image)
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
807 {
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
808 }
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
809
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
810 virtual void Handle(const std::string& type,
5338
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
811 const std::string& subtype,
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
812 const HttpContentNegociation::Dictionary& parameters) ORTHANC_OVERRIDE
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
813 {
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
814 assert(type == "image");
2780
am@osimis.io
parents: 2726
diff changeset
815 assert(subtype == "x-portable-arbitrarymap");
2699
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
816 image_.EncodeUsingPam();
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
817 }
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
818 };
52217dc47a4e new image/pam MIME TYPE supported in /instances/../frames/../image-uint8... routes
am@osimis.io
parents: 2622
diff changeset
819
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
820 class EncodeJpeg : public HttpContentNegociation::IHandler
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
821 {
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
822 private:
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
823 ImageToEncode& image_;
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
824 unsigned int quality_;
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
825
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
826 public:
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
827 EncodeJpeg(ImageToEncode& image,
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
828 const RestApiGetCall& call) :
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
829 image_(image)
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
830 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
831 std::string v = call.GetArgument("quality", "90" /* default JPEG quality */);
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
832 bool ok = false;
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
833
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
834 try
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
835 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
836 quality_ = boost::lexical_cast<unsigned int>(v);
1847
559956d5ceb2 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1831
diff changeset
837 ok = (quality_ >= 1 && quality_ <= 100);
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
838 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
839 catch (boost::bad_lexical_cast&)
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
840 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
841 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
842
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
843 if (!ok)
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
844 {
2955
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
845 throw OrthancException(
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
846 ErrorCode_BadRequest,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
847 "Bad quality for a JPEG encoding (must be a number between 0 and 100): " + v);
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
848 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
849 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
850
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
851 virtual void Handle(const std::string& type,
5338
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
852 const std::string& subtype,
78c59b02b121 accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5275
diff changeset
853 const HttpContentNegociation::Dictionary& parameters) ORTHANC_OVERRIDE
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
854 {
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
855 assert(type == "image");
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
856 assert(subtype == "jpeg");
1902
8b0ee8d5e6d0 Refactoring leading to speedups with custom image decoders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1900
diff changeset
857 image_.EncodeUsingJpeg(quality_);
1784
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
858 }
2dbf25006f88 ".../preview" and ".../image-uint8" can return JPEG images if the HTTP Accept Header asks so
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1781
diff changeset
859 };
1781
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
860 }
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
861
5ad4e4d92ecb AcceptMediaDispatcher bootstrap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1773
diff changeset
862
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
863 namespace
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
864 {
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
865 class IDecodedFrameHandler : public boost::noncopyable
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
866 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
867 public:
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
868 virtual ~IDecodedFrameHandler()
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
869 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
870 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
871
4769
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
872 // "dicom" is non-NULL iff. "RequiresDicomTags() == true"
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
873 virtual void Handle(RestApiGetCall& call,
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
874 std::unique_ptr<ImageAccessor>& decoded,
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
875 const ParsedDicomFile* dicom,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
876 unsigned int frame) = 0;
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
877
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
878 virtual bool RequiresDicomTags() const = 0;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
879
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
880 static void Apply(RestApiGetCall& call,
4406
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
881 IDecodedFrameHandler& handler,
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
882 ImageExtractionMode mode /* for generation of documentation */,
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
883 bool isRendered /* for generation of documentation */)
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
884 {
4406
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
885 if (call.IsDocumentation())
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
886 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
887 std::string m;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
888 if (!isRendered)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
889 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
890 switch (mode)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
891 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
892 case ImageExtractionMode_Preview:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
893 m = "preview";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
894 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
895 case ImageExtractionMode_UInt8:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
896 m = "uint8";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
897 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
898 case ImageExtractionMode_UInt16:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
899 m = "uint16";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
900 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
901 case ImageExtractionMode_Int16:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
902 m = "int16";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
903 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
904 default:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
905 throw OrthancException(ErrorCode_ParameterOutOfRange);
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
906 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
907 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
908
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
909 std::string description;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
910 std::string verb = (isRendered ? "Render" : "Decode");
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
911
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
912 if (call.HasUriComponent("frame"))
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
913 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
914 description = verb + " one frame of interest from the given DICOM instance.";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
915 call.GetDocumentation()
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
916 .SetSummary(verb + " a frame" + (m.empty() ? "" : " (" + m + ")"))
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
917 .SetUriArgument("frame", RestApiCallDocumentation::Type_Number, "Index of the frame (starts at `0`)");
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
918 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
919 else
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
920 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
921 description = verb + " the first frame of the given DICOM instance.";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
922 call.GetDocumentation()
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
923 .SetSummary(verb + " an image" + (m.empty() ? "" : " (" + m + ")"));
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
924 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
925
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
926 if (isRendered)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
927 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
928 description += (" This function takes scaling into account (`RescaleSlope` and `RescaleIntercept` tags), "
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
929 "as well as the default windowing stored in the DICOM file (`WindowCenter` and `WindowWidth`tags), "
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
930 "and can be used to resize the resulting image. Color images are not affected by windowing.");
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
931 call.GetDocumentation()
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
932 .SetHttpGetArgument("window-center",RestApiCallDocumentation::Type_Number, "Windowing center", false)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
933 .SetHttpGetArgument("window-width",RestApiCallDocumentation::Type_Number, "Windowing width", false)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
934 .SetHttpGetArgument("width",RestApiCallDocumentation::Type_Number, "Width of the resized image", false)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
935 .SetHttpGetArgument("height",RestApiCallDocumentation::Type_Number, "Height of the resized image", false)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
936 .SetHttpGetArgument("smooth",RestApiCallDocumentation::Type_Boolean, "Whether to smooth image on resize", false);
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
937 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
938 else
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
939 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
940 switch (mode)
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
941 {
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
942 case ImageExtractionMode_Preview:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
943 description += " The full dynamic range of grayscale images is rescaled to the [0,255] range.";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
944 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
945 case ImageExtractionMode_UInt8:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
946 description += " Pixels of grayscale images are truncated to the [0,255] range.";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
947 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
948 case ImageExtractionMode_UInt16:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
949 description += " Pixels of grayscale images are truncated to the [0,65535] range.";
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
950 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
951 case ImageExtractionMode_Int16:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
952 description += (" Pixels of grayscale images are truncated to the [-32768,32767] range. "
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
953 "Negative values must be interpreted according to two's complement.");
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
954 break;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
955 default:
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
956 throw OrthancException(ErrorCode_ParameterOutOfRange);
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
957 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
958 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
959
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
960 call.GetDocumentation()
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
961 .SetTag("Instances")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
962 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
963 .SetHttpGetArgument("quality", RestApiCallDocumentation::Type_Number, "Quality for JPEG images (between 1 and 100, defaults to 90)", false)
4804
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
964 .SetHttpGetArgument("returnUnsupportedImage", RestApiCallDocumentation::Type_Boolean, "Returns an unsupported.png placeholder image if unable to provide the image instead of returning a 415 HTTP error (defaults to false)", false)
4406
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
965 .SetHttpHeader("Accept", "Format of the resulting image. Can be `image/png` (default), `image/jpeg` or `image/x-portable-arbitrarymap`")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
966 .AddAnswerType(MimeType_Png, "PNG image")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
967 .AddAnswerType(MimeType_Jpeg, "JPEG image")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
968 .AddAnswerType(MimeType_Pam, "PAM image (Portable Arbitrary Map)")
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
969 .SetDescription(description);
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
970
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
971 return;
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
972 }
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
973
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
974 ServerContext& context = OrthancRestApi::GetContext(call);
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
975
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
976 std::string frameId = call.GetUriComponent("frame", "0");
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
977
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
978 unsigned int frame;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
979 try
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
980 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
981 frame = boost::lexical_cast<unsigned int>(frameId);
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
982 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
983 catch (boost::bad_lexical_cast&)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
984 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
985 return;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
986 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
987
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
988 std::unique_ptr<ImageAccessor> decoded;
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
989
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
990 try
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
991 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
992 std::string publicId = call.GetUriComponent("id", "");
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
993
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
994 decoded.reset(context.DecodeDicomFrame(publicId, frame));
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
995
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
996 if (decoded.get() == NULL)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
997 {
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
998 throw OrthancException(ErrorCode_NotImplemented,
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
999 "Cannot decode DICOM instance with ID: " + publicId);
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1000 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1001
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1002 if (handler.RequiresDicomTags())
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1003 {
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1004 /**
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1005 * Retrieve a summary of the DICOM tags, which is
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1006 * necessary to deal with MONOCHROME1 photometric
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1007 * interpretation, and with windowing parameters.
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1008 **/
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1009 ServerContext::DicomCacheLocker locker(context, publicId);
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1010 handler.Handle(call, decoded, &locker.GetDicom(), frame);
4769
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1011 }
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1012 else
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1013 {
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1014 handler.Handle(call, decoded, NULL, frame);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1015 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1016 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1017 catch (OrthancException& e)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1018 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1019 if (e.GetErrorCode() == ErrorCode_ParameterOutOfRange ||
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1020 e.GetErrorCode() == ErrorCode_UnknownResource)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1021 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1022 // The frame number is out of the range for this DICOM
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1023 // instance, the resource is not existent
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1024 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1025 else
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1026 {
4804
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1027 if (call.HasArgument("returnUnsupportedImage"))
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1028 {
4804
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1029 std::string root = "";
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1030 for (size_t i = 1; i < call.GetFullUri().size(); i++)
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1031 {
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1032 root += "../";
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1033 }
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1034
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1035 call.GetOutput().Redirect(root + "app/images/unsupported.png");
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1036 }
4804
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1037 else
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1038 {
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1039 call.GetOutput().SignalError(HttpStatus_415_UnsupportedMediaType);
ae643f664628 new option returnUnsupportedImage for /preview & /rendered routes
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
1040 }
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1041 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1042 return;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1043 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1044
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1045 }
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1046
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1047
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1048 static void DefaultHandler(RestApiGetCall& call,
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1049 std::unique_ptr<ImageAccessor>& decoded,
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1050 ImageExtractionMode mode,
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1051 bool invert)
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1052 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1053 ImageToEncode image(decoded, mode, invert);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1054
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1055 HttpContentNegociation negociation;
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1056 EncodePng png(image);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1057 negociation.Register(MIME_PNG, png);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1058
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1059 EncodeJpeg jpeg(image, call);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1060 negociation.Register(MIME_JPEG, jpeg);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1061
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1062 EncodePam pam(image);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1063 negociation.Register(MIME_PAM, pam);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1064
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1065 if (negociation.Apply(call.GetHttpHeaders()))
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1066 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1067 image.Answer(call.GetOutput());
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1068 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1069 }
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1070 };
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1071
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1072
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1073 class GetImageHandler : public IDecodedFrameHandler
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1074 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1075 private:
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1076 ImageExtractionMode mode_;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1077
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1078 public:
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
1079 explicit GetImageHandler(ImageExtractionMode mode) :
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1080 mode_(mode)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1081 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1082 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1083
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1084 virtual void Handle(RestApiGetCall& call,
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1085 std::unique_ptr<ImageAccessor>& decoded,
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1086 const ParsedDicomFile* dicom,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1087 unsigned int frame) ORTHANC_OVERRIDE
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1088 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1089 bool invert = false;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1090
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1091 if (mode_ == ImageExtractionMode_Preview)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1092 {
4769
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1093 if (dicom == NULL)
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1094 {
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1095 throw OrthancException(ErrorCode_InternalError);
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1096 }
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1097
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1098 DicomMap tags;
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1099 OrthancConfiguration::DefaultExtractDicomSummary(tags, *dicom);
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1100
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1101 DicomImageInformation info(tags);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1102 invert = (info.GetPhotometricInterpretation() == PhotometricInterpretation_Monochrome1);
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1103 }
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1104
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1105 DefaultHandler(call, decoded, mode_, invert);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1106 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1107
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1108 virtual bool RequiresDicomTags() const ORTHANC_OVERRIDE
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1109 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1110 return mode_ == ImageExtractionMode_Preview;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1111 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1112 };
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1113
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1114
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1115 class RenderedFrameHandler : public IDecodedFrameHandler
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1116 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1117 private:
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1118 static void GetUserArguments(double& windowWidth /* inout */,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1119 double& windowCenter /* inout */,
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1120 unsigned int& argWidth,
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1121 unsigned int& argHeight,
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1122 bool& smooth,
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
1123 const RestApiGetCall& call)
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1124 {
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1125 static const char* ARG_WINDOW_CENTER = "window-center";
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1126 static const char* ARG_WINDOW_WIDTH = "window-width";
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1127 static const char* ARG_WIDTH = "width";
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1128 static const char* ARG_HEIGHT = "height";
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1129 static const char* ARG_SMOOTH = "smooth";
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1130
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1131 if (call.HasArgument(ARG_WINDOW_WIDTH) &&
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1132 !SerializationToolbox::ParseDouble(windowWidth, call.GetArgument(ARG_WINDOW_WIDTH, "")))
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1133 {
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1134 throw OrthancException(ErrorCode_ParameterOutOfRange,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1135 "Bad value for argument: " + std::string(ARG_WINDOW_WIDTH));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1136 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1137
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1138 if (call.HasArgument(ARG_WINDOW_CENTER) &&
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1139 !SerializationToolbox::ParseDouble(windowCenter, call.GetArgument(ARG_WINDOW_CENTER, "")))
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1140 {
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1141 throw OrthancException(ErrorCode_ParameterOutOfRange,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1142 "Bad value for argument: " + std::string(ARG_WINDOW_CENTER));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1143 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1144
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1145 argWidth = 0;
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1146 argHeight = 0;
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1147
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1148 if (call.HasArgument(ARG_WIDTH))
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1149 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1150 try
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1151 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1152 int tmp = boost::lexical_cast<int>(call.GetArgument(ARG_WIDTH, ""));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1153 if (tmp < 0)
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1154 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1155 throw OrthancException(ErrorCode_ParameterOutOfRange,
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1156 "Argument cannot be negative: " + std::string(ARG_WIDTH));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1157 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1158 else
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1159 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1160 argWidth = static_cast<unsigned int>(tmp);
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1161 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1162 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1163 catch (boost::bad_lexical_cast&)
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1164 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1165 throw OrthancException(ErrorCode_ParameterOutOfRange,
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1166 "Bad value for argument: " + std::string(ARG_WIDTH));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1167 }
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1168 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1169
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1170 if (call.HasArgument(ARG_HEIGHT))
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1171 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1172 try
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1173 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1174 int tmp = boost::lexical_cast<int>(call.GetArgument(ARG_HEIGHT, ""));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1175 if (tmp < 0)
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1176 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1177 throw OrthancException(ErrorCode_ParameterOutOfRange,
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1178 "Argument cannot be negative: " + std::string(ARG_HEIGHT));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1179 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1180 else
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1181 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1182 argHeight = static_cast<unsigned int>(tmp);
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1183 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1184 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1185 catch (boost::bad_lexical_cast&)
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1186 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1187 throw OrthancException(ErrorCode_ParameterOutOfRange,
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1188 "Bad value for argument: " + std::string(ARG_HEIGHT));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1189 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1190 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1191
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1192 smooth = false;
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1193
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1194 if (call.HasArgument(ARG_SMOOTH))
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1195 {
4473
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
1196 smooth = RestApiCall::ParseBoolean(call.GetArgument(ARG_SMOOTH, ""));
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1197 }
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1198 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1199
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1200
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1201 public:
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1202 virtual void Handle(RestApiGetCall& call,
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1203 std::unique_ptr<ImageAccessor>& decoded,
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1204 const ParsedDicomFile* dicom,
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1205 unsigned int frame) ORTHANC_OVERRIDE
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1206 {
4769
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1207 if (dicom == NULL)
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1208 {
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1209 throw OrthancException(ErrorCode_InternalError);
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1210 }
9da6ca57a977 IDecodedFrameHandler can access full ParsedDicomFile instead of the DicomMap summary
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4722
diff changeset
1211
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1212 PhotometricInterpretation photometric;
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1213 const bool invert = (dicom->LookupPhotometricInterpretation(photometric) &&
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1214 photometric == PhotometricInterpretation_Monochrome1);
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1215
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1216 double rescaleIntercept, rescaleSlope, windowCenter, windowWidth;
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1217 dicom->GetRescale(rescaleIntercept, rescaleSlope, frame);
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1218 dicom->GetDefaultWindowing(windowCenter, windowWidth, frame);
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1219
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1220 unsigned int argWidth, argHeight;
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1221 bool smooth;
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1222 GetUserArguments(windowWidth, windowCenter, argWidth, argHeight, smooth, call);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1223
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1224 unsigned int targetWidth = decoded->GetWidth();
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1225 unsigned int targetHeight = decoded->GetHeight();
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1226
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1227 if (decoded->GetWidth() != 0 &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1228 decoded->GetHeight() != 0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1229 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1230 float ratio = 1;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1231
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1232 if (argWidth != 0 &&
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1233 argHeight != 0)
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1234 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1235 float ratioX = static_cast<float>(argWidth) / static_cast<float>(decoded->GetWidth());
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1236 float ratioY = static_cast<float>(argHeight) / static_cast<float>(decoded->GetHeight());
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1237 ratio = std::min(ratioX, ratioY);
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1238 }
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1239 else if (argWidth != 0)
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1240 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1241 ratio = static_cast<float>(argWidth) / static_cast<float>(decoded->GetWidth());
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1242 }
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1243 else if (argHeight != 0)
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1244 {
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1245 ratio = static_cast<float>(argHeight) / static_cast<float>(decoded->GetHeight());
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1246 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1247
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1248 targetWidth = boost::math::iround(ratio * static_cast<float>(decoded->GetWidth()));
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1249 targetHeight = boost::math::iround(ratio * static_cast<float>(decoded->GetHeight()));
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1250 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1251
5054
255b02c68908 Added support for RGBA64 images in tools/create-dicom and /preview (Contribution from James Manners - Pliny)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
1252 if (decoded->GetFormat() == PixelFormat_RGB24 || decoded->GetFormat() == PixelFormat_RGB48)
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1253 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1254 if (targetWidth == decoded->GetWidth() &&
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1255 targetHeight == decoded->GetHeight())
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1256 {
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1257 DefaultHandler(call, decoded, ImageExtractionMode_Preview, false);
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1258 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1259 else
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1260 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1261 std::unique_ptr<ImageAccessor> resized(
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1262 new Image(decoded->GetFormat(), targetWidth, targetHeight, false));
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1263
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1264 if (smooth &&
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1265 (targetWidth < decoded->GetWidth() ||
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1266 targetHeight < decoded->GetHeight()))
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1267 {
4065
d6362b2c4b61 export dcmdata in shared library, rounding in convolution tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4055
diff changeset
1268 ImageProcessing::SmoothGaussian5x5(*decoded, false /* be fast, don't round */);
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1269 }
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1270
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1271 ImageProcessing::Resize(*resized, *decoded);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1272 DefaultHandler(call, resized, ImageExtractionMode_Preview, false);
3685
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1273 }
2cc34837d694 rendering of RGB24
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3683
diff changeset
1274 }
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1275 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1276 {
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1277 // Grayscale image: (1) convert to Float32, (2) apply
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1278 // windowing to get a Grayscale8, (3) possibly resize
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1279
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1280 Image converted(PixelFormat_Float32, decoded->GetWidth(), decoded->GetHeight(), false);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1281 ImageProcessing::Convert(converted, *decoded);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1282
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1283 // Avoid divisions by zero
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1284 if (windowWidth <= 1.0f)
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1285 {
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1286 windowWidth = 1;
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1287 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1288
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1289 if (std::abs(rescaleSlope) <= 0.0001)
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1290 {
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1291 rescaleSlope = 0.0001;
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1292 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1293
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1294 const double scaling = 255.0 * rescaleSlope / windowWidth;
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1295 const double offset = (rescaleIntercept - windowCenter + windowWidth / 2.0) / rescaleSlope;
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1296
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1297 std::unique_ptr<ImageAccessor> rescaled(new Image(PixelFormat_Grayscale8, decoded->GetWidth(), decoded->GetHeight(), false));
4777
3b78ba359db3 Support detection of windowing and rescale in Philips multiframe images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4769
diff changeset
1298 ImageProcessing::ShiftScale(*rescaled, converted, static_cast<float>(offset), static_cast<float>(scaling), false);
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1299
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1300 if (targetWidth == decoded->GetWidth() &&
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1301 targetHeight == decoded->GetHeight())
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1302 {
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1303 DefaultHandler(call, rescaled, ImageExtractionMode_UInt8, invert);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1304 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1305 else
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1306 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3690
diff changeset
1307 std::unique_ptr<ImageAccessor> resized(
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1308 new Image(PixelFormat_Grayscale8, targetWidth, targetHeight, false));
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1309
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1310 if (smooth &&
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1311 (targetWidth < decoded->GetWidth() ||
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1312 targetHeight < decoded->GetHeight()))
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1313 {
4065
d6362b2c4b61 export dcmdata in shared library, rounding in convolution tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4055
diff changeset
1314 ImageProcessing::SmoothGaussian5x5(*rescaled, false /* be fast, don't round */);
3690
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1315 }
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1316
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1317 ImageProcessing::Resize(*resized, *rescaled);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1318 DefaultHandler(call, resized, ImageExtractionMode_UInt8, invert);
a9ce35d67c3c implementation of "/instances/.../rendered" for grayscale images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3687
diff changeset
1319 }
3686
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3685
diff changeset
1320 }
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1321 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1322
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1323 virtual bool RequiresDicomTags() const ORTHANC_OVERRIDE
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1324 {
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1325 return true;
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1326 }
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1327 };
3600
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1328 }
4066998150ef /instances/{id}/preview route now takes the windowing into account
Alain Mazy <alain@mazy.be>
parents: 3203
diff changeset
1329
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1330
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1331 template <enum ImageExtractionMode mode>
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
1332 static void GetImage(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1333 {
3926
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1334 Semaphore::Locker locker(throttlingSemaphore_);
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1335
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1336 GetImageHandler handler(mode);
4406
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
1337 IDecodedFrameHandler::Apply(call, handler, mode, false /* not rendered */);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1338 }
1906
d7c1cb559431 optimization for multi-frame images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1902
diff changeset
1339
1826
ac5b0b4e2434 refactoring of DicomImageDecoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1824
diff changeset
1340
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1341 static void GetRenderedFrame(RestApiGetCall& call)
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1342 {
3926
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1343 Semaphore::Locker locker(throttlingSemaphore_);
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1344
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1345 RenderedFrameHandler handler;
4406
4cb9f66a1c7c documenting generation of images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4405
diff changeset
1346 IDecodedFrameHandler::Apply(call, handler, ImageExtractionMode_Preview /* arbitrary value */, true);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1347 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1348
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1349
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1350 static void DocumentSharedNumpy(RestApiGetCall& call)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1351 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1352 call.GetDocumentation()
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1353 .SetUriArgument("id", "Orthanc identifier of the DICOM resource of interest")
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1354 .SetHttpGetArgument("compress", RestApiCallDocumentation::Type_Boolean, "Compress the file as `.npz`", false)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1355 .SetHttpGetArgument("rescale", RestApiCallDocumentation::Type_Boolean,
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1356 "On grayscale images, apply the rescaling and return floating-point values", false)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1357 .AddAnswerType(MimeType_PlainText, "Numpy file: https://numpy.org/devdocs/reference/generated/numpy.lib.format.html");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1358 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1359
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1360
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1361 namespace
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1362 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1363 class NumpyVisitor : public boost::noncopyable
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1364 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1365 private:
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1366 bool rescale_;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1367 unsigned int depth_;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1368 unsigned int currentDepth_;
4858
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1369 unsigned int width_;
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1370 unsigned int height_;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1371 PixelFormat format_;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1372 ChunkedBuffer buffer_;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1373
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1374 public:
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1375 NumpyVisitor(unsigned int depth /* can be zero if 2D frame */,
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1376 bool rescale) :
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1377 rescale_(rescale),
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1378 depth_(depth),
4858
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1379 currentDepth_(0),
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1380 width_(0), // dummy initialization
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1381 height_(0), // dummy initialization
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1382 format_(PixelFormat_Grayscale8) // dummy initialization
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1383 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1384 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1385
4858
8b51d65584f0 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4853
diff changeset
1386 void WriteFrame(const ParsedDicomFile& dicom,
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1387 unsigned int frame)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1388 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1389 std::unique_ptr<ImageAccessor> decoded(dicom.DecodeFrame(frame));
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1390
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1391 if (decoded.get() == NULL)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1392 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1393 throw OrthancException(ErrorCode_NotImplemented, "Cannot decode DICOM instance");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1394 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1395
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1396 if (currentDepth_ == 0)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1397 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1398 width_ = decoded->GetWidth();
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1399 height_ = decoded->GetHeight();
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1400 format_ = decoded->GetFormat();
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1401 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1402 else if (width_ != decoded->GetWidth() ||
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1403 height_ != decoded->GetHeight())
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1404 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1405 throw OrthancException(ErrorCode_IncompatibleImageSize, "The size of the frames varies across the instance(s)");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1406 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1407 else if (format_ != decoded->GetFormat())
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1408 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1409 throw OrthancException(ErrorCode_IncompatibleImageFormat, "The pixel format of the frames varies across the instance(s)");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1410 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1411
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1412 if (rescale_ &&
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1413 decoded->GetFormat() != PixelFormat_RGB24)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1414 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1415 if (currentDepth_ == 0)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1416 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1417 NumpyWriter::WriteHeader(buffer_, depth_, width_, height_, PixelFormat_Float32);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1418 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1419
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1420 double rescaleIntercept, rescaleSlope;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1421 dicom.GetRescale(rescaleIntercept, rescaleSlope, frame);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1422
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1423 Image converted(PixelFormat_Float32, decoded->GetWidth(), decoded->GetHeight(), false);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1424 ImageProcessing::Convert(converted, *decoded);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1425 ImageProcessing::ShiftScale2(converted, static_cast<float>(rescaleIntercept), static_cast<float>(rescaleSlope), false);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1426
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1427 NumpyWriter::WritePixels(buffer_, converted);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1428 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1429 else
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1430 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1431 if (currentDepth_ == 0)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1432 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1433 NumpyWriter::WriteHeader(buffer_, depth_, width_, height_, format_);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1434 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1435
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1436 NumpyWriter::WritePixels(buffer_, *decoded);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1437 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1438
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1439 currentDepth_ ++;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1440 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1441
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1442 void Answer(RestApiOutput& output,
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1443 bool compress)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1444 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1445 if ((depth_ == 0 && currentDepth_ != 1) ||
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1446 (depth_ != 0 && currentDepth_ != depth_))
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1447 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1448 throw OrthancException(ErrorCode_BadSequenceOfCalls);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1449 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1450 else
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1451 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1452 std::string answer;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1453 NumpyWriter::Finalize(answer, buffer_, compress);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1454 output.AnswerBuffer(answer, MimeType_Binary);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1455 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1456 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1457 };
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1458 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1459
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1460
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1461 static void GetNumpyFrame(RestApiGetCall& call)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1462 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1463 if (call.IsDocumentation())
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1464 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1465 DocumentSharedNumpy(call);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1466 call.GetDocumentation()
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1467 .SetTag("Instances")
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1468 .SetSummary("Decode frame for numpy")
4836
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1469 .SetDescription("Decode one frame of interest from the given DICOM instance, for use with numpy in Python. "
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1470 "The numpy array has 3 dimensions: (height, width, color channel).")
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1471 .SetUriArgument("frame", RestApiCallDocumentation::Type_Number, "Index of the frame (starts at `0`)");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1472 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1473 else
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1474 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1475 const std::string instanceId = call.GetUriComponent("id", "");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1476 const bool compress = call.GetBooleanArgument("compress", false);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1477 const bool rescale = call.GetBooleanArgument("rescale", true);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1478
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1479 uint32_t frame;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1480 if (!SerializationToolbox::ParseUnsignedInteger32(frame, call.GetUriComponent("frame", "0")))
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1481 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1482 throw OrthancException(ErrorCode_ParameterOutOfRange, "Expected an unsigned integer for the \"frame\" argument");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1483 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1484
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1485 NumpyVisitor visitor(0 /* no depth, 2D frame */, rescale);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1486
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1487 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1488 Semaphore::Locker throttling(throttlingSemaphore_);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1489 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), instanceId);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1490
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1491 visitor.WriteFrame(locker.GetDicom(), frame);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1492 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1493
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1494 visitor.Answer(call.GetOutput(), compress);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1495 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1496 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1497
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1498
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1499 static void GetNumpyInstance(RestApiGetCall& call)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1500 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1501 if (call.IsDocumentation())
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1502 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1503 DocumentSharedNumpy(call);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1504 call.GetDocumentation()
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1505 .SetTag("Instances")
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1506 .SetSummary("Decode instance for numpy")
4836
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1507 .SetDescription("Decode the given DICOM instance, for use with numpy in Python. "
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1508 "The numpy array has 4 dimensions: (frame, height, width, color channel).");
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1509 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1510 else
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1511 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1512 const std::string instanceId = call.GetUriComponent("id", "");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1513 const bool compress = call.GetBooleanArgument("compress", false);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1514 const bool rescale = call.GetBooleanArgument("rescale", true);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1515
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1516 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1517 Semaphore::Locker throttling(throttlingSemaphore_);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1518 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), instanceId);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1519
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1520 const unsigned int depth = locker.GetDicom().GetFramesCount();
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1521 if (depth == 0)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1522 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1523 throw OrthancException(ErrorCode_BadFileFormat, "Empty DICOM instance");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1524 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1525
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1526 NumpyVisitor visitor(depth, rescale);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1527
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1528 for (unsigned int frame = 0; frame < depth; frame++)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1529 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1530 visitor.WriteFrame(locker.GetDicom(), frame);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1531 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1532
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1533 visitor.Answer(call.GetOutput(), compress);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1534 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1535 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1536 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1537
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1538
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1539 static void GetNumpySeries(RestApiGetCall& call)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1540 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1541 if (call.IsDocumentation())
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1542 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1543 DocumentSharedNumpy(call);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1544 call.GetDocumentation()
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1545 .SetTag("Series")
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1546 .SetSummary("Decode series for numpy")
4836
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1547 .SetDescription("Decode the given DICOM series, for use with numpy in Python. "
ec1e9571b645 document number of dimensions in numpy arrays
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4834
diff changeset
1548 "The numpy array has 4 dimensions: (frame, height, width, color channel).");
4834
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1549 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1550 else
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1551 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1552 const std::string seriesId = call.GetUriComponent("id", "");
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1553 const bool compress = call.GetBooleanArgument("compress", false);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1554 const bool rescale = call.GetBooleanArgument("rescale", true);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1555
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1556 Semaphore::Locker throttling(throttlingSemaphore_);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1557
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1558 ServerIndex& index = OrthancRestApi::GetIndex(call);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1559 SliceOrdering ordering(index, seriesId);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1560
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1561 unsigned int depth = 0;
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1562 for (size_t i = 0; i < ordering.GetInstancesCount(); i++)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1563 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1564 depth += ordering.GetFramesCount(i);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1565 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1566
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1567 ServerContext& context = OrthancRestApi::GetContext(call);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1568
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1569 NumpyVisitor visitor(depth, rescale);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1570
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1571 for (size_t i = 0; i < ordering.GetInstancesCount(); i++)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1572 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1573 const std::string& instanceId = ordering.GetInstanceId(i);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1574 unsigned int framesCount = ordering.GetFramesCount(i);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1575
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1576 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1577 ServerContext::DicomCacheLocker locker(context, instanceId);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1578
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1579 for (unsigned int frame = 0; frame < framesCount; frame++)
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1580 {
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1581 visitor.WriteFrame(locker.GetDicom(), frame);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1582 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1583 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1584 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1585
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1586 visitor.Answer(call.GetOutput(), compress);
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1587 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1588 }
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1589
bec432ee1094 download of numpy arrays from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
1590
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
1591 static void GetMatlabImage(RestApiGetCall& call)
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1592 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1593 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1594 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1595 std::string description;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1596
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1597 if (call.HasUriComponent("frame"))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1598 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1599 description = "Decode one frame of interest from the given DICOM instance";
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1600 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1601 .SetUriArgument("frame", RestApiCallDocumentation::Type_Number, "Index of the frame (starts at `0`)");
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1602 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1603 else
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1604 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1605 description = "Decode the first frame of the given DICOM instance.";
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1606 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1607
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1608 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1609 .SetTag("Instances")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1610 .SetSummary("Decode frame for Matlab")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1611 .SetDescription(description + ", and export this frame as a Octave/Matlab matrix to be imported with `eval()`: "
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
1612 "https://orthanc.uclouvain.be/book/faq/matlab.html")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1613 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1614 .AddAnswerType(MimeType_PlainText, "Octave/Matlab matrix");
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1615 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1616 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1617
3926
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1618 Semaphore::Locker locker(throttlingSemaphore_);
2910b0d30fe0 Allow concurrent calls to the custom image decoders provided by the plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3816
diff changeset
1619
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1620 ServerContext& context = OrthancRestApi::GetContext(call);
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1621
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1622 std::string frameId = call.GetUriComponent("frame", "0");
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1623
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1624 unsigned int frame;
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1625 try
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1626 {
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1627 frame = boost::lexical_cast<unsigned int>(frameId);
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1628 }
2836
7133ad478eea fix Debian warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2804
diff changeset
1629 catch (boost::bad_lexical_cast&)
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1630 {
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1631 return;
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1632 }
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1633
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1634 std::string publicId = call.GetUriComponent("id", "");
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1635 std::unique_ptr<ImageAccessor> decoded(context.DecodeDicomFrame(publicId, frame));
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1636
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1637 if (decoded.get() == NULL)
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1638 {
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1639 throw OrthancException(ErrorCode_NotImplemented,
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1640 "Cannot decode DICOM instance with ID: " + publicId);
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1641 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1642 else
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1643 {
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1644 std::string result;
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1645 decoded->ToMatlabString(result);
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1646 call.GetOutput().AnswerBuffer(result, MimeType_PlainText);
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3926
diff changeset
1647 }
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1648 }
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1649
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
1650
2408
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1651 template <bool GzipCompression>
1924
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1652 static void GetRawFrame(RestApiGetCall& call)
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1653 {
4408
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1654 if (call.IsDocumentation())
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1655 {
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1656 call.GetDocumentation()
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1657 .SetTag("Instances")
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1658 .SetSummary("Access raw frame" + std::string(GzipCompression ? " (compressed)" : ""))
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1659 .SetDescription("Access the raw content of one individual frame of the DICOM instance of interest, "
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1660 "bypassing image decoding. This is notably useful to access the source files "
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1661 "in compressed transfer syntaxes." +
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1662 std::string(GzipCompression ? " The image is compressed using gzip" : ""))
4424
83371ccdfe80 openapi documentation is now completed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4422
diff changeset
1663 .SetUriArgument("id", "Orthanc identifier of the instance of interest")
4408
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1664 .SetUriArgument("frame", RestApiCallDocumentation::Type_Number, "Index of the frame (starts at `0`)");
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1665
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1666 if (GzipCompression)
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1667 {
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1668 call.GetDocumentation().AddAnswerType(MimeType_Gzip, "The raw frame, compressed using gzip");
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1669 }
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1670 else
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1671 {
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1672 call.GetDocumentation().AddAnswerType(MimeType_Binary, "The raw frame");
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1673 }
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1674 return;
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1675 }
d2bfadc2948b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4407
diff changeset
1676
1924
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1677 std::string frameId = call.GetUriComponent("frame", "0");
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1678
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1679 unsigned int frame;
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1680 try
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1681 {
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1682 frame = boost::lexical_cast<unsigned int>(frameId);
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1683 }
2836
7133ad478eea fix Debian warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2804
diff changeset
1684 catch (boost::bad_lexical_cast&)
1924
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1685 {
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1686 return;
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1687 }
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1688
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1689 std::string publicId = call.GetUriComponent("id", "");
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
1690 std::string raw;
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
1691 MimeType mime;
1924
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1692
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1693 {
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1694 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), publicId);
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1695 locker.GetDicom().GetRawFrame(raw, mime, frame);
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1696 }
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1697
2408
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1698 if (GzipCompression)
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1699 {
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1700 GzipCompressor gzip;
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1701 std::string compressed;
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1702 gzip.Compress(compressed, raw.empty() ? NULL : raw.c_str(), raw.size());
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
1703 call.GetOutput().AnswerBuffer(compressed, MimeType_Gzip);
2408
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1704 }
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1705 else
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1706 {
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1707 call.GetOutput().AnswerBuffer(raw, mime);
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1708 }
1924
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1709 }
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1710
6c73df12ca51 New URI: "/instances/.../frames/.../raw" to access the raw frames (bypass image decoding)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1906
diff changeset
1711
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
1712 static void GetResourceStatistics(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1713 {
4418
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1714 if (call.IsDocumentation())
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1715 {
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1716 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1717 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1718 call.GetDocumentation()
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1719 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1720 .SetSummary("Get " + r + " statistics")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1721 .SetDescription("Get statistics about the given " + r)
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1722 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1723 .SetAnswerField("DiskSize", RestApiCallDocumentation::Type_String,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1724 "Size of the " + r + " on the disk in bytes, expressed as a string for 64bit compatibility with JSON")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1725 .SetAnswerField("DiskSizeMB", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1726 "Size of the " + r + " on the disk, expressed in megabytes (MB)")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1727 .SetAnswerField("UncompressedSize", RestApiCallDocumentation::Type_String,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1728 "Size of the " + r + " after decompression in bytes, expressed as a string for 64bit compatibility with JSON")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1729 .SetAnswerField("UncompressedSizeMB", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1730 "Size of the " + r + " after decompression, expressed in megabytes (MB). "
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1731 "This is different from `DiskSizeMB` iff `StorageCompression` is `true`.")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1732 .SetAnswerField("DicomDiskSize", RestApiCallDocumentation::Type_String,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1733 "Size on the disk of the DICOM instances associated with the " + r + ", expressed in bytes")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1734 .SetAnswerField("DicomDiskSizeMB", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1735 "Size on the disk of the DICOM instances associated with the " + r + ", expressed in megabytes (MB)")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1736 .SetAnswerField("DicomUncompressedSize", RestApiCallDocumentation::Type_String,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1737 "Size on the disk of the uncompressed DICOM instances associated with the " + r + ", expressed in bytes")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1738 .SetAnswerField("DicomUncompressedSizeMB", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1739 "Size on the disk of the uncompressed DICOM instances associated with the " + r + ", expressed in megabytes (MB)")
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1740 .SetHttpGetSample(GetDocumentationSampleResource(t) + "/statistics", true);
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1741
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1742 switch (t)
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1743 {
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1744 // Do NOT add "break" below this point!
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1745 case ResourceType_Patient:
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1746 call.GetDocumentation().SetAnswerField("CountStudies", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1747 "Number of child studies within this " + r);
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1748
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1749 case ResourceType_Study:
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1750 call.GetDocumentation().SetAnswerField("CountSeries", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1751 "Number of child series within this " + r);
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1752
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1753 case ResourceType_Series:
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1754 call.GetDocumentation().SetAnswerField("CountInstances", RestApiCallDocumentation::Type_Number,
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1755 "Number of child instances within this " + r);
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1756
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1757 case ResourceType_Instance:
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1758 default:
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1759 break;
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1760 }
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1761
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1762 return;
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1763 }
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
1764
3174
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1765 static const uint64_t MEGA_BYTES = 1024 * 1024;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1766
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1767 std::string publicId = call.GetUriComponent("id", "");
3174
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1768
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1769 ResourceType type;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1770 uint64_t diskSize, uncompressedSize, dicomDiskSize, dicomUncompressedSize;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1771 unsigned int countStudies, countSeries, countInstances;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1772 OrthancRestApi::GetIndex(call).GetResourceStatistics(
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1773 type, diskSize, uncompressedSize, countStudies, countSeries,
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1774 countInstances, dicomDiskSize, dicomUncompressedSize, publicId);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1775
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1776 Json::Value result = Json::objectValue;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1777 result["DiskSize"] = boost::lexical_cast<std::string>(diskSize);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1778 result["DiskSizeMB"] = static_cast<unsigned int>(diskSize / MEGA_BYTES);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1779 result["UncompressedSize"] = boost::lexical_cast<std::string>(uncompressedSize);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1780 result["UncompressedSizeMB"] = static_cast<unsigned int>(uncompressedSize / MEGA_BYTES);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1781
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1782 result["DicomDiskSize"] = boost::lexical_cast<std::string>(dicomDiskSize);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1783 result["DicomDiskSizeMB"] = static_cast<unsigned int>(dicomDiskSize / MEGA_BYTES);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1784 result["DicomUncompressedSize"] = boost::lexical_cast<std::string>(dicomUncompressedSize);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1785 result["DicomUncompressedSizeMB"] = static_cast<unsigned int>(dicomUncompressedSize / MEGA_BYTES);
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1786
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1787 switch (type)
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1788 {
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1789 // Do NOT add "break" below this point!
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1790 case ResourceType_Patient:
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1791 result["CountStudies"] = countStudies;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1792
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1793 case ResourceType_Study:
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1794 result["CountSeries"] = countSeries;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1795
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1796 case ResourceType_Series:
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1797 result["CountInstances"] = countInstances;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1798
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1799 case ResourceType_Instance:
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1800 default:
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1801 break;
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1802 }
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3163
diff changeset
1803
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1804 call.GetOutput().AnswerJson(result);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1805 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1806
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1807
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1808
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1809 // Handling of metadata -----------------------------------------------------
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1810
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
1811 static void CheckValidResourceType(const RestApiCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1812 {
4460
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1813 assert(!call.GetFullUri().empty());
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
1814 const std::string resourceType = call.GetFullUri() [0];
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1815 StringToResourceType(resourceType.c_str());
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1816 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1817
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1818
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
1819 static void ListMetadata(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1820 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1821 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1822 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1823 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1824 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1825 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1826 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1827 .SetSummary("List metadata")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1828 .SetDescription("Get the list of metadata that are associated with the given " + r)
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1829 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1830 .SetHttpGetArgument("expand", RestApiCallDocumentation::Type_String,
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1831 "If present, also retrieve the value of the individual metadata", false)
5274
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1832 .SetHttpGetArgument("numeric", RestApiCallDocumentation::Type_String,
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1833 "If present, use the numeric identifier of the metadata instead of its symbolic name", false)
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1834 .AddAnswerType(MimeType_Json, "JSON array containing the names of the available metadata, "
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1835 "or JSON associative array mapping metadata to their values (if `expand` argument is provided)")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1836 .SetHttpGetSample(GetDocumentationSampleResource(t) + "/metadata", true);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1837 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1838 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1839
4460
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1840 assert(!call.GetFullUri().empty());
4554
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
1841 const std::string publicId = call.GetUriComponent("id", "");
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
1842 ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
4551
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1843
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1844 typedef std::map<MetadataType, std::string> Metadata;
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1845
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1846 Metadata metadata;
4554
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
1847 OrthancRestApi::GetIndex(call).GetAllMetadata(metadata, publicId, level);
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1848
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1849 Json::Value result;
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1850
5274
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1851 bool isNumeric = call.HasArgument("numeric");
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1852
5405
62bb63346185 All 'expand' GET arguments now accepts expand=true and expand=false values + /studies/../instances now supports expand=false
Alain Mazy <am@osimis.io>
parents: 5393
diff changeset
1853 if (call.HasArgument("expand") && call.GetBooleanArgument("expand", true))
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1854 {
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1855 result = Json::objectValue;
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1856
4551
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1857 for (Metadata::const_iterator it = metadata.begin(); it != metadata.end(); ++it)
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1858 {
5274
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1859 std::string key;
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1860 if (isNumeric)
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1861 {
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1862 key = boost::lexical_cast<std::string>(it->first);
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1863 }
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1864 else
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1865 {
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1866 key = EnumerationToString(it->first);
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1867 }
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1868
3187
4bbadcd03966 refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3174
diff changeset
1869 result[key] = it->second;
5274
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1870 }
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1871 }
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1872 else
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1873 {
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1874 result = Json::arrayValue;
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1875
4551
350a22c094f2 testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1876 for (Metadata::const_iterator it = metadata.begin(); it != metadata.end(); ++it)
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1877 {
5274
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1878 if (isNumeric)
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1879 {
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1880 result.append(it->first);
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1881 }
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1882 else
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1883 {
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1884 result.append(EnumerationToString(it->first));
e5b0bd6b2242 Added option "?numeric" if listing metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5248
diff changeset
1885 }
2726
46061a91c88a new metadata (RemoteIP, CalledAET, HttpUsername), "?expand" metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2704
diff changeset
1886 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1887 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1888
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1889 call.GetOutput().AnswerJson(result);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1890 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1891
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1892
4657
e8967149d87a cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4640
diff changeset
1893 static void SetStringContentETag(const RestApiOutput& output,
e8967149d87a cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4640
diff changeset
1894 int64_t revision,
e8967149d87a cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4640
diff changeset
1895 const std::string& value)
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1896 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1897 std::string md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1898 Toolbox::ComputeMD5(md5, value);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1899 const std::string etag = "\"" + boost::lexical_cast<std::string>(revision) + "-" + md5 + "\"";
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1900 output.GetLowLevelOutput().AddHeader("ETag", etag);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1901 }
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1902
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1903
4657
e8967149d87a cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4640
diff changeset
1904 static void SetBufferContentETag(const RestApiOutput& output,
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1905 int64_t revision,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1906 const void* data,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1907 size_t size)
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1908 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1909 std::string md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1910 Toolbox::ComputeMD5(md5, data, size);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1911 const std::string etag = "\"" + boost::lexical_cast<std::string>(revision) + "-" + md5 + "\"";
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1912 output.GetLowLevelOutput().AddHeader("ETag", etag);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1913 }
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1914
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1915
4657
e8967149d87a cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4640
diff changeset
1916 static void SetAttachmentETag(const RestApiOutput& output,
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1917 int64_t revision,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1918 const FileInfo& info)
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1919 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1920 const std::string etag = ("\"" + boost::lexical_cast<std::string>(revision) + "-" +
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1921 info.GetUncompressedMD5() + "\"");
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1922 output.GetLowLevelOutput().AddHeader("ETag", etag);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1923 }
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1924
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1925
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1926 static std::string GetMD5(const std::string& value)
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1927 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1928 std::string md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1929 Toolbox::ComputeMD5(md5, value);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1930 return md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1931 }
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1932
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1933
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1934 static bool GetRevisionHeader(int64_t& revision /* out */,
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1935 std::string& md5 /* out */,
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1936 const RestApiCall& call,
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1937 const std::string& header)
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1938 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1939 std::string lower;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1940 Toolbox::ToLowerCase(lower, header);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1941
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1942 HttpToolbox::Arguments::const_iterator found = call.GetHttpHeaders().find(lower);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1943 if (found == call.GetHttpHeaders().end())
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1944 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1945 return false;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1946 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1947 else
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1948 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1949 std::string value = Toolbox::StripSpaces(found->second);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1950 Toolbox::RemoveSurroundingQuotes(value);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1951
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1952 try
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1953 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1954 size_t comma = value.find('-');
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1955 if (comma != std::string::npos)
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1956 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1957 revision = boost::lexical_cast<int64_t>(value.substr(0, comma));
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1958 md5 = value.substr(comma + 1);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1959 return true;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1960 }
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1961 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1962 catch (boost::bad_lexical_cast&)
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1963 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1964 }
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1965
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1966 throw OrthancException(ErrorCode_ParameterOutOfRange, "The \"" + header +
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
1967 "\" HTTP header should contain the ETag (revision followed by MD5 hash), but found: " + value);
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1968 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1969 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1970
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1971
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
1972 static void GetMetadata(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1973 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1974 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1975 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1976 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1977 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1978 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1979 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1980 .SetSummary("Get metadata")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1981 .SetDescription("Get the value of a metadata that is associated with the given " + r)
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1982 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1983 .SetUriArgument("name", "The name of the metadata, or its index (cf. `UserMetadata` configuration option)")
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1984 .AddAnswerType(MimeType_PlainText, "Value of the metadata")
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1985 .SetAnswerHeader("ETag", "Revision of the metadata, to be used in further `PUT` or `DELETE` operations")
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1986 .SetHttpHeader("If-None-Match", "Optional revision of the metadata, to check if its content has changed");
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1987 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1988 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
1989
4460
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1990 assert(!call.GetFullUri().empty());
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1991 const std::string publicId = call.GetUriComponent("id", "");
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1992 const ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1993
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1994 std::string name = call.GetUriComponent("name", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1995 MetadataType metadata = StringToMetadata(name);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1996
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1997 std::string value;
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1998 int64_t revision;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
1999 if (OrthancRestApi::GetIndex(call).LookupMetadata(value, revision, publicId, level, metadata))
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2000 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2001 SetStringContentETag(call.GetOutput(), revision, value); // New in Orthanc 1.9.2
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2002
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2003 int64_t userRevision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2004 std::string userMD5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2005 if (GetRevisionHeader(userRevision, userMD5, call, "If-None-Match") &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2006 userRevision == revision &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2007 userMD5 == GetMD5(value))
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2008 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2009 call.GetOutput().GetLowLevelOutput().SendStatus(HttpStatus_304_NotModified);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2010 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2011 else
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2012 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2013 call.GetOutput().AnswerBuffer(value, MimeType_PlainText);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2014 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2015 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2016 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2017
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2018
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2019 static void DeleteMetadata(RestApiDeleteCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2020 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2021 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2022 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2023 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2024 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2025 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2026 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2027 .SetSummary("Delete metadata")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2028 .SetDescription("Delete some metadata associated with the given DICOM " + r +
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2029 ". This call will fail if trying to delete a system metadata (i.e. whose index is < 1024).")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2030 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2031 .SetUriArgument("name", "The name of the metadata, or its index (cf. `UserMetadata` configuration option)")
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2032 .SetHttpHeader("If-Match", "Revision of the metadata, to check if its content has not changed and can "
4661
b1d87d41874e typo: replaced "CheckRevision" by "CheckRevisions"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4657
diff changeset
2033 "be deleted. This header is mandatory if `CheckRevisions` option is `true`.");
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2034 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2035 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2036
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2037 CheckValidResourceType(call);
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2038 const std::string publicId = call.GetUriComponent("id", "");
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2039
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2040 std::string name = call.GetUriComponent("name", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2041 MetadataType metadata = StringToMetadata(name);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2042
5446
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2043 if (IsUserMetadata(metadata) || // It is forbidden to delete internal metadata...
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2044 call.GetRequestOrigin() == RequestOrigin_Plugins) // ...except for plugins
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2045 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2046 bool found;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2047 int64_t revision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2048 std::string md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2049 if (GetRevisionHeader(revision, md5, call, "if-match"))
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2050 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2051 found = OrthancRestApi::GetIndex(call).DeleteMetadata(publicId, metadata, true, revision, md5);
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2052 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2053 else
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2054 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2055 OrthancConfiguration::ReaderLock lock;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2056 if (lock.GetConfiguration().GetBooleanParameter(CHECK_REVISIONS, false))
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2057 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2058 throw OrthancException(ErrorCode_Revision,
4661
b1d87d41874e typo: replaced "CheckRevision" by "CheckRevisions"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4657
diff changeset
2059 "HTTP header \"If-Match\" is missing, as \"CheckRevisions\" is \"true\"");
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2060 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2061 else
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2062 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2063 found = OrthancRestApi::GetIndex(call).DeleteMetadata(publicId, metadata, false, -1 /* dummy value */, "");
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2064 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2065 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2066
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2067 if (found)
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2068 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2069 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2070 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2071 else
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2072 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2073 throw OrthancException(ErrorCode_UnknownResource);
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2074 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2075 }
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2076 else
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2077 {
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2078 call.GetOutput().SignalError(HttpStatus_403_Forbidden);
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2079 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2080 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2081
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2082
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2083 static void SetMetadata(RestApiPutCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2084 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2085 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2086 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2087 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2088 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2089 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2090 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2091 .SetSummary("Set metadata")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2092 .SetDescription("Set the value of some metadata in the given DICOM " + r +
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2093 ". This call will fail if trying to modify a system metadata (i.e. whose index is < 1024).")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2094 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2095 .SetUriArgument("name", "The name of the metadata, or its index (cf. `UserMetadata` configuration option)")
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2096 .AddRequestType(MimeType_PlainText, "String value of the metadata")
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2097 .SetHttpHeader("If-Match", "Revision of the metadata, if this is not the first time this metadata is set.");
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2098 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2099 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2100
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2101 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2102
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2103 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2104 std::string name = call.GetUriComponent("name", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2105 MetadataType metadata = StringToMetadata(name);
1446
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2106
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2107 std::string value;
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
2108 call.BodyToString(value);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2109
5446
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2110 if (IsUserMetadata(metadata) || // It is forbidden to modify internal metadata...
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2111 call.GetRequestOrigin() == RequestOrigin_Plugins) // ...except for plugins
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2112 {
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2113 int64_t oldRevision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2114 std::string oldMD5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2115 bool hasOldRevision = GetRevisionHeader(oldRevision, oldMD5, call, "if-match");
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2116
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2117 if (!hasOldRevision)
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2118 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2119 OrthancConfiguration::ReaderLock lock;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2120 if (lock.GetConfiguration().GetBooleanParameter(CHECK_REVISIONS, false))
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2121 {
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2122 // "StatelessDatabaseOperations::SetMetadata()" will ignore
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2123 // the actual value of "oldRevision" if the metadata is
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2124 // inexistent as expected
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2125 hasOldRevision = true;
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2126 oldRevision = -1; // dummy value
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2127 oldMD5.clear(); // dummy value
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2128 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2129 }
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2130
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4589
diff changeset
2131 int64_t newRevision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2132 OrthancRestApi::GetIndex(call).SetMetadata(newRevision, publicId, metadata, value,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2133 hasOldRevision, oldRevision, oldMD5);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2134
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2135 SetStringContentETag(call.GetOutput(), newRevision, value); // New in Orthanc 1.9.2
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2136 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2137 }
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2138 else
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2139 {
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2140 call.GetOutput().SignalError(HttpStatus_403_Forbidden);
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2141 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2142 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2143
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2144
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2145
5221
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2146 // Handling of labels -------------------------------------------------------
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2147
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2148 static void ListLabels(RestApiGetCall& call)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2149 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2150 if (call.IsDocumentation())
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2151 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2152 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2153 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2154 call.GetDocumentation()
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2155 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
5275
8686476e9d12 fix inclusion of winsock.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5274
diff changeset
2156 .SetSummary("List labels")
8686476e9d12 fix inclusion of winsock.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5274
diff changeset
2157 .SetDescription("Get the labels that are associated with the given " + r + " (new in Orthanc 1.12.0)")
5221
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2158 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2159 .AddAnswerType(MimeType_Json, "JSON array containing the names of the labels")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2160 .SetHttpGetSample(GetDocumentationSampleResource(t) + "/labels", true);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2161 return;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2162 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2163
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2164 assert(!call.GetFullUri().empty());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2165 const std::string publicId = call.GetUriComponent("id", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2166 ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2167
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2168 std::set<std::string> labels;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2169 OrthancRestApi::GetIndex(call).ListLabels(labels, publicId, level);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2170
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2171 Json::Value result = Json::arrayValue;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2172
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2173 for (std::set<std::string>::const_iterator it = labels.begin(); it != labels.end(); ++it)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2174 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2175 result.append(*it);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2176 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2177
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2178 call.GetOutput().AnswerJson(result);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2179 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2180
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2181
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2182 static void GetLabel(RestApiGetCall& call)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2183 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2184 if (call.IsDocumentation())
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2185 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2186 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2187 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2188 call.GetDocumentation()
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2189 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2190 .SetSummary("Test label")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2191 .SetDescription("Test whether the " + r + " is associated with the given label")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2192 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2193 .SetUriArgument("label", "The label of interest")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2194 .AddAnswerType(MimeType_PlainText, "Empty string is returned in the case of presence, error 404 in the case of absence");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2195 return;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2196 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2197
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2198 CheckValidResourceType(call);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2199
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2200 assert(!call.GetFullUri().empty());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2201 const std::string publicId = call.GetUriComponent("id", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2202 const ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2203
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2204 std::string label = call.GetUriComponent("label", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2205
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2206 std::set<std::string> labels;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2207 OrthancRestApi::GetIndex(call).ListLabels(labels, publicId, level);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2208
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2209 if (labels.find(label) != labels.end())
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2210 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2211 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2212 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2213 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2214
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2215
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2216 static void AddLabel(RestApiPutCall& call)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2217 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2218 if (call.IsDocumentation())
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2219 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2220 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2221 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2222 call.GetDocumentation()
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2223 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2224 .SetSummary("Add label")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2225 .SetDescription("Associate a label with a " + r)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2226 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2227 .SetUriArgument("label", "The label to be added");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2228 return;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2229 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2230
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2231 CheckValidResourceType(call);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2232
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2233 std::string publicId = call.GetUriComponent("id", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2234 const ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2235
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2236 std::string label = call.GetUriComponent("label", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2237 OrthancRestApi::GetIndex(call).ModifyLabel(publicId, level, label, StatelessDatabaseOperations::LabelOperation_Add);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2238
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2239 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2240 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2241
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2242
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2243 static void RemoveLabel(RestApiDeleteCall& call)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2244 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2245 if (call.IsDocumentation())
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2246 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2247 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2248 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2249 call.GetDocumentation()
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2250 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2251 .SetSummary("Remove label")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2252 .SetDescription("Remove a label associated with a " + r)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2253 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2254 .SetUriArgument("label", "The label to be removed");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2255 return;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2256 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2257
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2258 CheckValidResourceType(call);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2259
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2260 std::string publicId = call.GetUriComponent("id", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2261 const ResourceType level = StringToResourceType(call.GetFullUri() [0].c_str());
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2262
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2263 std::string label = call.GetUriComponent("label", "");
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2264 OrthancRestApi::GetIndex(call).ModifyLabel(publicId, level, label, StatelessDatabaseOperations::LabelOperation_Remove);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2265
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2266 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2267 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
2268
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2269
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2270 // Handling of attached files -----------------------------------------------
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2271
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2272 static void ListAttachments(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2273 {
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2274 if (call.IsDocumentation())
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2275 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2276 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2277 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2278 call.GetDocumentation()
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2279 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2280 .SetSummary("List attachments")
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2281 .SetDescription("Get the list of attachments that are associated with the given " + r)
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2282 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4853
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2283 .SetHttpGetArgument("full", RestApiCallDocumentation::Type_String,
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2284 "If present, retrieve the attachments list and their numerical ids", false)
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2285 .AddAnswerType(MimeType_Json, "JSON array containing the names of the attachments")
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2286 .SetHttpGetSample(GetDocumentationSampleResource(t) + "/attachments", true);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2287 return;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2288 }
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2289
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2290 const std::string resourceType = call.GetFullUri() [0];
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2291 const std::string publicId = call.GetUriComponent("id", "");
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
2292 std::set<FileContentType> attachments;
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2293 OrthancRestApi::GetIndex(call).ListAvailableAttachments(attachments, publicId, StringToResourceType(resourceType.c_str()));
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2294
4853
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2295 Json::Value result;
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2296
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2297 if (call.HasArgument("full"))
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2298 {
4853
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2299 result = Json::objectValue;
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2300
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2301 for (std::set<FileContentType>::const_iterator
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2302 it = attachments.begin(); it != attachments.end(); ++it)
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2303 {
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2304 std::string key = EnumerationToString(*it);
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2305 result[key] = static_cast<uint16_t>(*it);
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2306 }
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2307 }
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2308 else
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2309 {
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2310 result = Json::arrayValue;
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2311
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2312 for (std::set<FileContentType>::const_iterator
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2313 it = attachments.begin(); it != attachments.end(); ++it)
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2314 {
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2315 result.append(EnumerationToString(*it));
b3d0a3a4d890 Added links to download attachments from the Orthanc Explorer
Alain Mazy <am@osimis.io>
parents: 4836
diff changeset
2316 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2317 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2318
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2319 call.GetOutput().AnswerJson(result);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2320 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2321
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2322
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2323 static void AddAttachmentDocumentation(RestApiGetCall& call,
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2324 const std::string& resourceType)
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2325 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2326 call.GetDocumentation()
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2327 .SetUriArgument("id", "Orthanc identifier of the " + resourceType + " of interest")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2328 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2329 .SetAnswerHeader("ETag", "Revision of the attachment, to be used in further `PUT` or `DELETE` operations")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2330 .SetHttpHeader("If-None-Match", "Optional revision of the attachment, to check if its content has changed");
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2331 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2332
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2333
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2334 static bool GetAttachmentInfo(FileInfo& info,
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2335 RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2336 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2337 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2338
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2339 const std::string publicId = call.GetUriComponent("id", "");
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2340 const std::string name = call.GetUriComponent("name", "");
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2341 FileContentType contentType = StringToContentType(name);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2342
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2343 int64_t revision;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2344 if (OrthancRestApi::GetIndex(call).LookupAttachment(info, revision, publicId, contentType))
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2345 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2346 SetAttachmentETag(call.GetOutput(), revision, info); // New in Orthanc 1.9.2
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2347
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2348 int64_t userRevision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2349 std::string userMD5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2350 if (GetRevisionHeader(userRevision, userMD5, call, "If-None-Match") &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2351 revision == userRevision &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2352 info.GetUncompressedMD5() == userMD5)
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2353 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2354 call.GetOutput().GetLowLevelOutput().SendStatus(HttpStatus_304_NotModified);
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2355 return false;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2356 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2357 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2358 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2359 return true;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2360 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2361 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2362 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2363 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2364 throw OrthancException(ErrorCode_UnknownResource);
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2365 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2366 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2367
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2368
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2369 static void GetAttachmentOperations(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2370 {
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2371 if (call.IsDocumentation())
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2372 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2373 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2374 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2375 AddAttachmentDocumentation(call, r);
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2376 call.GetDocumentation()
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2377 .SetTag("Other")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2378 .SetSummary("List operations on attachments")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2379 .SetDescription("Get the list of the operations that are available for attachments associated with the given " + r)
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2380 .AddAnswerType(MimeType_Json, "List of the available operations")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
2381 .SetHttpGetSample("https://orthanc.uclouvain.be/demo/instances/6582b1c0-292ad5ab-ba0f088f-f7a1766f-9a29a54f/attachments/dicom", true);
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2382 return;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2383 }
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2384
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2385 FileInfo info;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2386 if (GetAttachmentInfo(info, call))
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2387 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2388 Json::Value operations = Json::arrayValue;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2389
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2390 operations.append("compress");
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2391 operations.append("compressed-data");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2392
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2393 if (info.GetCompressedMD5() != "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2394 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2395 operations.append("compressed-md5");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2396 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2397
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2398 operations.append("compressed-size");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2399 operations.append("data");
4883
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2400 operations.append("info");
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2401 operations.append("is-compressed");
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2402
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2403 if (info.GetUncompressedMD5() != "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2404 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2405 operations.append("md5");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2406 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2407
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2408 operations.append("size");
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2409 operations.append("uncompress");
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2410
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2411 if (info.GetCompressedMD5() != "" &&
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2412 info.GetUncompressedMD5() != "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2413 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2414 operations.append("verify-md5");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2415 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2416
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2417 call.GetOutput().AnswerJson(operations);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2418 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2419 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2420
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2421
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2422 template <int uncompress>
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2423 static void GetAttachmentData(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2424 {
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2425 if (call.IsDocumentation())
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2426 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2427 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2428 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2429 call.GetDocumentation()
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2430 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2431 .SetSummary("Get attachment" + std::string(uncompress ? "" : " (no decompression)"))
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2432 .SetDescription("Get the (binary) content of one attachment associated with the given " + r +
4418
9d6fa3da8f00 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4416
diff changeset
2433 std::string(uncompress ? "" : ". The attachment will not be decompressed if `StorageCompression` is `true`."))
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2434 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2435 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)")
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2436 .AddAnswerType(MimeType_Binary, "The attachment")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2437 .SetAnswerHeader("ETag", "Revision of the attachment, to be used in further `PUT` or `DELETE` operations")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2438 .SetHttpHeader("If-None-Match", "Optional revision of the metadata, to check if its content has changed");
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2439 return;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2440 }
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2441
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2442 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2443
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2444 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2445
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2446 std::string publicId = call.GetUriComponent("id", "");
1146
200fcac0deb4 optimization for access to attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1145
diff changeset
2447 FileContentType type = StringToContentType(call.GetUriComponent("name", ""));
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2448
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2449 FileInfo info;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2450 if (GetAttachmentInfo(info, call))
1146
200fcac0deb4 optimization for access to attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1145
diff changeset
2451 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2452 // NB: "SetAttachmentETag()" is already invoked by "GetAttachmentInfo()"
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2453
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2454 if (uncompress)
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2455 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2456 context.AnswerAttachment(call.GetOutput(), publicId, type);
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2457 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2458 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2459 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2460 // Return the raw data (possibly compressed), as stored on the filesystem
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2461 std::string content;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2462 std::string attachmentId;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2463 int64_t revision;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2464 context.ReadAttachment(content, revision, attachmentId, publicId, type, false, true /* skipCache when you absolutely need the compressed data */);
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2465
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2466 int64_t userRevision;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2467 std::string userMD5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2468 if (GetRevisionHeader(userRevision, userMD5, call, "If-None-Match") &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2469 revision == userRevision &&
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2470 info.GetUncompressedMD5() == userMD5)
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2471 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2472 call.GetOutput().GetLowLevelOutput().SendStatus(HttpStatus_304_NotModified);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2473 }
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2474 else
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2475 {
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2476 call.GetOutput().AnswerBuffer(content, MimeType_Binary);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2477 }
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2478 }
1146
200fcac0deb4 optimization for access to attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1145
diff changeset
2479 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2480 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2481
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2482
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2483 static void GetAttachmentSize(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2484 {
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2485 if (call.IsDocumentation())
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2486 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2487 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2488 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2489 AddAttachmentDocumentation(call, r);
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2490 call.GetDocumentation()
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2491 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2492 .SetSummary("Get size of attachment")
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2493 .SetDescription("Get the size of one attachment associated with the given " + r)
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2494 .AddAnswerType(MimeType_PlainText, "The size of the attachment");
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2495 return;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2496 }
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2497
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2498 FileInfo info;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2499 if (GetAttachmentInfo(info, call))
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2500 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2501 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(info.GetUncompressedSize()), MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2502 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2503 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2504
4883
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2505 static void GetAttachmentInfo(RestApiGetCall& call)
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2506 {
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2507 if (call.IsDocumentation())
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2508 {
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2509 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2510 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2511 AddAttachmentDocumentation(call, r);
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2512 call.GetDocumentation()
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2513 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2514 .SetSummary("Get info about the attachment")
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2515 .SetDescription("Get all the information about the attachment associated with the given " + r)
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2516 .AddAnswerType(MimeType_Json, "JSON object containing the information about the attachment")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
2517 .SetHttpGetSample("https://orthanc.uclouvain.be/demo/instances/7c92ce8e-bbf67ed2-ffa3b8c1-a3b35d94-7ff3ae26/attachments/dicom/info", true);
4883
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2518 return;
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2519 }
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2520
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2521 FileInfo info;
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2522 if (GetAttachmentInfo(info, call))
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2523 {
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2524 Json::Value result = Json::objectValue;
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2525 result["Uuid"] = info.GetUuid();
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2526 result["ContentType"] = info.GetContentType();
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2527 result["UncompressedSize"] = Json::Value::UInt64(info.GetUncompressedSize());
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2528 result["CompressedSize"] = Json::Value::UInt64(info.GetCompressedSize());
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2529 result["UncompressedMD5"] = info.GetUncompressedMD5();
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2530 result["CompressedMD5"] = info.GetCompressedMD5();
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2531
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2532 call.GetOutput().AnswerJson(result);
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2533 }
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
2534 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2535
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2536 static void GetAttachmentCompressedSize(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2537 {
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2538 if (call.IsDocumentation())
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2539 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2540 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2541 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2542 AddAttachmentDocumentation(call, r);
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2543 call.GetDocumentation()
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2544 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2545 .SetSummary("Get size of attachment on disk")
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2546 .SetDescription("Get the size of one attachment associated with the given " + r + ", as stored on the disk. "
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2547 "This is different from `.../size` iff `EnableStorage` is `true`.")
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2548 .AddAnswerType(MimeType_PlainText, "The size of the attachment, as stored on the disk");
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2549 return;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2550 }
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
2551
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2552 FileInfo info;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2553 if (GetAttachmentInfo(info, call))
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2554 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2555 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(info.GetCompressedSize()), MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2556 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2557 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2558
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2559
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2560 static void GetAttachmentMD5(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2561 {
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2562 if (call.IsDocumentation())
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2563 {
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2564 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2565 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2566 AddAttachmentDocumentation(call, r);
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2567 call.GetDocumentation()
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2568 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2569 .SetSummary("Get MD5 of attachment")
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2570 .SetDescription("Get the MD5 hash of one attachment associated with the given " + r)
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2571 .AddAnswerType(MimeType_PlainText, "The MD5 of the attachment");
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2572 return;
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2573 }
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2574
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2575 FileInfo info;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2576 if (GetAttachmentInfo(info, call) &&
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2577 info.GetUncompressedMD5() != "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2578 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2579 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(info.GetUncompressedMD5()), MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2580 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2581 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2582
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2583
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2584 static void GetAttachmentCompressedMD5(RestApiGetCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2585 {
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2586 if (call.IsDocumentation())
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2587 {
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2588 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2589 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2590 AddAttachmentDocumentation(call, r);
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2591 call.GetDocumentation()
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2592 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2593 .SetSummary("Get MD5 of attachment on disk")
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2594 .SetDescription("Get the MD5 hash of one attachment associated with the given " + r + ", as stored on the disk. "
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2595 "This is different from `.../md5` iff `EnableStorage` is `true`.")
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2596 .AddAnswerType(MimeType_PlainText, "The MD5 of the attachment, as stored on the disk");
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2597 return;
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2598 }
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2599
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2600 FileInfo info;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2601 if (GetAttachmentInfo(info, call) &&
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2602 info.GetCompressedMD5() != "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2603 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2604 call.GetOutput().AnswerBuffer(boost::lexical_cast<std::string>(info.GetCompressedMD5()), MimeType_PlainText);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2605 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2606 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2607
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2608
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2609 static void VerifyAttachment(RestApiPostCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2610 {
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2611 if (call.IsDocumentation())
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2612 {
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2613 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2614 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2615 call.GetDocumentation()
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2616 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2617 .SetSummary("Verify attachment")
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2618 .SetDescription("Verify that the attachment is not corrupted, by validating its MD5 hash")
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2619 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2620 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)")
4410
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2621 .AddAnswerType(MimeType_Json, "On success, a valid JSON object is returned");
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2622 return;
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2623 }
a6abe5f512db cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4409
diff changeset
2624
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2625 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2626 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2627
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2628 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2629 std::string name = call.GetUriComponent("name", "");
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2630 FileContentType contentType = StringToContentType(name);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2631
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2632 FileInfo info;
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2633 int64_t revision; // Ignored
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2634 if (!OrthancRestApi::GetIndex(call).LookupAttachment(info, revision, publicId, contentType) ||
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2635 info.GetCompressedMD5() == "" ||
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2636 info.GetUncompressedMD5() == "")
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2637 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2638 // Inexistent resource, or no MD5 available
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2639 return;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2640 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2641
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2642 bool ok = false;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2643
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2644 // First check whether the compressed data is correctly stored in the disk
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2645 std::string data;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2646 std::string attachmentId;
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2647
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2648 context.ReadAttachment(data, revision, attachmentId, publicId, StringToContentType(name), false, true /* skipCache when you absolutely need the compressed data */);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2649
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2650 std::string actualMD5;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2651 Toolbox::ComputeMD5(actualMD5, data);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2652
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2653 if (actualMD5 == info.GetCompressedMD5())
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2654 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2655 // The compressed data is OK. If a compression algorithm was
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2656 // applied to it, now check the MD5 of the uncompressed data.
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2657 if (info.GetCompressionType() == CompressionType_None)
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2658 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2659 ok = true;
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2660 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2661 else
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2662 {
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2663 context.ReadAttachment(data, revision, attachmentId, publicId, StringToContentType(name), true, true /* skipCache when you absolutely need the compressed data */);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2664 Toolbox::ComputeMD5(actualMD5, data);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2665 ok = (actualMD5 == info.GetUncompressedMD5());
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2666 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2667 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2668
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2669 if (ok)
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2670 {
4294
0923247e69f6 log categories: rest -> http + added lua & jobs
Alain Mazy <alain@mazy.be>
parents: 4272
diff changeset
2671 CLOG(INFO, HTTP) << "The attachment " << name << " of resource " << publicId << " has the right MD5";
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2672 call.GetOutput().AnswerBuffer("{}", MimeType_Json);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2673 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2674 else
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2675 {
4294
0923247e69f6 log categories: rest -> http + added lua & jobs
Alain Mazy <alain@mazy.be>
parents: 4272
diff changeset
2676 CLOG(INFO, HTTP) << "The attachment " << name << " of resource " << publicId << " has bad MD5!";
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2677 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2678 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2679
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2680
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2681 static void UploadAttachment(RestApiPutCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2682 {
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2683 if (call.IsDocumentation())
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2684 {
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2685 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2686 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2687 call.GetDocumentation()
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2688 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2689 .SetSummary("Set attachment")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2690 .SetDescription("Attach a file to the given DICOM " + r +
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2691 ". This call will fail if trying to modify a system attachment (i.e. whose index is < 1024).")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2692 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2693 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)")
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2694 .AddRequestType(MimeType_Binary, "Binary data containing the attachment")
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2695 .AddAnswerType(MimeType_Json, "Empty JSON object in the case of a success")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2696 .SetHttpHeader("If-Match", "Revision of the attachment, if this is not the first time this attachment is set.");
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2697 return;
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2698 }
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2699
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2700 ServerContext& context = OrthancRestApi::GetContext(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2701 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2702
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2703 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2704 std::string name = call.GetUriComponent("name", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2705
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2706 FileContentType contentType = StringToContentType(name);
5446
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2707 if (IsUserContentType(contentType) || // It is forbidden to modify internal attachments...
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2708 call.GetRequestOrigin() == RequestOrigin_Plugins) // ...except for plugins
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2709 {
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2710 int64_t oldRevision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2711 std::string oldMD5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2712 bool hasOldRevision = GetRevisionHeader(oldRevision, oldMD5, call, "if-match");
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2713
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2714 if (!hasOldRevision)
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2715 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2716 OrthancConfiguration::ReaderLock lock;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2717 if (lock.GetConfiguration().GetBooleanParameter(CHECK_REVISIONS, false))
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2718 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2719 // "StatelessDatabaseOperations::AddAttachment()" will ignore
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2720 // the actual value of "oldRevision" if the metadata is
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2721 // inexistent as expected
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2722 hasOldRevision = true;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2723 oldRevision = -1; // dummy value
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2724 oldMD5.clear(); // dummy value
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2725 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2726 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2727
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2728 int64_t newRevision;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2729 context.AddAttachment(newRevision, publicId, StringToContentType(name), call.GetBodyData(),
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2730 call.GetBodySize(), hasOldRevision, oldRevision, oldMD5);
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2731
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2732 SetBufferContentETag(call.GetOutput(), newRevision, call.GetBodyData(), call.GetBodySize()); // New in Orthanc 1.9.2
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2733 call.GetOutput().AnswerBuffer("{}", MimeType_Json);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2734 }
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2735 else
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2736 {
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2737 call.GetOutput().SignalError(HttpStatus_403_Forbidden);
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2738 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2739 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2740
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2741
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2742 static void DeleteAttachment(RestApiDeleteCall& call)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2743 {
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2744 if (call.IsDocumentation())
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2745 {
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2746 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2747 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2748 call.GetDocumentation()
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2749 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2750 .SetSummary("Delete attachment")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2751 .SetDescription("Delete an attachment associated with the given DICOM " + r +
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2752 ". This call will fail if trying to delete a system attachment (i.e. whose index is < 1024).")
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2753 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2754 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)")
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2755 .SetHttpHeader("If-Match", "Revision of the attachment, to check if its content has not changed and can "
4661
b1d87d41874e typo: replaced "CheckRevision" by "CheckRevisions"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4657
diff changeset
2756 "be deleted. This header is mandatory if `CheckRevisions` option is `true`.");
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2757 return;
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2758 }
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2759
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2760 CheckValidResourceType(call);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2761
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2762 std::string publicId = call.GetUriComponent("id", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2763 std::string name = call.GetUriComponent("name", "");
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2764 FileContentType contentType = StringToContentType(name);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2765
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2766 bool allowed;
5446
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2767 if (IsUserContentType(contentType) || // It is forbidden to delete internal attachments...
912565317b9a plugins are now allowed to modify/delete private metadata/attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5432
diff changeset
2768 call.GetRequestOrigin() == RequestOrigin_Plugins) // ...except for plugins
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2769 {
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2770 allowed = true;
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2771 }
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2772 else
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2773 {
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2774 OrthancConfiguration::ReaderLock lock;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2775
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2776 if (lock.GetConfiguration().GetBooleanParameter("StoreDicom", true) &&
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2777 contentType == FileContentType_DicomAsJson)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2778 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2779 allowed = true;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2780 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2781 else
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2782 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2783 // It is forbidden to delete internal attachments, except for
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2784 // the "DICOM as JSON" summary as of Orthanc 1.2.0 (this summary
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2785 // would be automatically reconstructed on the next GET call)
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2786 allowed = false;
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2935
diff changeset
2787 }
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2788 }
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2789
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2790 if (allowed)
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2791 {
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2792 bool found;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2793 int64_t revision;
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2794 std::string md5;
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2795 if (GetRevisionHeader(revision, md5, call, "if-match"))
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2796 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2797 found = OrthancRestApi::GetIndex(call).DeleteAttachment(publicId, contentType, true, revision, md5);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2798 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2799 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2800 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2801 OrthancConfiguration::ReaderLock lock;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2802 if (lock.GetConfiguration().GetBooleanParameter(CHECK_REVISIONS, false))
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2803 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2804 throw OrthancException(ErrorCode_Revision,
4661
b1d87d41874e typo: replaced "CheckRevision" by "CheckRevisions"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4657
diff changeset
2805 "HTTP header \"If-Match\" is missing, as \"CheckRevisions\" is \"true\"");
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2806 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2807 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2808 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2809 found = OrthancRestApi::GetIndex(call).DeleteAttachment(publicId, contentType,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
2810 false, -1 /* dummy value */, "" /* dummy value */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2811 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2812 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2813
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2814 if (found)
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2815 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2816 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2817 }
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2818 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2819 {
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2820 throw OrthancException(ErrorCode_UnknownResource);
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2821 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2822 }
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2823 else
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2824 {
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2825 call.GetOutput().SignalError(HttpStatus_403_Forbidden);
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
2826 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2827 }
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2828
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2829
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2830 template <enum CompressionType compression>
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2831 static void ChangeAttachmentCompression(RestApiPostCall& call)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2832 {
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2833 if (call.IsDocumentation())
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2834 {
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2835 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2836 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2837 call.GetDocumentation()
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2838 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2839 .SetSummary(compression == CompressionType_None ? "Uncompress attachment" : "Compress attachment")
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2840 .SetDescription("Change the compression scheme that is used to store an attachment.")
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2841 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4414
d928dfcacb4b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4413
diff changeset
2842 .SetUriArgument("name", "The name of the attachment, or its index (cf. `UserContentType` configuration option)");
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2843 return;
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2844 }
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2845
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2846 CheckValidResourceType(call);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2847
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2848 std::string publicId = call.GetUriComponent("id", "");
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2849 std::string name = call.GetUriComponent("name", "");
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2850 FileContentType contentType = StringToContentType(name);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2851
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2852 OrthancRestApi::GetContext(call).ChangeAttachmentCompression(publicId, contentType, compression);
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2853 call.GetOutput().AnswerBuffer("{}", MimeType_Json);
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2854 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2855
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2856
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2857 static void IsAttachmentCompressed(RestApiGetCall& call)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2858 {
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2859 if (call.IsDocumentation())
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2860 {
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2861 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2862 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
2863 AddAttachmentDocumentation(call, r);
4413
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2864 call.GetDocumentation()
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2865 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2866 .SetSummary("Is attachment compressed?")
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2867 .SetDescription("Test whether the attachment has been stored as a compressed file on the disk.")
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2868 .AddAnswerType(MimeType_PlainText, "`0` if the attachment was stored uncompressed, `1` if it was compressed");
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2869 return;
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2870 }
22a1352a0823 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4410
diff changeset
2871
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2872 FileInfo info;
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2873 if (GetAttachmentInfo(info, call))
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2874 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2875 std::string answer = (info.GetCompressionType() == CompressionType_None) ? "0" : "1";
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
2876 call.GetOutput().AnswerBuffer(answer, MimeType_PlainText);
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2877 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2878 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2879
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1556
diff changeset
2880
782
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2881 // Raw access to the DICOM tags of an instance ------------------------------
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2882
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2883 static void GetRawContent(RestApiGetCall& call)
782
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2884 {
4405
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2885 if (call.IsDocumentation())
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2886 {
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2887 call.GetDocumentation()
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2888 .SetTag("Instances")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2889 .SetSummary("Get raw tag")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2890 .SetDescription("Get the raw content of one DICOM tag in the hierarchy of DICOM dataset")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2891 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
5393
c5c00bee291a in openapi generator: renamed '...' into 'path' since '...' is an invalid name
Alain Mazy <am@osimis.io>
parents: 5392
diff changeset
2892 .SetUriArgument("path", "Path to the DICOM tag. This is the interleaving of one DICOM tag, possibly followed "
4405
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2893 "by an index for sequences. Sequences are accessible as, for instance, `/0008-1140/1/0008-1150`")
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2894 .AddAnswerType(MimeType_Binary, "The raw value of the tag of intereset "
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2895 "(binary data, whose memory layout depends on the underlying transfer syntax), "
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2896 "or JSON array containing the list of available tags if accessing a dataset");
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2897 return;
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2898 }
5466f336b09f gathering statistics about progress of api documentation
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4404
diff changeset
2899
782
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2900 std::string id = call.GetUriComponent("id", "");
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2901
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2902 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), id);
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2903
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2904 locker.GetDicom().SendPathValue(call.GetOutput(), call.GetTrailingUri());
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2905 }
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
2906
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2907
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2908
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2909 static bool ExtractSharedTags(Json::Value& shared,
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2910 ServerContext& context,
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2911 const std::string& publicId)
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2912 {
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2913 // Retrieve all the instances of this patient/study/series
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2914 typedef std::list<std::string> Instances;
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2915 Instances instances;
959
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2916 context.GetIndex().GetChildInstances(instances, publicId); // (*)
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2917
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2918 // Loop over the instances
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2919 bool isFirst = true;
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2920 shared = Json::objectValue;
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2921
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2922 for (Instances::const_iterator it = instances.begin();
1303
bba8a47922d1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
2923 it != instances.end(); ++it)
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2924 {
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2925 // Get the tags of the current instance, in the simplified format
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2926 Json::Value tags;
959
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2927
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2928 try
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2929 {
2124
2b1520efa282 cleaning up
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2122
diff changeset
2930 context.ReadDicomAsJson(tags, *it);
959
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2931 }
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2932 catch (OrthancException&)
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2933 {
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2934 // Race condition: This instance has been removed since
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2935 // (*). Ignore this instance.
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2936 continue;
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2937 }
bd5659f2a50a fix possible race condition
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 958
diff changeset
2938
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2939 if (tags.type() != Json::objectValue)
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2940 {
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2941 return false; // Error
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2942 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2943
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2944 // Only keep the tags that are mapped to a string
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2945 Json::Value::Members members = tags.getMemberNames();
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2946 for (size_t i = 0; i < members.size(); i++)
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2947 {
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2948 const Json::Value& tag = tags[members[i]];
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2949 if (tag.type() != Json::objectValue ||
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2950 tag["Type"].type() != Json::stringValue ||
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2951 tag["Type"].asString() != "String")
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2952 {
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2953 tags.removeMember(members[i]);
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2954 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2955 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2956
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2957 if (isFirst)
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2958 {
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2959 // This is the first instance, keep its tags as such
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2960 shared = tags;
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2961 isFirst = false;
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2962 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2963 else
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2964 {
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2965 // Loop over all the members of the shared tags extracted so
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2966 // far. If the value of one of these tags does not match its
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2967 // value in the current instance, remove it.
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2968 members = shared.getMemberNames();
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2969 for (size_t i = 0; i < members.size(); i++)
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2970 {
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2971 if (!tags.isMember(members[i]) ||
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2972 tags[members[i]]["Value"].asString() != shared[members[i]]["Value"].asString())
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2973 {
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2974 shared.removeMember(members[i]);
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2975 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2976 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2977 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2978 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
2979
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2980 return true;
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2981 }
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2982
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2983
974
83622b0f544c refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 964
diff changeset
2984 static void GetSharedTags(RestApiGetCall& call)
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
2985 {
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2986 if (call.IsDocumentation())
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2987 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
2988 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Full);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
2989
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2990 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2991 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2992 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2993 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2994 .SetSummary("Get shared tags")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2995 .SetDescription("Extract the DICOM tags whose value is constant across all the child instances of "
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2996 "the DICOM " + r + " whose Orthanc identifier is provided in the URL")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2997 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2998 .AddAnswerType(MimeType_Json, "JSON object containing the values of the DICOM tags")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
2999 .SetTruncatedJsonHttpGetSample(GetDocumentationSampleResource(t) + "/shared-tags", 5);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3000 return;
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3001 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3002
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3003 ServerContext& context = OrthancRestApi::GetContext(call);
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3004 std::string publicId = call.GetUriComponent("id", "");
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3005
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3006 Json::Value sharedTags;
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3007 if (ExtractSharedTags(sharedTags, context, publicId))
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3008 {
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3009 // Success: Send the value of the shared tags
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3010 AnswerDicomAsJson(call, sharedTags, OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Full));
960
abac5c83134f simplified and extensive shared-tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 959
diff changeset
3011 }
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
3012 }
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
3013
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
3014
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3015 template <enum ResourceType resourceType,
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3016 enum DicomModule module>
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3017 static void GetModule(RestApiGetCall& call)
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3018 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3019 if (call.IsDocumentation())
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3020 {
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3021 const std::string resource = GetResourceTypeText(resourceType, false /* plural */, false /* lower case */);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3022 std::string m;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3023 switch (module)
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3024 {
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3025 case DicomModule_Patient:
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3026 m = "patient";
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3027 break;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3028 case DicomModule_Study:
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3029 m = "study";
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3030 break;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3031 case DicomModule_Series:
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3032 m = "series";
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3033 break;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3034 case DicomModule_Instance:
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3035 m = "instance";
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3036 break;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3037 default:
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3038 throw OrthancException(ErrorCode_ParameterOutOfRange);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3039 }
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3040
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3041 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Full);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3042
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3043 call.GetDocumentation()
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3044 .SetTag(GetResourceTypeText(resourceType, true /* plural */, true /* upper case */))
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3045 .SetSummary("Get " + m + " module" + std::string(resource == m ? "" : " of " + resource))
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3046 .SetDescription("Get the " + m + " module of the DICOM " + resource + " whose Orthanc identifier is provided in the URL")
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3047 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest")
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
3048 .SetHttpGetArgument(IGNORE_LENGTH, RestApiCallDocumentation::Type_JsonListOfStrings,
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3049 "Also include the DICOM tags that are provided in this list, even if their associated value is long", false)
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3050 .AddAnswerType(MimeType_Json, "Information about the DICOM " + resource)
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3051 .SetHttpGetSample(GetDocumentationSampleResource(resourceType) + "/" + (*call.GetFullUri().rbegin()), true);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3052 return;
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3053 }
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3054
1276
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3055 if (!((resourceType == ResourceType_Patient && module == DicomModule_Patient) ||
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3056 (resourceType == ResourceType_Study && module == DicomModule_Patient) ||
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3057 (resourceType == ResourceType_Study && module == DicomModule_Study) ||
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3058 (resourceType == ResourceType_Series && module == DicomModule_Series) ||
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3059 (resourceType == ResourceType_Instance && module == DicomModule_Instance) ||
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3060 (resourceType == ResourceType_Instance && module == DicomModule_Image)))
1054
1701dcb6f554 Access patient module at the study level to cope with PatientID collisions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 974
diff changeset
3061 {
1701dcb6f554 Access patient module at the study level to cope with PatientID collisions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 974
diff changeset
3062 throw OrthancException(ErrorCode_NotImplemented);
1701dcb6f554 Access patient module at the study level to cope with PatientID collisions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 974
diff changeset
3063 }
1701dcb6f554 Access patient module at the study level to cope with PatientID collisions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 974
diff changeset
3064
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3065 ServerContext& context = OrthancRestApi::GetContext(call);
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3066 std::string publicId = call.GetUriComponent("id", "");
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3067
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3068 std::set<DicomTag> ignoreTagLength;
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
3069 ParseSetOfTags(ignoreTagLength, call, IGNORE_LENGTH);
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3070
1276
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3071 typedef std::set<DicomTag> ModuleTags;
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3072 ModuleTags moduleTags;
1368
b22ba8c5edbe query retrieve
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1361
diff changeset
3073 DicomTag::AddTagsForModule(moduleTags, module);
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3074
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3075 Json::Value tags;
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3076
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3077 if (resourceType != ResourceType_Instance)
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3078 {
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3079 // Retrieve all the instances of this patient/study/series
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3080 typedef std::list<std::string> Instances;
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3081 Instances instances;
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3082 context.GetIndex().GetChildInstances(instances, publicId);
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3083
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3084 if (instances.empty())
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3085 {
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3086 return; // Error: No instance (should never happen)
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3087 }
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3088
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3089 // Select one child instance
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3090 publicId = instances.front();
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3091 }
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3092
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3093 context.ReadDicomAsJson(tags, publicId, ignoreTagLength);
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3094
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3095 // Filter the tags of the instance according to the module
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3096 Json::Value result = Json::objectValue;
1303
bba8a47922d1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
3097 for (ModuleTags::const_iterator tag = moduleTags.begin(); tag != moduleTags.end(); ++tag)
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3098 {
1276
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
3099 std::string s = tag->Format();
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3100 if (tags.isMember(s))
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3101 {
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3102 result[s] = tags[s];
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3103 }
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3104 }
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3105
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3106 AnswerDicomAsJson(call, result, OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Full));
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3107 }
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3108
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
3109
1722
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3110 namespace
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3111 {
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3112 typedef std::list< std::pair<ResourceType, std::string> > LookupResults;
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3113 }
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3114
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3115
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3116 static void AccumulateLookupResults(LookupResults& result,
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3117 ServerIndex& index,
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3118 const DicomTag& tag,
1719
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3119 const std::string& value,
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3120 ResourceType level)
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3121 {
3034
54e422fe31ce moving LookupResource to graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3033
diff changeset
3122 std::vector<std::string> tmp;
1728
4941494b5dd8 rename LookupIdentifier as LookupIdentifierExact
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1727
diff changeset
3123 index.LookupIdentifierExact(tmp, level, tag, value);
1719
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3124
3034
54e422fe31ce moving LookupResource to graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3033
diff changeset
3125 for (size_t i = 0; i < tmp.size(); i++)
1719
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3126 {
3034
54e422fe31ce moving LookupResource to graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3033
diff changeset
3127 result.push_back(std::make_pair(level, tmp[i]));
1719
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3128 }
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3129 }
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3130
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3131
1139
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3132 static void Lookup(RestApiPostCall& call)
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3133 {
4422
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3134 if (call.IsDocumentation())
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3135 {
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3136 call.GetDocumentation()
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3137 .SetTag("System")
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3138 .SetSummary("Look for DICOM identifiers")
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3139 .SetDescription("This URI can be used to convert one DICOM identifier to a list of matching Orthanc resources")
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3140 .AddRequestType(MimeType_PlainText, "The DICOM identifier of interest (i.e. the value of `PatientID`, "
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3141 "`StudyInstanceUID`, `SeriesInstanceUID`, or `SOPInstanceUID`)")
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3142 .AddAnswerType(MimeType_Json, "JSON array containing a list of matching Orthanc resources, each item in the "
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3143 "list corresponding to a JSON object with the fields `Type`, `ID` and `Path` identifying one "
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3144 "DICOM resource that is stored by Orthanc");
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3145 return;
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3146 }
48303e493135 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4421
diff changeset
3147
1446
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
3148 std::string tag;
8dc80ba768aa refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1437
diff changeset
3149 call.BodyToString(tag);
1139
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3150
1722
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3151 LookupResults resources;
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3152 ServerIndex& index = OrthancRestApi::GetIndex(call);
1719
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3153 AccumulateLookupResults(resources, index, DICOM_TAG_PATIENT_ID, tag, ResourceType_Patient);
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3154 AccumulateLookupResults(resources, index, DICOM_TAG_STUDY_INSTANCE_UID, tag, ResourceType_Study);
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3155 AccumulateLookupResults(resources, index, DICOM_TAG_SERIES_INSTANCE_UID, tag, ResourceType_Series);
3b1f7e706d38 fix Orthanc.test_lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1718
diff changeset
3156 AccumulateLookupResults(resources, index, DICOM_TAG_SOP_INSTANCE_UID, tag, ResourceType_Instance);
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3157
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3158 Json::Value result = Json::arrayValue;
1722
f1901004f3e4 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1719
diff changeset
3159 for (LookupResults::const_iterator
1718
2b812969e136 getting rid of an IDatabaseWrapper::LookupIdentifier flavor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1703
diff changeset
3160 it = resources.begin(); it != resources.end(); ++it)
1139
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3161 {
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3162 ResourceType type = it->first;
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3163 const std::string& id = it->second;
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3164
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3165 Json::Value item = Json::objectValue;
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3166 item["Type"] = EnumerationToString(type);
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3167 item["ID"] = id;
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3168 item["Path"] = GetBasePath(type, id);
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3169
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3170 result.append(item);
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3171 }
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3172
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3173 call.GetOutput().AnswerJson(result);
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3174 }
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3175
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
3176
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3177 namespace
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3178 {
3021
2cbafb5d5a62 renamed LookupResource::IVisitor as ServerContext::ILookupVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
3179 class FindVisitor : public ServerContext::ILookupVisitor
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3180 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3181 private:
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3182 bool isComplete_;
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3183 std::list<std::string> resources_;
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
3184 FindStorageAccessMode findStorageAccessMode_;
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3185
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3186 // cache the data we used during lookup and that we could reuse when building the answers
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3187 std::map<std::string, std::string> instancesIds_; // the id of an instance for each found resource.
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3188 std::map<std::string, boost::shared_ptr<DicomMap> > resourcesMainDicomTags_; // all tags read from DB for a resource (current level and upper levels)
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3189 std::map<std::string, boost::shared_ptr<Json::Value> > resourcesDicomAsJson_; // the dicom-as-json for a resource
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3190
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3191 DicomToJsonFormat format_;
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3192
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3193 public:
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
3194 explicit FindVisitor(DicomToJsonFormat format, FindStorageAccessMode findStorageAccessMode) :
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3195 isComplete_(false),
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
3196 findStorageAccessMode_(findStorageAccessMode),
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3197 format_(format)
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3198 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3199 }
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
3200
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
3201 virtual bool IsDicomAsJsonNeeded() const ORTHANC_OVERRIDE
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3003
diff changeset
3202 {
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3003
diff changeset
3203 return false; // (*)
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3003
diff changeset
3204 }
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3003
diff changeset
3205
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
3206 virtual void MarkAsComplete() ORTHANC_OVERRIDE
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3207 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3208 isComplete_ = true; // Unused information as of Orthanc 1.5.0
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3209 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3210
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3211 virtual void Visit(const std::string& publicId,
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3212 const std::string& instanceId,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3213 const DicomMap& mainDicomTags,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3214 const Json::Value* dicomAsJson) ORTHANC_OVERRIDE
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3215 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3216 resources_.push_back(publicId);
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3217 instancesIds_[publicId] = instanceId;
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
3218 resourcesMainDicomTags_[publicId].reset(mainDicomTags.Clone());
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3219 if (dicomAsJson != NULL)
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3220 {
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3221 resourcesDicomAsJson_[publicId].reset(new Json::Value(*dicomAsJson)); // keep our own copy because we might reuse it between lookup and answers
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3222 }
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3223 else
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3224 {
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3225 resourcesDicomAsJson_[publicId] = boost::shared_ptr<Json::Value>();
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
3226 }
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3227 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3228
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3229 void Answer(RestApiOutput& output,
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3230 ServerContext& context,
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3231 ResourceType level,
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3232 bool expand,
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3233 const std::set<DicomTag>& requestedTags) const
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3234 {
5554
12d8a1a266e9 introduction of FindRequest and FindResponse
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5485
diff changeset
3235 AnswerListOfResources1(output, context, resources_, instancesIds_, resourcesMainDicomTags_, resourcesDicomAsJson_, level, expand, format_, requestedTags, IsStorageAccessAllowedForAnswers(findStorageAccessMode_));
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3236 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3237 };
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3238 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3239
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3240
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3241 static void Find(RestApiPostCall& call)
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3242 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3243 static const char* const KEY_CASE_SENSITIVE = "CaseSensitive";
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3244 static const char* const KEY_EXPAND = "Expand";
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3245 static const char* const KEY_LEVEL = "Level";
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3246 static const char* const KEY_LIMIT = "Limit";
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3247 static const char* const KEY_QUERY = "Query";
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3248 static const char* const KEY_REQUESTED_TAGS = "RequestedTags";
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3249 static const char* const KEY_SINCE = "Since";
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3250 static const char* const KEY_LABELS = "Labels"; // New in Orthanc 1.12.0
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3251 static const char* const KEY_LABELS_CONSTRAINT = "LabelsConstraint"; // New in Orthanc 1.12.0
5825
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3252 static const char* const KEY_ORDER_BY = "OrderBy"; // New in Orthanc 1.12.5
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3253 static const char* const KEY_ORDER_BY_KEY = "Key"; // New in Orthanc 1.12.5
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3254 static const char* const KEY_ORDER_BY_TYPE = "Type"; // New in Orthanc 1.12.5
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3255 static const char* const KEY_ORDER_BY_DIRECTION = "Direction"; // New in Orthanc 1.12.5
5826
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3256 static const char* const KEY_PARENT_PATIENT = "ParentPatient"; // New in Orthanc 1.12.5
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3257 static const char* const KEY_PARENT_STUDY = "ParentStudy"; // New in Orthanc 1.12.5
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3258 static const char* const KEY_PARENT_SERIES = "ParentSeries"; // New in Orthanc 1.12.5
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3259 static const char* const KEY_QUERY_METADATA = "QueryMetadata"; // New in Orthanc 1.12.5
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3260
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3261 if (call.IsDocumentation())
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3262 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3263 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3264
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3265 call.GetDocumentation()
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3266 .SetTag("System")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3267 .SetSummary("Look for local resources")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3268 .SetDescription("This URI can be used to perform a search on the content of the local Orthanc server, "
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3269 "in a way that is similar to querying remote DICOM modalities using C-FIND SCU: "
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
3270 "https://orthanc.uclouvain.be/book/users/rest.html#performing-finds-within-orthanc")
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3271 .SetRequestField(KEY_CASE_SENSITIVE, RestApiCallDocumentation::Type_Boolean,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3272 "Enable case-sensitive search for PN value representations (defaults to configuration option `CaseSensitivePN`)", false)
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3273 .SetRequestField(KEY_EXPAND, RestApiCallDocumentation::Type_Boolean,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3274 "Also retrieve the content of the matching resources, not only their Orthanc identifiers", false)
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3275 .SetRequestField(KEY_LEVEL, RestApiCallDocumentation::Type_String,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3276 "Level of the query (`Patient`, `Study`, `Series` or `Instance`)", true)
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3277 .SetRequestField(KEY_LIMIT, RestApiCallDocumentation::Type_Number,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3278 "Limit the number of reported resources", false)
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3279 .SetRequestField(KEY_SINCE, RestApiCallDocumentation::Type_Number,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3280 "Show only the resources since the provided index (in conjunction with `Limit`)", false)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3281 .SetRequestField(KEY_REQUESTED_TAGS, RestApiCallDocumentation::Type_JsonListOfStrings,
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3282 "A list of DICOM tags to include in the response (applicable only if \"Expand\" is set to true). "
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3283 "The tags requested tags are returned in the 'RequestedTags' field in the response. "
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3284 "Note that, if you are requesting tags that are not listed in the Main Dicom Tags stored in DB, building the response "
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3285 "might be slow since Orthanc will need to access the DICOM files. If not specified, Orthanc will return "
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4902
diff changeset
3286 "all Main Dicom Tags to keep backward compatibility with Orthanc prior to 1.11.0.", false)
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3287 .SetRequestField(KEY_QUERY, RestApiCallDocumentation::Type_JsonObject,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3288 "Associative array containing the filter on the values of the DICOM tags", true)
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3289 .SetRequestField(KEY_LABELS, RestApiCallDocumentation::Type_JsonListOfStrings,
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3290 "List of strings specifying which labels to look for in the resources (new in Orthanc 1.12.0)", true)
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3291 .SetRequestField(KEY_LABELS_CONSTRAINT, RestApiCallDocumentation::Type_String,
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3292 "Constraint on the labels, can be `All`, `Any`, or `None` (defaults to `All`, new in Orthanc 1.12.0)", true)
5825
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3293 .SetRequestField(KEY_ORDER_BY, RestApiCallDocumentation::Type_JsonListOfObjects,
5826
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3294 "Array of associative arrays containing the requested ordering (new in Orthanc 1.12.5)", true)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3295 .SetRequestField(KEY_PARENT_PATIENT, RestApiCallDocumentation::Type_String,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3296 "Limit the reported resources to descendants of this patient (new in Orthanc 1.12.5)", true)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3297 .SetRequestField(KEY_PARENT_STUDY, RestApiCallDocumentation::Type_String,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3298 "Limit the reported resources to descendants of this study (new in Orthanc 1.12.5)", true)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3299 .SetRequestField(KEY_PARENT_SERIES, RestApiCallDocumentation::Type_String,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3300 "Limit the reported resources to descendants of this series (new in Orthanc 1.12.5)", true)
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3301 .SetRequestField(KEY_QUERY_METADATA, RestApiCallDocumentation::Type_JsonObject,
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3302 "Associative array containing the filter on the values of the metadata (new in Orthanc 1.12.5)", true)
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3303 .AddAnswerType(MimeType_Json, "JSON array containing either the Orthanc identifiers, or detailed information "
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3304 "about the reported resources (if `Expand` argument is `true`)");
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3305 return;
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3306 }
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
3307
1358
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1356
diff changeset
3308 ServerContext& context = OrthancRestApi::GetContext(call);
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3309
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3310 Json::Value request;
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3311 if (!call.ParseJsonRequest(request) ||
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3312 request.type() != Json::objectValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3313 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3314 throw OrthancException(ErrorCode_BadRequest,
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3315 "The body must contain a JSON object");
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3316 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3317 else if (!request.isMember(KEY_LEVEL) ||
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3318 request[KEY_LEVEL].type() != Json::stringValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3319 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3320 throw OrthancException(ErrorCode_BadRequest,
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3321 "Field \"" + std::string(KEY_LEVEL) + "\" is missing, or should be a string");
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3322 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3323 else if (!request.isMember(KEY_QUERY) &&
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3324 request[KEY_QUERY].type() != Json::objectValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3325 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3326 throw OrthancException(ErrorCode_BadRequest,
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3327 "Field \"" + std::string(KEY_QUERY) + "\" is missing, or should be a JSON object");
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3328 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3329 else if (request.isMember(KEY_CASE_SENSITIVE) &&
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3330 request[KEY_CASE_SENSITIVE].type() != Json::booleanValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3331 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3332 throw OrthancException(ErrorCode_BadRequest,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3333 "Field \"" + std::string(KEY_CASE_SENSITIVE) + "\" must be a Boolean");
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3334 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3335 else if (request.isMember(KEY_LIMIT) &&
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3336 request[KEY_LIMIT].type() != Json::intValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3337 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3338 throw OrthancException(ErrorCode_BadRequest,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3339 "Field \"" + std::string(KEY_LIMIT) + "\" must be an integer");
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3340 }
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3341 else if (request.isMember(KEY_SINCE) &&
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3342 request[KEY_SINCE].type() != Json::intValue)
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3343 {
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3344 throw OrthancException(ErrorCode_BadRequest,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3345 "Field \"" + std::string(KEY_SINCE) + "\" must be an integer");
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3346 }
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3347 else if (request.isMember(KEY_REQUESTED_TAGS) &&
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3348 request[KEY_REQUESTED_TAGS].type() != Json::arrayValue)
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3349 {
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3350 throw OrthancException(ErrorCode_BadRequest,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3351 "Field \"" + std::string(KEY_REQUESTED_TAGS) + "\" must be an array");
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3352 }
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3353 else if (request.isMember(KEY_LABELS) &&
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3354 request[KEY_LABELS].type() != Json::arrayValue)
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3355 {
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3356 throw OrthancException(ErrorCode_BadRequest,
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3357 "Field \"" + std::string(KEY_LABELS) + "\" must be an array of strings");
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3358 }
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3359 else if (request.isMember(KEY_LABELS_CONSTRAINT) &&
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3360 request[KEY_LABELS_CONSTRAINT].type() != Json::stringValue)
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3361 {
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3362 throw OrthancException(ErrorCode_BadRequest,
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3363 "Field \"" + std::string(KEY_LABELS_CONSTRAINT) + "\" must be an array of strings");
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3364 }
5825
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3365 else if (request.isMember(KEY_ORDER_BY) &&
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3366 request[KEY_ORDER_BY].type() != Json::arrayValue)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3367 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3368 throw OrthancException(ErrorCode_BadRequest,
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3369 "Field \"" + std::string(KEY_ORDER_BY) + "\" must be an array");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3370 }
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3371 else if (request.isMember(KEY_QUERY_METADATA) &&
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3372 request[KEY_QUERY_METADATA].type() != Json::objectValue)
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3373 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3374 throw OrthancException(ErrorCode_BadRequest,
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3375 "Field \"" + std::string(KEY_QUERY_METADATA) + "\" must be an JSON object");
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3376 }
5826
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3377 else if (request.isMember(KEY_PARENT_PATIENT) &&
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3378 request[KEY_PARENT_PATIENT].type() != Json::stringValue)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3379 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3380 throw OrthancException(ErrorCode_BadRequest,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3381 "Field \"" + std::string(KEY_PARENT_PATIENT) + "\" must be a string");
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3382 }
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3383 else if (request.isMember(KEY_PARENT_STUDY) &&
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3384 request[KEY_PARENT_STUDY].type() != Json::stringValue)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3385 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3386 throw OrthancException(ErrorCode_BadRequest,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3387 "Field \"" + std::string(KEY_PARENT_STUDY) + "\" must be a string");
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3388 }
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3389 else if (request.isMember(KEY_PARENT_SERIES) &&
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3390 request[KEY_PARENT_SERIES].type() != Json::stringValue)
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3391 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3392 throw OrthancException(ErrorCode_BadRequest,
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3393 "Field \"" + std::string(KEY_PARENT_SERIES) + "\" must be a string");
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3394 }
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3395 else if (true)
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3396 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3397 /**
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3398 * EXPERIMENTAL VERSION
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3399 **/
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3400
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3401 bool expand = false;
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3402 if (request.isMember(KEY_EXPAND))
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3403 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3404 expand = request[KEY_EXPAND].asBool();
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3405 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3406
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3407 const ResourceType level = StringToResourceType(request[KEY_LEVEL].asCString());
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3408
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3409 ResourceFinder finder(level, expand);
5688
d0a264b803f1 first implementation of database paging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5684
diff changeset
3410 finder.SetDatabaseLimits(context.GetDatabaseLimits(level));
5709
476b1db52110 removed the "format_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5708
diff changeset
3411
476b1db52110 removed the "format_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5708
diff changeset
3412 const DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(request, DicomToJsonFormat_Human);
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3413
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3414 if (request.isMember(KEY_LIMIT))
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3415 {
5693
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3416 int64_t tmp = request[KEY_LIMIT].asInt64();
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3417 if (tmp < 0)
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3418 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3419 throw OrthancException(ErrorCode_ParameterOutOfRange,
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3420 "Field \"" + std::string(KEY_LIMIT) + "\" must be a positive integer");
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3421 }
5695
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5693
diff changeset
3422 else if (tmp != 0) // This is for compatibility with Orthanc 1.12.4
5693
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3423 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3424 finder.SetLimitsCount(static_cast<uint64_t>(tmp));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3425 }
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3426 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3427
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3428 if (request.isMember(KEY_SINCE))
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3429 {
5693
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3430 int64_t tmp = request[KEY_SINCE].asInt64();
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3431 if (tmp < 0)
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3432 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3433 throw OrthancException(ErrorCode_ParameterOutOfRange,
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3434 "Field \"" + std::string(KEY_SINCE) + "\" must be a positive integer");
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3435 }
5693
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3436 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3437 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3438 finder.SetLimitsSince(static_cast<uint64_t>(tmp));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
3439 }
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3440 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3441
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3442 {
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3443 bool caseSensitive = false;
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3444 if (request.isMember(KEY_CASE_SENSITIVE))
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3445 {
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3446 caseSensitive = request[KEY_CASE_SENSITIVE].asBool();
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3447 }
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3448
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3449 { // DICOM Tag query
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3450 DatabaseLookup dicomTagLookup;
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3451
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3452 Json::Value::Members members = request[KEY_QUERY].getMemberNames();
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3453 for (size_t i = 0; i < members.size(); i++)
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3454 {
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3455 if (request[KEY_QUERY][members[i]].type() != Json::stringValue)
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3456 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3457 throw OrthancException(ErrorCode_BadRequest,
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3458 "Tag \"" + members[i] + "\" must be associated with a string");
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3459 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3460
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3461 const std::string value = request[KEY_QUERY][members[i]].asString();
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3462
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3463 if (!value.empty())
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3464 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3465 // An empty string corresponds to an universal constraint,
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3466 // so we ignore it. This mimics the behavior of class
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3467 // "OrthancFindRequestHandler"
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3468 dicomTagLookup.AddRestConstraint(FromDcmtkBridge::ParseTag(members[i]),
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3469 value, caseSensitive, true);
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3470 }
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3471 }
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3472
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3473 finder.SetDatabaseLookup(dicomTagLookup);
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3474 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3475
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3476 { // Metadata query
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3477 Json::Value::Members members = request[KEY_QUERY_METADATA].getMemberNames();
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3478 for (size_t i = 0; i < members.size(); i++)
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3479 {
5828
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3480 if (request[KEY_QUERY_METADATA][members[i]].type() != Json::stringValue)
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3481 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3482 throw OrthancException(ErrorCode_BadRequest,
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3483 "Tag \"" + members[i] + "\" must be associated with a string");
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3484 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3485 MetadataType metadata = StringToMetadata(members[i]);
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3486
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3487 const std::string value = request[KEY_QUERY_METADATA][members[i]].asString();
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3488
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3489 if (!value.empty())
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3490 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3491 if (value.find('\\') != std::string::npos)
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3492 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3493 std::vector<std::string> items;
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3494 Toolbox::TokenizeString(items, value, '\\');
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3495
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3496 finder.AddMetadataConstraint(new DatabaseMetadataConstraint(metadata, ConstraintType_List, items, caseSensitive));
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3497 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3498 else if (value.find('*') != std::string::npos || value.find('?') != std::string::npos)
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3499 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3500 finder.AddMetadataConstraint(new DatabaseMetadataConstraint(metadata, ConstraintType_Wildcard, value, caseSensitive));
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3501 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3502 else
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3503 {
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3504 finder.AddMetadataConstraint(new DatabaseMetadataConstraint(metadata, ConstraintType_Equal, value, caseSensitive));
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3505 }
7030fa489669 tools/find: QueryMetadata
Alain Mazy <am@orthanc.team>
parents: 5826
diff changeset
3506 }
5690
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3507 }
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3508 }
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3509 }
708952bd869c integration tests are passing with ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5688
diff changeset
3510
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3511 if (request.isMember(KEY_REQUESTED_TAGS))
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3512 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3513 std::set<DicomTag> requestedTags;
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3514 FromDcmtkBridge::ParseListOfTags(requestedTags, request[KEY_REQUESTED_TAGS]);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3515 finder.AddRequestedTags(requestedTags);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3516 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3517
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3518 if (request.isMember(KEY_LABELS)) // New in Orthanc 1.12.0
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3519 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3520 for (Json::Value::ArrayIndex i = 0; i < request[KEY_LABELS].size(); i++)
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3521 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3522 if (request[KEY_LABELS][i].type() != Json::stringValue)
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3523 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3524 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_LABELS) + "\" must contain strings");
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3525 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3526 else
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3527 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3528 finder.AddLabel(request[KEY_LABELS][i].asString());
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3529 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3530 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3531 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3532
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3533 finder.SetLabelsConstraint(LabelsConstraint_All);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3534
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3535 if (request.isMember(KEY_LABELS_CONSTRAINT))
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3536 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3537 const std::string& s = request[KEY_LABELS_CONSTRAINT].asString();
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3538 if (s == "All")
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3539 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3540 finder.SetLabelsConstraint(LabelsConstraint_All);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3541 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3542 else if (s == "Any")
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3543 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3544 finder.SetLabelsConstraint(LabelsConstraint_Any);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3545 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3546 else if (s == "None")
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3547 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3548 finder.SetLabelsConstraint(LabelsConstraint_None);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3549 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3550 else
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3551 {
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3552 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_LABELS_CONSTRAINT) + "\" must be \"All\", \"Any\", or \"None\"");
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3553 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3554 }
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3555
5826
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3556 if (request.isMember(KEY_PARENT_PATIENT)) // New in Orthanc 1.12.5
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3557 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3558 finder.SetOrthancId(ResourceType_Patient, request[KEY_PARENT_PATIENT].asString());
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3559 }
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3560 else if (request.isMember(KEY_PARENT_STUDY))
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3561 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3562 finder.SetOrthancId(ResourceType_Study, request[KEY_PARENT_STUDY].asString());
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3563 }
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3564 else if (request.isMember(KEY_PARENT_SERIES))
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3565 {
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3566 finder.SetOrthancId(ResourceType_Series, request[KEY_PARENT_SERIES].asString());
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3567 }
d73dfb4548c6 tools/find: ParentPatient and co ..
Alain Mazy <am@orthanc.team>
parents: 5825
diff changeset
3568
5825
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3569 if (request.isMember(KEY_ORDER_BY)) // New in Orthanc 1.12.5
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3570 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3571 for (Json::Value::ArrayIndex i = 0; i < request[KEY_ORDER_BY].size(); i++)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3572 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3573 if (request[KEY_ORDER_BY][i].type() != Json::objectValue)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3574 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3575 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY) + "\" must contain objects");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3576 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3577 else
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3578 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3579 const Json::Value& order = request[KEY_ORDER_BY][i];
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3580 FindRequest::OrderingDirection direction;
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3581 std::string directionString;
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3582 std::string typeString;
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3583
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3584 if (!order.isMember(KEY_ORDER_BY_KEY) || order[KEY_ORDER_BY_KEY].type() != Json::stringValue)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3585 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3586 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY_KEY) + "\" must be a string");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3587 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3588
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3589 if (!order.isMember(KEY_ORDER_BY_DIRECTION) || order[KEY_ORDER_BY_DIRECTION].type() != Json::stringValue)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3590 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3591 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY_DIRECTION) + "\" must be \"ASC\" or \"DESC\"");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3592 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3593
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3594 Toolbox::ToLowerCase(directionString, order[KEY_ORDER_BY_DIRECTION].asString());
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3595 if (directionString == "asc")
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3596 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3597 direction = FindRequest::OrderingDirection_Ascending;
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3598 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3599 else if (directionString == "desc")
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3600 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3601 direction = FindRequest::OrderingDirection_Descending;
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3602 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3603 else
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3604 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3605 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY_DIRECTION) + "\" must be \"ASC\" or \"DESC\"");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3606 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3607
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3608 if (!order.isMember(KEY_ORDER_BY_TYPE) || order[KEY_ORDER_BY_TYPE].type() != Json::stringValue)
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3609 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3610 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY_TYPE) + "\" must be \"DicomTag\" or \"Metadata\"");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3611 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3612
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3613 Toolbox::ToLowerCase(typeString, order[KEY_ORDER_BY_TYPE].asString());
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3614 if (typeString == "dicomtag")
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3615 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3616 DicomTag tag = FromDcmtkBridge::ParseTag(order[KEY_ORDER_BY_KEY].asString());
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3617 finder.AddOrdering(tag, direction);
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3618 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3619 else if (typeString == "metadata")
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3620 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3621 MetadataType metadata = StringToMetadata(order[KEY_ORDER_BY_KEY].asString());
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3622 finder.AddOrdering(metadata, direction);
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3623 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3624 else
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3625 {
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3626 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_ORDER_BY_TYPE) + "\" must be \"DicomTag\" or \"Metadata\"");
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3627 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3628 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3629 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3630 }
881cd0965146 added OrderBy support in SQLite
Alain Mazy <am@orthanc.team>
parents: 5817
diff changeset
3631
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3632 Json::Value answer;
5713
d851a54e49b7 removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5709
diff changeset
3633 finder.Execute(answer, context, format, false /* no "Metadata" field */);
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3634 call.GetOutput().AnswerJson(answer);
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3635 }
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3636 else
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3637 {
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3638 /**
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3639 * VERSION IN ORTHANC <= 1.12.4
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3640 **/
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3641 bool expand = false;
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3642 if (request.isMember(KEY_EXPAND))
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3643 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3644 expand = request[KEY_EXPAND].asBool();
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3645 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3646
1374
a1745d9be6e9 CaseSensitivePN configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1361
diff changeset
3647 bool caseSensitive = false;
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3648 if (request.isMember(KEY_CASE_SENSITIVE))
1374
a1745d9be6e9 CaseSensitivePN configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1361
diff changeset
3649 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3650 caseSensitive = request[KEY_CASE_SENSITIVE].asBool();
1374
a1745d9be6e9 CaseSensitivePN configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1361
diff changeset
3651 }
a1745d9be6e9 CaseSensitivePN configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1361
diff changeset
3652
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3653 size_t limit = 0;
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3654 if (request.isMember(KEY_LIMIT))
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3655 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3656 int tmp = request[KEY_LIMIT].asInt();
1847
559956d5ceb2 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1831
diff changeset
3657 if (tmp < 0)
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3658 {
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3659 throw OrthancException(ErrorCode_ParameterOutOfRange,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3660 "Field \"" + std::string(KEY_LIMIT) + "\" must be a positive integer");
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3661 }
1847
559956d5ceb2 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1831
diff changeset
3662
559956d5ceb2 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1831
diff changeset
3663 limit = static_cast<size_t>(tmp);
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3664 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1728
diff changeset
3665
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3666 size_t since = 0;
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3667 if (request.isMember(KEY_SINCE))
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3668 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3669 int tmp = request[KEY_SINCE].asInt();
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3670 if (tmp < 0)
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3671 {
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3672 throw OrthancException(ErrorCode_ParameterOutOfRange,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3673 "Field \"" + std::string(KEY_SINCE) + "\" must be a positive integer");
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3674 }
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3675
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3676 since = static_cast<size_t>(tmp);
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3677 }
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2281
diff changeset
3678
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3679 std::set<DicomTag> requestedTags;
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3680
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3681 if (request.isMember(KEY_REQUESTED_TAGS))
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3682 {
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3683 FromDcmtkBridge::ParseListOfTags(requestedTags, request[KEY_REQUESTED_TAGS]);
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3684 }
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3685
3033
5da6d1063d8f effectively replacing LookupResource by DatabaseLookup in searches
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3027
diff changeset
3686 ResourceType level = StringToResourceType(request[KEY_LEVEL].asCString());
1360
0649c5aef34a DicomFindQuery
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1358
diff changeset
3687
3033
5da6d1063d8f effectively replacing LookupResource by DatabaseLookup in searches
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3027
diff changeset
3688 DatabaseLookup query;
1358
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1356
diff changeset
3689
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3690 Json::Value::Members members = request[KEY_QUERY].getMemberNames();
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3691 for (size_t i = 0; i < members.size(); i++)
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3692 {
2998
0a52af0c66e7 sharing strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2955
diff changeset
3693 if (request[KEY_QUERY][members[i]].type() != Json::stringValue)
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3694 {
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2998
diff changeset
3695 throw OrthancException(ErrorCode_BadRequest,
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3696 "Tag \"" + members[i] + "\" must be associated with a string");
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3697 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3698
3163
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3699 const std::string value = request[KEY_QUERY][members[i]].asString();
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3700
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3701 if (!value.empty())
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3702 {
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3703 // An empty string corresponds to an universal constraint,
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3704 // so we ignore it. This mimics the behavior of class
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3705 // "OrthancFindRequestHandler"
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3706 query.AddRestConstraint(FromDcmtkBridge::ParseTag(members[i]),
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3707 value, caseSensitive, true);
cf91b6f22278 Fix issue #90 (C-Find shall match missing tags to null/empty string)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
3708 }
1361
94ffb597d297 refactoring of C-Find SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1360
diff changeset
3709 }
2876
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2836
diff changeset
3710
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3711 std::set<std::string> labels;
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3712
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3713 if (request.isMember(KEY_LABELS)) // New in Orthanc 1.12.0
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3714 {
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3715 for (Json::Value::ArrayIndex i = 0; i < request[KEY_LABELS].size(); i++)
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3716 {
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3717 if (request[KEY_LABELS][i].type() != Json::stringValue)
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3718 {
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3719 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_LABELS) + "\" must contain strings");
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3720 }
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3721 else
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3722 {
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3723 labels.insert(request[KEY_LABELS][i].asString());
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3724 }
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3725 }
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3726 }
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3727
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3728 LabelsConstraint labelsConstraint = LabelsConstraint_All;
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3729
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3730 if (request.isMember(KEY_LABELS_CONSTRAINT))
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3731 {
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3732 const std::string& s = request[KEY_LABELS_CONSTRAINT].asString();
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3733 if (s == "All")
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3734 {
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3735 labelsConstraint = LabelsConstraint_All;
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3736 }
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3737 else if (s == "Any")
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3738 {
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3739 labelsConstraint = LabelsConstraint_Any;
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3740 }
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3741 else if (s == "None")
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3742 {
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3743 labelsConstraint = LabelsConstraint_None;
5248
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3744 }
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3745 else
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3746 {
a7d95f951f8a replaced "WithLabels" and "WithoutLabels", by "Labels" and "LabelsConstraint"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5227
diff changeset
3747 throw OrthancException(ErrorCode_BadRequest, "Field \"" + std::string(KEY_LABELS_CONSTRAINT) + "\" must be \"All\", \"Any\", or \"None\"");
5227
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3748 }
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3749 }
988dab8deb1c "/tools/find" accepts the "WithLabels" and "WithoutLabels" arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
3750
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5054
diff changeset
3751 FindVisitor visitor(OrthancRestApi::GetDicomFormat(request, DicomToJsonFormat_Human), context.GetFindStorageAccessMode());
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5655
diff changeset
3752 context.Apply(visitor, query, level, labels, labelsConstraint, since, limit);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3753 visitor.Answer(call.GetOutput(), context, level, expand, requestedTags);
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3754 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3755 }
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3756
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
3757
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3758 template <enum ResourceType start,
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3759 enum ResourceType end>
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3760 static void GetChildResources(RestApiGetCall& call)
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3761 {
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3762 if (call.IsDocumentation())
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3763 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3764 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3765 OrthancRestApi::DocumentRequestedTags(call);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3766
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3767 const std::string children = GetResourceTypeText(end, true /* plural */, false /* lower case */);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3768 const std::string resource = GetResourceTypeText(start, false /* plural */, false /* lower case */);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3769 call.GetDocumentation()
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3770 .SetTag(GetResourceTypeText(start, true /* plural */, true /* upper case */))
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3771 .SetSummary("Get child " + children)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3772 .SetDescription("Get detailed information about the child " + children + " of the DICOM " +
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3773 resource + " whose Orthanc identifier is provided in the URL")
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3774 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest")
5405
62bb63346185 All 'expand' GET arguments now accepts expand=true and expand=false values + /studies/../instances now supports expand=false
Alain Mazy <am@osimis.io>
parents: 5393
diff changeset
3775 .SetHttpGetArgument("expand", RestApiCallDocumentation::Type_String,
62bb63346185 All 'expand' GET arguments now accepts expand=true and expand=false values + /studies/../instances now supports expand=false
Alain Mazy <am@osimis.io>
parents: 5393
diff changeset
3776 "If false or missing, only retrieve the list of child " + children, false)
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3777 .AddAnswerType(MimeType_Json, "JSON array containing information about the child DICOM " + children)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3778 .SetTruncatedJsonHttpGetSample(GetDocumentationSampleResource(start) + "/" + children, 5);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3779 return;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3780 }
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3781
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3782 ServerIndex& index = OrthancRestApi::GetIndex(call);
5405
62bb63346185 All 'expand' GET arguments now accepts expand=true and expand=false values + /studies/../instances now supports expand=false
Alain Mazy <am@osimis.io>
parents: 5393
diff changeset
3783 ServerContext& context = OrthancRestApi::GetContext(call);
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3784
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3785 const bool expand = (!call.HasArgument("expand") ||
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3786 // this "expand" is the only one to have a false default value to keep backward compatibility
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3787 call.GetBooleanArgument("expand", false));
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3788 const DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Human);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3789
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3790 std::set<DicomTag> requestedTags;
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3791 OrthancRestApi::GetRequestedTags(requestedTags, call);
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3792
5665
d8c86698110c implemented computed tag: Instance Availability
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5656
diff changeset
3793 if (true)
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3794 {
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3795 /**
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3796 * EXPERIMENTAL VERSION
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3797 **/
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3798
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3799 ResourceFinder finder(end, expand);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3800 finder.SetOrthancId(start, call.GetUriComponent("id", ""));
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3801 finder.AddRequestedTags(requestedTags);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3802
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3803 Json::Value answer;
5713
d851a54e49b7 removed "includeAllMetadata_" member from ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5709
diff changeset
3804 finder.Execute(answer, context, format, false /* no "Metadata" field */);
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3805 call.GetOutput().AnswerJson(answer);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3806 }
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3807 else
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3808 {
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3809 /**
5677
dc96401dbe88 starting the refactoring of /tools/find
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5665
diff changeset
3810 * VERSION IN ORTHANC <= 1.12.4
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3811 **/
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3812 std::list<std::string> a, b, c;
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3813 a.push_back(call.GetUriComponent("id", ""));
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3814
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3815 ResourceType type = start;
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3816 while (type != end)
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3817 {
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3818 b.clear();
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3819
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3820 for (std::list<std::string>::const_iterator
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3821 it = a.begin(); it != a.end(); ++it)
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3822 {
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3823 index.GetChildren(c, *it);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3824 b.splice(b.begin(), c);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3825 }
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3826
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3827 type = GetChildResourceType(type);
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3828
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3829 a.clear();
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3830 a.splice(a.begin(), b);
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3831 }
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3832
5617
8905ffa45fc2 started listing of children resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5615
diff changeset
3833 AnswerListOfResources2(call.GetOutput(), context, a, type, expand, format, requestedTags, true /* allowStorageAccess */);
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3834 }
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3835 }
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3836
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3837
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3838 static void GetChildInstancesTags(RestApiGetCall& call)
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3839 {
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3840 if (call.IsDocumentation())
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3841 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3842 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Full);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3843
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3844 ResourceType t = StringToResourceType(call.GetFullUri()[0].c_str());
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3845 std::string r = GetResourceTypeText(t, false /* plural */, false /* upper case */);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3846 call.GetDocumentation()
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3847 .SetTag(GetResourceTypeText(t, true /* plural */, true /* upper case */))
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3848 .SetSummary("Get tags of instances")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3849 .SetDescription("Get the tags of all the child instances of the DICOM " + r +
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3850 " whose Orthanc identifier is provided in the URL")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3851 .SetUriArgument("id", "Orthanc identifier of the " + r + " of interest")
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
3852 .SetHttpGetArgument(IGNORE_LENGTH, RestApiCallDocumentation::Type_JsonListOfStrings,
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3853 "Also include the DICOM tags that are provided in this list, even if their associated value is long", false)
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3854 .AddAnswerType(MimeType_Json, "JSON object associating the Orthanc identifiers of the instances, with the values of their DICOM tags")
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3855 .SetTruncatedJsonHttpGetSample(GetDocumentationSampleResource(t) + "/instances-tags", 5);
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3856 return;
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3857 }
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3858
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3859 ServerContext& context = OrthancRestApi::GetContext(call);
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3860 std::string publicId = call.GetUriComponent("id", "");
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3861 DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Full);
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3862
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3863 std::set<DicomTag> ignoreTagLength;
4722
2b4da0ee6b73 added missing documentation of "ignore-length" in "/instances/{id}/tags"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4716
diff changeset
3864 ParseSetOfTags(ignoreTagLength, call, IGNORE_LENGTH);
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3865
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3866 // Retrieve all the instances of this patient/study/series
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3867 typedef std::list<std::string> Instances;
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3868 Instances instances;
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3869
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3870 context.GetIndex().GetChildInstances(instances, publicId); // (*)
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3871
1201
09aa7c126be9 URIs 'instance-tags' now indexed by the instance IDs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1172
diff changeset
3872 Json::Value result = Json::objectValue;
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3873
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3874 for (Instances::const_iterator it = instances.begin();
1303
bba8a47922d1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
3875 it != instances.end(); ++it)
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3876 {
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3877 Json::Value full;
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2408
diff changeset
3878 context.ReadDicomAsJson(full, *it, ignoreTagLength);
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3879
2622
3603a2e14592 New option "?short" to list DICOM tags using their hexadecimal ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
3880 if (format != DicomToJsonFormat_Full)
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3881 {
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3882 Json::Value simplified;
4055
9214e3a7b0a2 moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4045
diff changeset
3883 Toolbox::SimplifyDicomAsJson(simplified, full, format);
1201
09aa7c126be9 URIs 'instance-tags' now indexed by the instance IDs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1172
diff changeset
3884 result[*it] = simplified;
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3885 }
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3886 else
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3887 {
1201
09aa7c126be9 URIs 'instance-tags' now indexed by the instance IDs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1172
diff changeset
3888 result[*it] = full;
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3889 }
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3890 }
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3891
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3892 call.GetOutput().AnswerJson(result);
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3893 }
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3894
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
3895
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
3896
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3897 template <enum ResourceType start,
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3898 enum ResourceType end>
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3899 static void GetParentResource(RestApiGetCall& call)
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3900 {
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3901 assert(start > end);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3902
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3903 if (call.IsDocumentation())
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3904 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3905 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3906 OrthancRestApi::DocumentRequestedTags(call);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3907
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3908 const std::string parent = GetResourceTypeText(end, false /* plural */, false /* lower case */);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3909 const std::string resource = GetResourceTypeText(start, false /* plural */, false /* lower case */);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3910 call.GetDocumentation()
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3911 .SetTag(GetResourceTypeText(start, true /* plural */, true /* upper case */))
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3912 .SetSummary("Get parent " + parent)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3913 .SetDescription("Get detailed information about the parent " + parent + " of the DICOM " +
4416
0b27841950d5 openapi about creation of zip/media archives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4415
diff changeset
3914 resource + " whose Orthanc identifier is provided in the URL")
4415
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3915 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest")
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3916 .AddAnswerType(MimeType_Json, "Information about the parent DICOM " + parent)
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3917 .SetTruncatedJsonHttpGetSample(GetDocumentationSampleResource(start) + "/" + parent, 10);
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3918 return;
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3919 }
b50410d0e98c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4414
diff changeset
3920
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3921 ServerIndex& index = OrthancRestApi::GetIndex(call);
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3922
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3923 std::set<DicomTag> requestedTags;
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3924 OrthancRestApi::GetRequestedTags(requestedTags, call);
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
3925
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3926 std::string current = call.GetUriComponent("id", "");
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3927 ResourceType currentType = start;
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3928 while (currentType > end)
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3929 {
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3930 std::string parent;
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3931 if (!index.LookupParent(parent, current))
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3932 {
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3933 // Error that could happen if the resource gets deleted by
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3934 // another concurrent call
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3935 return;
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3936 }
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3937
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3938 current = parent;
1555
d6a93e12b1c1 Creation of DICOM files with encapsulated PDF
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1509
diff changeset
3939 currentType = GetParentResourceType(currentType);
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3940 }
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3941
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3942 assert(currentType == end);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3943
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3944 const DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Human);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
3945
4554
efd90f778cd2 simplification
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4551
diff changeset
3946 Json::Value resource;
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3947
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3948 if (true)
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3949 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3950 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3951 * EXPERIMENTAL VERSION
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3952 **/
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5713
diff changeset
3953 if (ExpandResource(resource, OrthancRestApi::GetContext(call), currentType, current, format, false))
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3954 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3955 call.GetOutput().AnswerJson(resource);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3956 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3957 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3958 else
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3959 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3960 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3961 * VERSION IN ORTHANC <= 1.12.4
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3962 **/
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3963 if (OrthancRestApi::GetContext(call).ExpandResource(resource, current, end, format, requestedTags, true /* allowStorageAccess */))
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3964 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3965 call.GetOutput().AnswerJson(resource);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
3966 }
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3967 }
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3968 }
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3969
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3970
1556
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3971 static void ExtractPdf(RestApiGetCall& call)
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3972 {
4407
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3973 if (call.IsDocumentation())
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3974 {
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3975 call.GetDocumentation()
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3976 .SetTag("Instances")
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3977 .SetSummary("Get embedded PDF")
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3978 .SetDescription("Get the PDF file that is embedded in one DICOM instance. "
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3979 "If the DICOM instance doesn't contain the `EncapsulatedDocument` tag or if the "
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3980 "`MIMETypeOfEncapsulatedDocument` tag doesn't correspond to the PDF type, a `404` HTTP error is raised.")
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3981 .SetUriArgument("id", "Orthanc identifier of the instance interest")
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3982 .AddAnswerType(MimeType_Pdf, "PDF file");
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3983 return;
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3984 }
2412601cd24b cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4406
diff changeset
3985
1556
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3986 const std::string id = call.GetUriComponent("id", "");
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3987 std::string pdf;
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3988 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), id);
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3989
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3990 if (locker.GetDicom().ExtractPdf(pdf))
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3991 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
3992 call.GetOutput().AnswerBuffer(pdf, MimeType_Pdf);
1556
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3993 return;
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3994 }
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3995 }
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
3996
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
3997
1702
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
3998 static void OrderSlices(RestApiGetCall& call)
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
3999 {
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4000 if (call.IsDocumentation())
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4001 {
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4002 call.GetDocumentation()
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4003 .SetDeprecated()
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4004 .SetTag("Series")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4005 .SetSummary("Order the slices")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4006 .SetDescription("Sort the instances and frames (slices) of the DICOM series whose Orthanc identifier is provided in the URL. "
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4007 "This URI is essentially used by the Orthanc Web viewer and by the Osimis Web viewer.")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4008 .SetUriArgument("id", "Orthanc identifier of the series of interest")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4009 .SetAnswerField("Dicom", RestApiCallDocumentation::Type_JsonListOfStrings,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4010 "Ordered list of paths to DICOM instances")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4011 .SetAnswerField("Slices", RestApiCallDocumentation::Type_JsonListOfStrings,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4012 "Ordered list of paths to frames. It is recommended to use this field, as it is also valid "
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4013 "in the case of multiframe images.")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4014 .SetAnswerField("SlicesShort", RestApiCallDocumentation::Type_JsonListOfObjects,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4015 "Same information as the `Slices` field, but in a compact form")
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4016 .SetAnswerField("Type", RestApiCallDocumentation::Type_String,
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4017 "Can be `Volume` (for 3D volumes) or `Sequence` (notably for cine images)")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
4018 .SetTruncatedJsonHttpGetSample("https://orthanc.uclouvain.be/demo/series/1e2c125c-411b8e86-3f4fe68e-a7584dd3-c6da78f0/ordered-slices", 10);
4421
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4019 return;
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4020 }
a7d72378e1cb cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4420
diff changeset
4021
1702
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4022 const std::string id = call.GetUriComponent("id", "");
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4023
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4024 ServerIndex& index = OrthancRestApi::GetIndex(call);
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4025 SliceOrdering ordering(index, id);
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4026
1703
b80e76dd1d56 ordered-slices continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1702
diff changeset
4027 Json::Value result;
b80e76dd1d56 ordered-slices continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1702
diff changeset
4028 ordering.Format(result);
b80e76dd1d56 ordered-slices continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1702
diff changeset
4029 call.GetOutput().AnswerJson(result);
1702
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4030 }
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4031
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4032
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4033 static void GetInstanceHeader(RestApiGetCall& call)
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4034 {
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4035 if (call.IsDocumentation())
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4036 {
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
4037 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Full);
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4038 call.GetDocumentation()
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4039 .SetTag("Instances")
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4040 .SetSummary("Get DICOM meta-header")
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4041 .SetDescription("Get the DICOM tags in the meta-header of the DICOM instance. By default, the `full` format is used, which "
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4042 "combines hexadecimal tags with human-readable description.")
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4043 .SetUriArgument("id", "Orthanc identifier of the DICOM instance of interest")
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4044 .AddAnswerType(MimeType_Json, "JSON object containing the DICOM tags and their associated value")
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
4045 .SetHttpGetSample("https://orthanc.uclouvain.be/demo/instances/7c92ce8e-bbf67ed2-ffa3b8c1-a3b35d94-7ff3ae26/header", true);
4404
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4046 return;
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4047 }
f34634916d8c cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4403
diff changeset
4048
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4049 ServerContext& context = OrthancRestApi::GetContext(call);
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4050
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4051 std::string publicId = call.GetUriComponent("id", "");
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4052
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4053 std::string dicomContent;
4792
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4777
diff changeset
4054 context.ReadDicomForHeader(dicomContent, publicId);
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4055
2007
655489d9165d DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2003
diff changeset
4056 // TODO Consider using "DicomMap::ParseDicomMetaInformation()" to
655489d9165d DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2003
diff changeset
4057 // speed up things here
655489d9165d DicomMap::ParseDicomMetaInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2003
diff changeset
4058
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4059 ParsedDicomFile dicom(dicomContent);
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4060
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4061 Json::Value header;
4140
0ddc5297a8ab centralization of default parameters for JSON/DicomMap conversions from DCMTK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4139
diff changeset
4062 OrthancConfiguration::DefaultDicomHeaderToJson(header, dicom);
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4063
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
4064 AnswerDicomAsJson(call, header, OrthancRestApi::GetDicomFormat(call, DicomToJsonFormat_Full));
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4065 }
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4066
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4067
2129
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4068 static void InvalidateTags(RestApiPostCall& call)
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4069 {
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4070 if (call.IsDocumentation())
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4071 {
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4072 call.GetDocumentation()
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4073 .SetTag("System")
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4074 .SetSummary("Invalidate DICOM-as-JSON summaries")
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4075 .SetDescription("Remove all the attachments of the type \"DICOM-as-JSON\" that are associated will all the "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4076 "DICOM instances stored in Orthanc. These summaries will be automatically re-created on the next access. "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4077 "This is notably useful after changes to the `Dictionary` configuration option. "
5432
59e3b6f8c5be migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5427
diff changeset
4078 "https://orthanc.uclouvain.be/book/faq/orthanc-storage.html#storage-area");
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4079 return;
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4080 }
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4081
2129
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4082 ServerIndex& index = OrthancRestApi::GetIndex(call);
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4083
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4084 // Loop over the instances, grouping them by parent studies so as
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4085 // to avoid large memory consumption
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4086 std::list<std::string> studies;
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4087 index.GetAllUuids(studies, ResourceType_Study);
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4088
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4089 for (std::list<std::string>::const_iterator
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4090 study = studies.begin(); study != studies.end(); ++study)
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4091 {
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4092 std::list<std::string> instances;
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4093 index.GetChildInstances(instances, *study);
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4094
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4095 for (std::list<std::string>::const_iterator
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4096 instance = instances.begin(); instance != instances.end(); ++instance)
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4097 {
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
4098 index.DeleteAttachment(*instance, FileContentType_DicomAsJson,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4627
diff changeset
4099 false /* no revision checks */, -1 /* dummy */, "" /* dummy */);
2129
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4100 }
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4101 }
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4102
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
4103 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
2129
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4104 }
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4105
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4106 void DocumentReconstructFilesField(RestApiPostCall& call, bool documentLimitField)
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4107 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4108 call.GetDocumentation()
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4109 .SetRequestField(RECONSTRUCT_FILES, RestApiCallDocumentation::Type_Boolean,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4110 "Also reconstruct the files of the resources (e.g: apply IngestTranscoding, StorageCompression). "
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4111 "'false' by default. (New in Orthanc 1.11.0)", false);
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4112 if (documentLimitField)
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4113 {
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4114 call.GetDocumentation()
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4115 .SetRequestField(LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS, RestApiCallDocumentation::Type_Boolean,
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4116 "Only reconstruct this level MainDicomTags by re-reading them from a random child instance of the resource. "
5655
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5647
diff changeset
4117 "This option is much faster than a full reconstruct and is useful e.g. if you have modified the "
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4118 "'ExtraMainDicomTags' at the Study level to optimize the speed of some C-Find. "
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4119 "'false' by default. (New in Orthanc 1.12.4)", false);
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4120 }
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4121 }
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4122
4994
2f30aa99c2db cppcheck
Alain Mazy <am@osimis.io>
parents: 4988
diff changeset
4123 bool GetReconstructFilesField(const RestApiPostCall& call)
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4124 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4125 bool reconstructFiles = false;
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4126 Json::Value request;
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4127
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4128 if (call.GetBodySize() > 0 && call.ParseJsonRequest(request) && request.isMember(RECONSTRUCT_FILES)) // allow "" payload to keep backward compatibility
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4129 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4130 if (!request[RECONSTRUCT_FILES].isBool())
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4131 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4132 throw OrthancException(ErrorCode_BadFileFormat,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4133 "The field " + std::string(RECONSTRUCT_FILES) + " must contain a Boolean");
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4134 }
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4135
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4136 reconstructFiles = request[RECONSTRUCT_FILES].asBool();
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4137 }
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4138
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4139 return reconstructFiles;
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4140 }
2129
0c09d1af22f3 "/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
4141
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4142 bool GetLimitToThisLevelMainDicomTags(const RestApiPostCall& call)
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4143 {
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4144 bool limitToThisLevel = false;
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4145 Json::Value request;
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4146
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4147 if (call.GetBodySize() > 0 && call.ParseJsonRequest(request) && request.isMember(LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS))
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4148 {
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4149 if (!request[LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS].isBool())
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4150 {
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4151 throw OrthancException(ErrorCode_BadFileFormat,
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4152 "The field " + std::string(LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS) + " must contain a Boolean");
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4153 }
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4154
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4155 limitToThisLevel = request[LIMIT_TO_THIS_LEVEL_MAIN_DICOM_TAGS].asBool();
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4156 }
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4157
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4158 return limitToThisLevel;
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4159 }
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4160
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4161
2209
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4162 template <enum ResourceType type>
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4163 static void ReconstructResource(RestApiPostCall& call)
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4164 {
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4165 if (call.IsDocumentation())
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4166 {
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4167 const std::string resource = GetResourceTypeText(type, false /* plural */, false /* lower case */);
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4168 call.GetDocumentation()
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4169 .SetTag(GetResourceTypeText(type, true /* plural */, true /* upper case */))
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4170 .SetSummary("Reconstruct tags & optionally files of " + resource)
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4171 .SetDescription("Reconstruct the main DICOM tags in DB of the " + resource + " whose Orthanc identifier is provided "
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4172 "in the URL. This is useful if child studies/series/instances have inconsistent values for "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4173 "higher-level tags, in order to force Orthanc to use the value from the resource of interest. "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4174 "Beware that this is a time-consuming operation, as all the children DICOM instances will be "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4175 "parsed again, and the Orthanc index will be updated accordingly.")
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4176 .SetUriArgument("id", "Orthanc identifier of the " + resource + " of interest");
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4177 DocumentReconstructFilesField(call, true);
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4178
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4179 return;
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4180 }
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4181
2209
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4182 ServerContext& context = OrthancRestApi::GetContext(call);
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4183 ServerToolbox::ReconstructResource(context, call.GetUriComponent("id", ""), GetReconstructFilesField(call), GetLimitToThisLevelMainDicomTags(call), type);
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
4184 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
2209
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4185 }
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4186
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4187
2804
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4188 static void ReconstructAllResources(RestApiPostCall& call)
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4189 {
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4190 if (call.IsDocumentation())
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4191 {
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4192 call.GetDocumentation()
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4193 .SetTag("System")
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4194 .SetSummary("Reconstruct all the index")
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4195 .SetDescription("Reconstruct the index of all the tags of all the DICOM instances that are stored in Orthanc. "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4196 "This is notably useful after the deletion of resources whose children resources have inconsistent "
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4197 "values with their sibling resources. Beware that this is a highly time-consuming operation, "
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4198 "as all the DICOM instances will be parsed again, and as all the Orthanc index will be regenerated. "
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4199 "If you have a large database to process, it is advised to use the Housekeeper plugin to perform "
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4200 "this action resource by resource");
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4201 DocumentReconstructFilesField(call, false);
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4202
4420
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4203 return;
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4204 }
f95ad769e671 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4419
diff changeset
4205
2804
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4206 ServerContext& context = OrthancRestApi::GetContext(call);
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4207
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4208 std::list<std::string> studies;
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4209 context.GetIndex().GetAllUuids(studies, ResourceType_Study);
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
4210 bool reconstructFiles = GetReconstructFilesField(call);
2804
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4211
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4212 for (std::list<std::string>::const_iterator
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4213 study = studies.begin(); study != studies.end(); ++study)
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4214 {
5558
c1ed59a5bdc2 new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
Alain Mazy <am@orthanc.team>
parents: 5485
diff changeset
4215 ServerToolbox::ReconstructResource(context, *study, reconstructFiles, false, ResourceType_Study /* dummy */);
2804
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4216 }
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4217
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2905
diff changeset
4218 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
2804
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4219 }
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4220
d88970f1ffbf fix ordering of non-parallel slices + /tools/reconstruct
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2780
diff changeset
4221
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4222 static void GetBulkChildren(std::set<std::string>& target,
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4223 ServerIndex& index,
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4224 const std::set<std::string>& source)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4225 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4226 target.clear();
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4227
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4228 for (std::set<std::string>::const_iterator
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4229 it = source.begin(); it != source.end(); ++it)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4230 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4231 std::list<std::string> children;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4232 index.GetChildren(children, *it);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4233
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4234 for (std::list<std::string>::const_iterator
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4235 child = children.begin(); child != children.end(); ++child)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4236 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4237 target.insert(*child);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4238 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4239 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4240 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4241
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4242
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4243 static void AddMetadata(Json::Value& target,
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4244 ServerIndex& index,
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4245 const std::string& resource,
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4246 ResourceType level)
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4247 {
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4248 target = Json::objectValue;
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4249
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4250 std::map<MetadataType, std::string> content;
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4251 index.GetAllMetadata(content, resource, level);
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4252
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4253 for (std::map<MetadataType, std::string>::const_iterator
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4254 it = content.begin(); it != content.end(); ++it)
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4255 {
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4256 target[EnumerationToString(it->first)] = it->second;
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4257 }
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4258 }
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4259
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4260
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4261 static void BulkContent(RestApiPostCall& call)
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4262 {
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4263 static const char* const LEVEL = "Level";
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4264 static const char* const METADATA = "Metadata";
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
4265
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4266 if (call.IsDocumentation())
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4267 {
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4268 OrthancRestApi::DocumentDicomFormat(call, DicomToJsonFormat_Human);
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4269
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4270 call.GetDocumentation()
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4271 .SetTag("System")
4879
c728d8f25e5a fix doc
Alain Mazy <am@osimis.io>
parents: 4858
diff changeset
4272 .SetSummary("Describe a set of resources")
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4273 .SetRequestField("Resources", RestApiCallDocumentation::Type_JsonListOfStrings,
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4274 "List of the Orthanc identifiers of the patients/studies/series/instances of interest.", true)
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4275 .SetRequestField(LEVEL, RestApiCallDocumentation::Type_String,
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4276 "This optional argument specifies the level of interest (can be `Patient`, `Study`, `Series` or "
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
4277 "`Instance`). Orthanc will loop over the items inside `Resources`, and explore upward or "
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4278 "downward in the DICOM hierarchy in order to find the level of interest.", false)
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4279 .SetRequestField(METADATA, RestApiCallDocumentation::Type_Boolean,
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4280 "If set to `true` (default value), the metadata associated with the resources will also be retrieved.", false)
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4281 .SetDescription("Get the content all the DICOM patients, studies, series or instances "
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4282 "whose identifiers are provided in the `Resources` field, in one single call.");
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4283 return;
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4284 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4285
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4286 Json::Value request;
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4287 if (!call.ParseJsonRequest(request) ||
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4288 request.type() != Json::objectValue)
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4289 {
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4290 throw OrthancException(ErrorCode_BadRequest,
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4291 "The body must contain a JSON object");
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4292 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4293 else
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4294 {
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4295 const DicomToJsonFormat format = OrthancRestApi::GetDicomFormat(request, DicomToJsonFormat_Human);
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4296
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4297 bool metadata = true;
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4298 if (request.isMember(METADATA))
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4299 {
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4300 metadata = SerializationToolbox::ReadBoolean(request, METADATA);
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4301 }
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4302
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4303 ServerIndex& index = OrthancRestApi::GetIndex(call);
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4304
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4305 Json::Value answer = Json::arrayValue;
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4306
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4307 if (request.isMember(LEVEL))
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4308 {
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4309 // Complex case: Need to explore the DICOM hierarchy
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4310 ResourceType level = StringToResourceType(SerializationToolbox::ReadString(request, LEVEL).c_str());
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4311
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4312 std::set<std::string> resources;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4313 SerializationToolbox::ReadSetOfStrings(resources, request, "Resources");
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4314
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4315 std::set<std::string> interest;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4316
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4317 assert(ResourceType_Patient < ResourceType_Study &&
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4318 ResourceType_Study < ResourceType_Series &&
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4319 ResourceType_Series < ResourceType_Instance);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4320
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4321 for (std::set<std::string>::const_iterator
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4322 it = resources.begin(); it != resources.end(); ++it)
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4323 {
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4324 ResourceType type;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4325 if (index.LookupResourceType(type, *it))
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4326 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4327 if (type == level)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4328 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4329 // This resource is already from the level of interest
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4330 interest.insert(*it);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4331 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4332 else if (type < level)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4333 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4334 // Need to explore children
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4335 std::set<std::string> current;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4336 current.insert(*it);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4337
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4338 for (;;)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4339 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4340 std::set<std::string> children;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4341 GetBulkChildren(children, index, current);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4342
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4343 type = GetChildResourceType(type);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4344 if (type == level)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4345 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4346 for (std::set<std::string>::const_iterator
4716
758fe3ffb336 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4714
diff changeset
4347 it2 = children.begin(); it2 != children.end(); ++it2)
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4348 {
4716
758fe3ffb336 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4714
diff changeset
4349 interest.insert(*it2);
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4350 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4351
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4352 break; // done
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4353 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4354 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4355 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4356 current.swap(children);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4357 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4358 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4359 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4360 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4361 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4362 // Need to explore parents
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4363 std::string current = *it;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4364
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4365 for (;;)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4366 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4367 std::string parent;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4368 if (index.LookupParent(parent, current))
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4369 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4370 type = GetParentResourceType(type);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4371 if (type == level)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4372 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4373 interest.insert(parent);
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4374 break; // done
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4375 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4376 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4377 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4378 current = parent;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4379 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4380 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4381 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4382 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4383 break; // The resource has been deleted during the exploration
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4384 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4385 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4386 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4387 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4388 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4389 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4390 CLOG(INFO, HTTP) << "Unknown resource during a bulk content retrieval: " << *it;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4391 }
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4392 }
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4393
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4394 for (std::set<std::string>::const_iterator
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4395 it = interest.begin(); it != interest.end(); ++it)
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4396 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4397 if (true)
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4398 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4399 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4400 * EXPERIMENTAL VERSION
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4401 **/
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4402 Json::Value item;
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5713
diff changeset
4403 if (ExpandResource(item, OrthancRestApi::GetContext(call), level, *it, format, metadata))
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4404 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4405 answer.append(item);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4406 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4407 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4408 else
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4409 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4410 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4411 * VERSION IN ORTHANC <= 1.12.4
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4412 **/
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4413 Json::Value item;
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4414 std::set<DicomTag> emptyRequestedTags; // not supported for bulk content
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4415
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4416 if (OrthancRestApi::GetContext(call).ExpandResource(item, *it, level, format, emptyRequestedTags, true /* allowStorageAccess */))
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4417 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4418 if (metadata)
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4419 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4420 AddMetadata(item[METADATA], index, *it, level);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4421 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4422
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4423 answer.append(item);
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4424 }
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4425 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4426 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4427 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4428 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4429 {
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4430 // Simple case: We return the queried resources as such
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4431 std::list<std::string> resources;
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4432 SerializationToolbox::ReadListOfStrings(resources, request, "Resources");
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4433
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4434 for (std::list<std::string>::const_iterator
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4435 it = resources.begin(); it != resources.end(); ++it)
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4436 {
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4437 ResourceType level;
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4438 Json::Value item;
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
4439 std::set<DicomTag> emptyRequestedTags; // not supported for bulk content
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
4440
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4441 if (true)
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4442 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4443 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4444 * EXPERIMENTAL VERSION
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4445 **/
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4446 if (index.LookupResourceType(level, *it) &&
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5713
diff changeset
4447 ExpandResource(item, OrthancRestApi::GetContext(call), level, *it, format, metadata))
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4448 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4449 answer.append(item);
4714
8ffe2fdb541f added argument "Metadata" to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4699
diff changeset
4450 }
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4451 }
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4452 else
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4453 {
5708
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4454 /**
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4455 * VERSION IN ORTHANC <= 1.12.4
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4456 **/
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4457 if (index.LookupResourceType(level, *it) &&
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4458 OrthancRestApi::GetContext(call).ExpandResource(item, *it, level, format, emptyRequestedTags, true /* allowStorageAccess */))
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4459 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4460 if (metadata)
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4461 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4462 AddMetadata(item[METADATA], index, *it, level);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4463 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4464
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4465 answer.append(item);
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4466 }
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4467 else
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4468 {
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4469 CLOG(INFO, HTTP) << "Unknown resource during a bulk content retrieval: " << *it;
1891a8c2dbb4 added ExpandResource utility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5695
diff changeset
4470 }
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4471 }
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4472 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4473 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4474
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4475 call.GetOutput().AnswerJson(answer);
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4476 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4477 }
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4478
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4479
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4480 static void BulkDelete(RestApiPostCall& call)
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4481 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4482 if (call.IsDocumentation())
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4483 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4484 call.GetDocumentation()
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4485 .SetTag("System")
4879
c728d8f25e5a fix doc
Alain Mazy <am@osimis.io>
parents: 4858
diff changeset
4486 .SetSummary("Delete a set of resources")
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4487 .SetRequestField("Resources", RestApiCallDocumentation::Type_JsonListOfStrings,
4699
facea16b055b added the "Level" argument to "/tools/bulk-content"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4698
diff changeset
4488 "List of the Orthanc identifiers of the patients/studies/series/instances of interest.", true)
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4489 .SetDescription("Delete all the DICOM patients, studies, series or instances "
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4490 "whose identifiers are provided in the `Resources` field.");
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4491 return;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4492 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4493
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4494 ServerContext& context = OrthancRestApi::GetContext(call);
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4495
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4496 Json::Value request;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4497 if (!call.ParseJsonRequest(request) ||
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4498 request.type() != Json::objectValue)
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4499 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4500 throw OrthancException(ErrorCode_BadRequest,
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4501 "The body must contain a JSON object");
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4502 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4503 else
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4504 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4505 std::set<std::string> resources;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4506 SerializationToolbox::ReadSetOfStrings(resources, request, "Resources");
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4507
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4508 for (std::set<std::string>::const_iterator
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4509 it = resources.begin(); it != resources.end(); ++it)
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4510 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4511 ResourceType type;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4512 Json::Value remainingAncestor; // Unused
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4513
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4514 if (!context.GetIndex().LookupResourceType(type, *it) ||
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4515 !context.DeleteResource(remainingAncestor, *it, type))
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4516 {
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4517 CLOG(INFO, HTTP) << "Unknown resource during a bulk deletion: " << *it;
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4518 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4519 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4520
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4521 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4522 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4523 }
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4524
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4525
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4526 void OrthancRestApi::RegisterResources()
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4527 {
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4528 Register("/instances", ListResources<ResourceType_Instance>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4529 Register("/patients", ListResources<ResourceType_Patient>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4530 Register("/series", ListResources<ResourceType_Series>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4531 Register("/studies", ListResources<ResourceType_Study>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4532
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4533 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4534 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4535 Register("/instances/{id}", DeleteSingleResource<ResourceType_Instance>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4536 Register("/patients/{id}", DeleteSingleResource<ResourceType_Patient>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4537 Register("/series/{id}", DeleteSingleResource<ResourceType_Series>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4538 Register("/studies/{id}", DeleteSingleResource<ResourceType_Study>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4539
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4540 Register("/tools/bulk-delete", BulkDelete);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4541 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4542 else
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4543 {
5817
272b0d0eef38 ReadOnly mode continued
Alain Mazy <am@orthanc.team>
parents: 5804
diff changeset
4544 LOG(WARNING) << "READ-ONLY SYSTEM: deactivating DELETE routes";
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4545 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4546
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4547 Register("/instances/{id}", GetSingleResource<ResourceType_Instance>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4548 Register("/patients/{id}", GetSingleResource<ResourceType_Patient>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4549 Register("/series/{id}", GetSingleResource<ResourceType_Series>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4550 Register("/studies/{id}", GetSingleResource<ResourceType_Study>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4551
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4552 Register("/instances/{id}/statistics", GetResourceStatistics);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4553 Register("/patients/{id}/statistics", GetResourceStatistics);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4554 Register("/studies/{id}/statistics", GetResourceStatistics);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4555 Register("/series/{id}/statistics", GetResourceStatistics);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4556
964
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
4557 Register("/patients/{id}/shared-tags", GetSharedTags);
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
4558 Register("/series/{id}/shared-tags", GetSharedTags);
cc7a4ae474c1 simplify has a GET argument
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 963
diff changeset
4559 Register("/studies/{id}/shared-tags", GetSharedTags);
958
1fbe89dc18b5 extraction of the shared tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 874
diff changeset
4560
1276
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
4561 Register("/instances/{id}/module", GetModule<ResourceType_Instance, DicomModule_Instance>);
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
4562 Register("/patients/{id}/module", GetModule<ResourceType_Patient, DicomModule_Patient>);
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
4563 Register("/series/{id}/module", GetModule<ResourceType_Series, DicomModule_Series>);
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
4564 Register("/studies/{id}/module", GetModule<ResourceType_Study, DicomModule_Study>);
6164f7200c43 refactoring modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1201
diff changeset
4565 Register("/studies/{id}/module-patient", GetModule<ResourceType_Study, DicomModule_Patient>);
963
81134ea872ff retrieve values of modules
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 960
diff changeset
4566
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4567 Register("/instances/{id}/file", GetInstanceFile);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4568 Register("/instances/{id}/export", ExportInstanceFile);
4697
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
4569 Register("/instances/{id}/tags", GetInstanceTags);
569d9ef165b1 Added "short", "simplify" and/or "full" options to control the format of DICOM tags wherever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
4570 Register("/instances/{id}/simplified-tags", GetInstanceSimplifiedTags);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4571 Register("/instances/{id}/frames", ListFrames);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4572
4424
83371ccdfe80 openapi documentation is now completed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4422
diff changeset
4573 Register("/instances/{id}/frames/{frame}", RestApi::AutoListChildren);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4574 Register("/instances/{id}/frames/{frame}/preview", GetImage<ImageExtractionMode_Preview>);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
4575 Register("/instances/{id}/frames/{frame}/rendered", GetRenderedFrame);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4576 Register("/instances/{id}/frames/{frame}/image-uint8", GetImage<ImageExtractionMode_UInt8>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4577 Register("/instances/{id}/frames/{frame}/image-uint16", GetImage<ImageExtractionMode_UInt16>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4578 Register("/instances/{id}/frames/{frame}/image-int16", GetImage<ImageExtractionMode_Int16>);
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
4579 Register("/instances/{id}/frames/{frame}/matlab", GetMatlabImage);
2408
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
4580 Register("/instances/{id}/frames/{frame}/raw", GetRawFrame<false>);
26a0cc24d48d New URI: "/instances/.../frames/.../raw.gz" to compress raw frames using gzip
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
4581 Register("/instances/{id}/frames/{frame}/raw.gz", GetRawFrame<true>);
4902
df86d2505df8 Orthanc 1.9.8 is now known as Orthanc 1.10.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
4582 Register("/instances/{id}/frames/{frame}/numpy", GetNumpyFrame); // New in Orthanc 1.10.0
1556
b8dc2f855a83 Preview of PDF files encapsulated in DICOM from Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1555
diff changeset
4583 Register("/instances/{id}/pdf", ExtractPdf);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4584 Register("/instances/{id}/preview", GetImage<ImageExtractionMode_Preview>);
3683
12253ddefe5a skeleton for new route: /instances/{id}/rendered
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
4585 Register("/instances/{id}/rendered", GetRenderedFrame);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4586 Register("/instances/{id}/image-uint8", GetImage<ImageExtractionMode_UInt8>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4587 Register("/instances/{id}/image-uint16", GetImage<ImageExtractionMode_UInt16>);
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4588 Register("/instances/{id}/image-int16", GetImage<ImageExtractionMode_Int16>);
874
87791ebc1f50 download matlab images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 831
diff changeset
4589 Register("/instances/{id}/matlab", GetMatlabImage);
1831
3ae2ff249675 "/instances/.../header" to get the meta information (header) of the DICOM instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1826
diff changeset
4590 Register("/instances/{id}/header", GetInstanceHeader);
4902
df86d2505df8 Orthanc 1.9.8 is now known as Orthanc 1.10.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
4591 Register("/instances/{id}/numpy", GetNumpyInstance); // New in Orthanc 1.10.0
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4592
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4593 Register("/patients/{id}/protected", IsProtectedPatient);
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4594
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4595 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4596 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4597 Register("/patients/{id}/protected", SetPatientProtection);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4598 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4599 else
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4600 {
5817
272b0d0eef38 ReadOnly mode continued
Alain Mazy <am@orthanc.team>
parents: 5804
diff changeset
4601 LOG(WARNING) << "READ-ONLY SYSTEM: deactivating PUT /patients/{id}/protected route";
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4602 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4603
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4604
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4605 std::vector<std::string> resourceTypes;
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4606 resourceTypes.push_back("patients");
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4607 resourceTypes.push_back("studies");
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4608 resourceTypes.push_back("series");
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4609 resourceTypes.push_back("instances");
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4610
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4611 for (size_t i = 0; i < resourceTypes.size(); i++)
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4612 {
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4613 Register("/" + resourceTypes[i] + "/{id}/metadata", ListMetadata);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4614 Register("/" + resourceTypes[i] + "/{id}/metadata/{name}", DeleteMetadata);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4615 Register("/" + resourceTypes[i] + "/{id}/metadata/{name}", GetMetadata);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4616 Register("/" + resourceTypes[i] + "/{id}/metadata/{name}", SetMetadata);
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4617
5221
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
4618 // New in Orthanc 1.12.0
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
4619 Register("/" + resourceTypes[i] + "/{id}/labels", ListLabels);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
4620 Register("/" + resourceTypes[i] + "/{id}/labels/{label}", GetLabel);
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4621
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4622 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4623 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4624 Register("/" + resourceTypes[i] + "/{id}/labels/{label}", RemoveLabel);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4625 Register("/" + resourceTypes[i] + "/{id}/labels/{label}", AddLabel);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4626 }
5221
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5200
diff changeset
4627
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4628 Register("/" + resourceTypes[i] + "/{id}/attachments", ListAttachments);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4629 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}", GetAttachmentOperations);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4630 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/compressed-data", GetAttachmentData<0>);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4631 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/compressed-md5", GetAttachmentCompressedMD5);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4632 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/compressed-size", GetAttachmentCompressedSize);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4633 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/data", GetAttachmentData<1>);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4634 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/is-compressed", IsAttachmentCompressed);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4635 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/md5", GetAttachmentMD5);
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4636 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/size", GetAttachmentSize);
4883
504624b0a062 Added "/patients|studies|series|instances/{...}/attachments/{...}/info" route to retrieve the full information about an attachment (size, type, MD5 and UUID)
Alain Mazy <am@osimis.io>
parents: 4880
diff changeset
4637 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/info", GetAttachmentInfo);
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4638 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/verify-md5", VerifyAttachment);
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4639
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4640 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4641 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4642 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}", DeleteAttachment);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4643 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}", UploadAttachment);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4644 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/compress", ChangeAttachmentCompression<CompressionType_ZlibWithSize>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4645 Register("/" + resourceTypes[i] + "/{id}/attachments/{name}/uncompress", ChangeAttachmentCompression<CompressionType_None>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4646 }
4409
5784a9eaf502 cont openapi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4408
diff changeset
4647 }
782
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
4648
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4649 if (context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4650 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4651 LOG(WARNING) << "READ-ONLY SYSTEM: deactivating PUT, POST and DELETE attachments routes";
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4652 LOG(WARNING) << "READ-ONLY SYSTEM: deactivating PUT and DELETE labels routes";
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4653 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4654
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4655 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4656 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4657 Register("/tools/invalidate-tags", InvalidateTags);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4658 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4659
1139
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
4660 Register("/tools/lookup", Lookup);
1354
3dd494f201a1 ResourceFinder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1342
diff changeset
4661 Register("/tools/find", Find);
1139
f167b672db94 /tools/lookup URI to map DICOM UIDs to Orthanc identifiers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1054
diff changeset
4662
1140
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4663 Register("/patients/{id}/studies", GetChildResources<ResourceType_Patient, ResourceType_Study>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4664 Register("/patients/{id}/series", GetChildResources<ResourceType_Patient, ResourceType_Series>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4665 Register("/patients/{id}/instances", GetChildResources<ResourceType_Patient, ResourceType_Instance>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4666 Register("/studies/{id}/series", GetChildResources<ResourceType_Study, ResourceType_Series>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4667 Register("/studies/{id}/instances", GetChildResources<ResourceType_Study, ResourceType_Instance>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4668 Register("/series/{id}/instances", GetChildResources<ResourceType_Series, ResourceType_Instance>);
94c5f6623b3a URIs to get all the children of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1139
diff changeset
4669
1281
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4670 Register("/studies/{id}/patient", GetParentResource<ResourceType_Study, ResourceType_Patient>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4671 Register("/series/{id}/patient", GetParentResource<ResourceType_Series, ResourceType_Patient>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4672 Register("/series/{id}/study", GetParentResource<ResourceType_Series, ResourceType_Study>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4673 Register("/instances/{id}/patient", GetParentResource<ResourceType_Instance, ResourceType_Patient>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4674 Register("/instances/{id}/study", GetParentResource<ResourceType_Instance, ResourceType_Study>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4675 Register("/instances/{id}/series", GetParentResource<ResourceType_Instance, ResourceType_Series>);
8dac11c78d71 URIs to get all the parents of a given resource in a single REST call
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1276
diff changeset
4676
1166
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
4677 Register("/patients/{id}/instances-tags", GetChildInstancesTags);
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
4678 Register("/studies/{id}/instances-tags", GetChildInstancesTags);
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
4679 Register("/series/{id}/instances-tags", GetChildInstancesTags);
a921e3b5e763 bulk tags retrieval
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1146
diff changeset
4680
782
a60040857ce6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 751
diff changeset
4681 Register("/instances/{id}/content/*", GetRawContent);
1702
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4682
9980875edc7c started work on SliceOrdering
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
4683 Register("/series/{id}/ordered-slices", OrderSlices);
4902
df86d2505df8 Orthanc 1.9.8 is now known as Orthanc 1.10.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
4684 Register("/series/{id}/numpy", GetNumpySeries); // New in Orthanc 1.10.0
2209
e3fd5bc429a2 URI to reconstruct the main DICOM tags, the JSON summary and the metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
4685
5783
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4686 if (!context_.IsReadOnly())
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4687 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4688 Register("/patients/{id}/reconstruct", ReconstructResource<ResourceType_Patient>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4689 Register("/studies/{id}/reconstruct", ReconstructResource<ResourceType_Study>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4690 Register("/series/{id}/reconstruct", ReconstructResource<ResourceType_Series>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4691 Register("/instances/{id}/reconstruct", ReconstructResource<ResourceType_Instance>);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4692 Register("/tools/reconstruct", ReconstructAllResources);
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4693 }
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4694 else
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4695 {
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4696 LOG(WARNING) << "READ-ONLY SYSTEM: deactivating /reconstruct routes";
56352ae88120 wip: new ReadOnly configuration
Alain Mazy <am@orthanc.team>
parents: 5714
diff changeset
4697 }
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4661
diff changeset
4698
4698
d16c3c7f11ef new route "/tools/bulk-content" to get the content of a set of resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4697
diff changeset
4699 Register("/tools/bulk-content", BulkContent);
5804
25df40a274fd /changes: allowing filtering on multiple changes
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
4700 }
751
5197fd35333c refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4701 }