comparison OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp @ 3956:6e14f2da7c7e

integration transcoding->mainline
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 20 May 2020 16:42:44 +0200
parents 5fe8c6d3212e
children
comparison
equal deleted inserted replaced
3892:fe0e4ef52a72 3956:6e14f2da7c7e
110 } 110 }
111 } 111 }
112 112
113 113
114 static void AnonymizeOrModifyInstance(DicomModification& modification, 114 static void AnonymizeOrModifyInstance(DicomModification& modification,
115 RestApiPostCall& call) 115 RestApiPostCall& call,
116 { 116 bool transcode,
117 DicomTransferSyntax targetSyntax)
118 {
119 ServerContext& context = OrthancRestApi::GetContext(call);
117 std::string id = call.GetUriComponent("id", ""); 120 std::string id = call.GetUriComponent("id", "");
118 121
119 std::unique_ptr<ParsedDicomFile> modified; 122 std::unique_ptr<ParsedDicomFile> modified;
120 123
121 { 124 {
122 ServerContext::DicomCacheLocker locker(OrthancRestApi::GetContext(call), id); 125 ServerContext::DicomCacheLocker locker(context, id);
123 modified.reset(locker.GetDicom().Clone(true)); 126 modified.reset(locker.GetDicom().Clone(true));
124 } 127 }
125 128
126 modification.Apply(*modified); 129 modification.Apply(*modified);
127 modified->Answer(call.GetOutput()); 130
131 if (transcode)
132 {
133 IDicomTranscoder::DicomImage source;
134 source.AcquireParsed(*modified); // "modified" is invalid below this point
135
136 IDicomTranscoder::DicomImage transcoded;
137
138 std::set<DicomTransferSyntax> s;
139 s.insert(targetSyntax);
140
141 if (context.Transcode(transcoded, source, s, true))
142 {
143 call.GetOutput().AnswerBuffer(transcoded.GetBufferData(),
144 transcoded.GetBufferSize(), MimeType_Dicom);
145 }
146 else
147 {
148 throw OrthancException(ErrorCode_InternalError,
149 "Cannot transcode to transfer syntax: " +
150 std::string(GetTransferSyntaxUid(targetSyntax)));
151 }
152 }
153 else
154 {
155 modified->Answer(call.GetOutput());
156 }
128 } 157 }
129 158
130 159
131 static void ModifyInstance(RestApiPostCall& call) 160 static void ModifyInstance(RestApiPostCall& call)
132 { 161 {
151 else 180 else
152 { 181 {
153 modification.SetLevel(ResourceType_Instance); 182 modification.SetLevel(ResourceType_Instance);
154 } 183 }
155 184
156 AnonymizeOrModifyInstance(modification, call); 185 static const char* TRANSCODE = "Transcode";
186 if (request.isMember(TRANSCODE))
187 {
188 std::string s = SerializationToolbox::ReadString(request, TRANSCODE);
189
190 DicomTransferSyntax syntax;
191 if (LookupTransferSyntax(syntax, s))
192 {
193 AnonymizeOrModifyInstance(modification, call, true, syntax);
194 }
195 else
196 {
197 throw OrthancException(ErrorCode_ParameterOutOfRange, "Unknown transfer syntax: " + s);
198 }
199 }
200 else
201 {
202 AnonymizeOrModifyInstance(modification, call, false /* no transcoding */,
203 DicomTransferSyntax_LittleEndianImplicit /* unused */);
204 }
157 } 205 }
158 206
159 207
160 static void AnonymizeInstance(RestApiPostCall& call) 208 static void AnonymizeInstance(RestApiPostCall& call)
161 { 209 {
163 modification.SetAllowManualIdentifiers(true); 211 modification.SetAllowManualIdentifiers(true);
164 212
165 Json::Value request; 213 Json::Value request;
166 ParseAnonymizationRequest(request, modification, call); 214 ParseAnonymizationRequest(request, modification, call);
167 215
168 AnonymizeOrModifyInstance(modification, call); 216 AnonymizeOrModifyInstance(modification, call, false /* no transcoding */,
217 DicomTransferSyntax_LittleEndianImplicit /* unused */);
218 }
219
220
221 static void SetKeepSource(CleaningInstancesJob& job,
222 const Json::Value& body)
223 {
224 static const char* KEEP_SOURCE = "KeepSource";
225 if (body.isMember(KEEP_SOURCE))
226 {
227 job.SetKeepSource(SerializationToolbox::ReadBoolean(body, KEEP_SOURCE));
228 }
169 } 229 }
170 230
171 231
172 static void SubmitModificationJob(std::unique_ptr<DicomModification>& modification, 232 static void SubmitModificationJob(std::unique_ptr<DicomModification>& modification,
173 bool isAnonymization, 233 bool isAnonymization,
176 ResourceType level) 236 ResourceType level)
177 { 237 {
178 ServerContext& context = OrthancRestApi::GetContext(call); 238 ServerContext& context = OrthancRestApi::GetContext(call);
179 239
180 std::unique_ptr<ResourceModificationJob> job(new ResourceModificationJob(context)); 240 std::unique_ptr<ResourceModificationJob> job(new ResourceModificationJob(context));
181 241
182 job->SetModification(modification.release(), level, isAnonymization); 242 job->SetModification(modification.release(), level, isAnonymization);
183 job->SetOrigin(call); 243 job->SetOrigin(call);
244 SetKeepSource(*job, body);
245
246 static const char* TRANSCODE = "Transcode";
247 if (body.isMember(TRANSCODE))
248 {
249 job->SetTranscode(SerializationToolbox::ReadString(body, TRANSCODE));
250 }
184 251
185 context.AddChildInstances(*job, call.GetUriComponent("id", "")); 252 context.AddChildInstances(*job, call.GetUriComponent("id", ""));
253 job->AddTrailingStep();
186 254
187 OrthancRestApi::GetApi(call).SubmitCommandsJob 255 OrthancRestApi::GetApi(call).SubmitCommandsJob
188 (call, job.release(), true /* synchronous by default */, body); 256 (call, job.release(), true /* synchronous by default */, body);
189 } 257 }
190 258
225 DicomInstanceToStore toStore; 293 DicomInstanceToStore toStore;
226 toStore.SetOrigin(DicomInstanceOrigin::FromRest(call)); 294 toStore.SetOrigin(DicomInstanceOrigin::FromRest(call));
227 toStore.SetParsedDicomFile(dicom); 295 toStore.SetParsedDicomFile(dicom);
228 296
229 ServerContext& context = OrthancRestApi::GetContext(call); 297 ServerContext& context = OrthancRestApi::GetContext(call);
230 StoreStatus status = context.Store(id, toStore); 298 StoreStatus status = context.Store(id, toStore, StoreInstanceMode_Default);
231 299
232 if (status == StoreStatus_Failure) 300 if (status == StoreStatus_Failure)
233 { 301 {
234 throw OrthancException(ErrorCode_CannotStoreInstance); 302 throw OrthancException(ErrorCode_CannotStoreInstance);
235 } 303 }
236 304
237 if (sendAnswer) 305 if (sendAnswer)
238 { 306 {
239 OrthancRestApi::GetApi(call).AnswerStoredInstance(call, toStore, status); 307 OrthancRestApi::GetApi(call).AnswerStoredInstance(call, toStore, status, id);
240 } 308 }
241 } 309 }
242 310
243 311
244 static void CreateDicomV1(ParsedDicomFile& dicom, 312 static void CreateDicomV1(ParsedDicomFile& dicom,
676 744
677 for (size_t i = 0; i < series.size(); i++) 745 for (size_t i = 0; i < series.size(); i++)
678 { 746 {
679 job->AddSourceSeries(series[i]); 747 job->AddSourceSeries(series[i]);
680 } 748 }
681 749
682 job->AddTrailingStep(); 750 job->AddTrailingStep();
683 751
684 static const char* KEEP_SOURCE = "KeepSource"; 752 SetKeepSource(*job, request);
685 if (request.isMember(KEEP_SOURCE))
686 {
687 job->SetKeepSource(SerializationToolbox::ReadBoolean(request, KEEP_SOURCE));
688 }
689 753
690 static const char* REMOVE = "Remove"; 754 static const char* REMOVE = "Remove";
691 if (request.isMember(REMOVE)) 755 if (request.isMember(REMOVE))
692 { 756 {
693 if (request[REMOVE].type() != Json::arrayValue) 757 if (request[REMOVE].type() != Json::arrayValue)
762 job->AddSource(resources[i]); 826 job->AddSource(resources[i]);
763 } 827 }
764 828
765 job->AddTrailingStep(); 829 job->AddTrailingStep();
766 830
767 static const char* KEEP_SOURCE = "KeepSource"; 831 SetKeepSource(*job, request);
768 if (request.isMember(KEEP_SOURCE))
769 {
770 job->SetKeepSource(SerializationToolbox::ReadBoolean(request, KEEP_SOURCE));
771 }
772 832
773 OrthancRestApi::GetApi(call).SubmitCommandsJob 833 OrthancRestApi::GetApi(call).SubmitCommandsJob
774 (call, job.release(), true /* synchronous by default */, request); 834 (call, job.release(), true /* synchronous by default */, request);
775 } 835 }
776 836