Mercurial > hg > orthanc
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 |