Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 1427:d710ea64f0fd
Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 29 Jun 2015 12:42:54 +0200 |
parents | b22ba8c5edbe |
children | 0a355eeeb351 |
comparison
equal
deleted
inserted
replaced
1426:2cf9a12c995a | 1427:d710ea64f0fd |
---|---|
52 | 52 |
53 static void DicomEcho(RestApiPostCall& call) | 53 static void DicomEcho(RestApiPostCall& call) |
54 { | 54 { |
55 ServerContext& context = OrthancRestApi::GetContext(call); | 55 ServerContext& context = OrthancRestApi::GetContext(call); |
56 | 56 |
57 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
57 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 58 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
58 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 59 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
59 | 60 |
60 try | 61 try |
61 { | 62 { |
62 if (locker.GetConnection().Echo()) | 63 if (locker.GetConnection().Echo()) |
63 { | 64 { |
171 if (!MergeQueryAndTemplate(fields, call.GetPostBody())) | 172 if (!MergeQueryAndTemplate(fields, call.GetPostBody())) |
172 { | 173 { |
173 return; | 174 return; |
174 } | 175 } |
175 | 176 |
177 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
176 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 178 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
177 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 179 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
178 | 180 |
179 DicomFindAnswers answers; | 181 DicomFindAnswers answers; |
180 FindPatient(answers, locker.GetConnection(), fields); | 182 FindPatient(answers, locker.GetConnection(), fields); |
181 | 183 |
182 Json::Value result; | 184 Json::Value result; |
200 fields.GetValue(DICOM_TAG_PATIENT_ID).AsString().size() <= 2) | 202 fields.GetValue(DICOM_TAG_PATIENT_ID).AsString().size() <= 2) |
201 { | 203 { |
202 return; | 204 return; |
203 } | 205 } |
204 | 206 |
207 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
205 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 208 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
206 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 209 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
207 | 210 |
208 DicomFindAnswers answers; | 211 DicomFindAnswers answers; |
209 FindStudy(answers, locker.GetConnection(), fields); | 212 FindStudy(answers, locker.GetConnection(), fields); |
210 | 213 |
211 Json::Value result; | 214 Json::Value result; |
230 fields.GetValue(DICOM_TAG_STUDY_INSTANCE_UID).AsString().size() <= 2) | 233 fields.GetValue(DICOM_TAG_STUDY_INSTANCE_UID).AsString().size() <= 2) |
231 { | 234 { |
232 return; | 235 return; |
233 } | 236 } |
234 | 237 |
238 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
235 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 239 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
236 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 240 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
237 | 241 |
238 DicomFindAnswers answers; | 242 DicomFindAnswers answers; |
239 FindSeries(answers, locker.GetConnection(), fields); | 243 FindSeries(answers, locker.GetConnection(), fields); |
240 | 244 |
241 Json::Value result; | 245 Json::Value result; |
261 fields.GetValue(DICOM_TAG_SERIES_INSTANCE_UID).AsString().size() <= 2) | 265 fields.GetValue(DICOM_TAG_SERIES_INSTANCE_UID).AsString().size() <= 2) |
262 { | 266 { |
263 return; | 267 return; |
264 } | 268 } |
265 | 269 |
270 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
266 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 271 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
267 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 272 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
268 | 273 |
269 DicomFindAnswers answers; | 274 DicomFindAnswers answers; |
270 FindInstance(answers, locker.GetConnection(), fields); | 275 FindInstance(answers, locker.GetConnection(), fields); |
271 | 276 |
272 Json::Value result; | 277 Json::Value result; |
285 if (!MergeQueryAndTemplate(m, call.GetPostBody())) | 290 if (!MergeQueryAndTemplate(m, call.GetPostBody())) |
286 { | 291 { |
287 return; | 292 return; |
288 } | 293 } |
289 | 294 |
295 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
290 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); | 296 RemoteModalityParameters remote = Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); |
291 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), remote); | 297 ReusableDicomUserConnection::Locker locker(context.GetReusableDicomUserConnection(), localAet, remote); |
292 | 298 |
293 DicomFindAnswers patients; | 299 DicomFindAnswers patients; |
294 FindPatient(patients, locker.GetConnection(), m); | 300 FindPatient(patients, locker.GetConnection(), m); |
295 | 301 |
296 // Loop over the found patients | 302 // Loop over the found patients |
545 | 551 |
546 /*************************************************************************** | 552 /*************************************************************************** |
547 * DICOM C-Store SCU | 553 * DICOM C-Store SCU |
548 ***************************************************************************/ | 554 ***************************************************************************/ |
549 | 555 |
550 static bool GetInstancesToExport(std::list<std::string>& instances, | 556 static bool GetInstancesToExport(Json::Value& request, |
557 std::list<std::string>& instances, | |
551 const std::string& remote, | 558 const std::string& remote, |
552 RestApiPostCall& call) | 559 RestApiPostCall& call) |
553 { | 560 { |
554 ServerContext& context = OrthancRestApi::GetContext(call); | 561 ServerContext& context = OrthancRestApi::GetContext(call); |
555 | 562 |
556 std::string stripped = Toolbox::StripSpaces(call.GetPostBody()); | 563 std::string stripped = Toolbox::StripSpaces(call.GetPostBody()); |
557 | 564 |
558 Json::Value request; | 565 request = Json::objectValue; |
559 if (Toolbox::IsSHA1(stripped)) | 566 if (Toolbox::IsSHA1(stripped)) |
560 { | 567 { |
561 // This is for compatibility with Orthanc <= 0.5.1. | 568 // This is for compatibility with Orthanc <= 0.5.1. |
562 request = stripped; | 569 request = stripped; |
563 } | 570 } |
573 { | 580 { |
574 context.GetIndex().LogExportedResource(request.asString(), remote); | 581 context.GetIndex().LogExportedResource(request.asString(), remote); |
575 } | 582 } |
576 | 583 |
577 context.GetIndex().GetChildInstances(instances, request.asString()); | 584 context.GetIndex().GetChildInstances(instances, request.asString()); |
578 } | 585 return true; |
579 else if (request.isArray()) | 586 } |
580 { | 587 |
581 for (Json::Value::ArrayIndex i = 0; i < request.size(); i++) | 588 const Json::Value* resources; |
582 { | 589 if (request.isArray()) |
583 if (!request[i].isString()) | 590 { |
584 { | 591 resources = &request; |
585 return false; | 592 } |
586 } | 593 else |
587 | 594 { |
588 std::string stripped = Toolbox::StripSpaces(request[i].asString()); | 595 if (request.type() != Json::objectValue || |
589 if (!Toolbox::IsSHA1(stripped)) | 596 !request.isMember("Resources")) |
590 { | 597 { |
591 return false; | 598 return false; |
592 } | 599 } |
593 | 600 |
594 if (Configuration::GetGlobalBoolParameter("LogExportedResources", true)) | 601 resources = &request["Resources"]; |
595 { | 602 if (!resources->isArray()) |
596 context.GetIndex().LogExportedResource(stripped, remote); | 603 { |
597 } | 604 return false; |
605 } | |
606 } | |
607 | |
608 for (Json::Value::ArrayIndex i = 0; i < resources->size(); i++) | |
609 { | |
610 if (!(*resources) [i].isString()) | |
611 { | |
612 return false; | |
613 } | |
614 | |
615 std::string stripped = Toolbox::StripSpaces((*resources) [i].asString()); | |
616 if (!Toolbox::IsSHA1(stripped)) | |
617 { | |
618 return false; | |
619 } | |
620 | |
621 if (Configuration::GetGlobalBoolParameter("LogExportedResources", true)) | |
622 { | |
623 context.GetIndex().LogExportedResource(stripped, remote); | |
624 } | |
598 | 625 |
599 std::list<std::string> tmp; | 626 std::list<std::string> tmp; |
600 context.GetIndex().GetChildInstances(tmp, stripped); | 627 context.GetIndex().GetChildInstances(tmp, stripped); |
601 | 628 |
602 for (std::list<std::string>::const_iterator | 629 for (std::list<std::string>::const_iterator |
603 it = tmp.begin(); it != tmp.end(); ++it) | 630 it = tmp.begin(); it != tmp.end(); ++it) |
604 { | 631 { |
605 instances.push_back(*it); | 632 instances.push_back(*it); |
606 } | 633 } |
607 } | |
608 } | |
609 else | |
610 { | |
611 // Neither a string, nor a list of strings. Bad request. | |
612 return false; | |
613 } | 634 } |
614 | 635 |
615 return true; | 636 return true; |
616 } | 637 } |
617 | 638 |
620 { | 641 { |
621 ServerContext& context = OrthancRestApi::GetContext(call); | 642 ServerContext& context = OrthancRestApi::GetContext(call); |
622 | 643 |
623 std::string remote = call.GetUriComponent("id", ""); | 644 std::string remote = call.GetUriComponent("id", ""); |
624 | 645 |
646 Json::Value request; | |
625 std::list<std::string> instances; | 647 std::list<std::string> instances; |
626 if (!GetInstancesToExport(instances, remote, call)) | 648 if (!GetInstancesToExport(request, instances, remote, call)) |
627 { | 649 { |
628 return; | 650 return; |
651 } | |
652 | |
653 std::string localAet = context.GetDefaultLocalApplicationEntityTitle(); | |
654 if (request.isMember("LocalAet")) | |
655 { | |
656 localAet = request["LocalAet"].asString(); | |
629 } | 657 } |
630 | 658 |
631 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote); | 659 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName(remote); |
632 | 660 |
633 ServerJob job; | 661 ServerJob job; |
634 for (std::list<std::string>::const_iterator | 662 for (std::list<std::string>::const_iterator |
635 it = instances.begin(); it != instances.end(); ++it) | 663 it = instances.begin(); it != instances.end(); ++it) |
636 { | 664 { |
637 job.AddCommand(new StoreScuCommand(context, p, false)).AddInput(*it); | 665 job.AddCommand(new StoreScuCommand(context, localAet, p, false)).AddInput(*it); |
638 } | 666 } |
639 | 667 |
640 job.SetDescription("HTTP request: Store-SCU to peer \"" + remote + "\""); | 668 job.SetDescription("HTTP request: Store-SCU to peer \"" + remote + "\""); |
641 | 669 |
642 if (context.GetScheduler().SubmitAndWait(job)) | 670 if (context.GetScheduler().SubmitAndWait(job)) |
692 { | 720 { |
693 ServerContext& context = OrthancRestApi::GetContext(call); | 721 ServerContext& context = OrthancRestApi::GetContext(call); |
694 | 722 |
695 std::string remote = call.GetUriComponent("id", ""); | 723 std::string remote = call.GetUriComponent("id", ""); |
696 | 724 |
725 Json::Value request; | |
697 std::list<std::string> instances; | 726 std::list<std::string> instances; |
698 if (!GetInstancesToExport(instances, remote, call)) | 727 if (!GetInstancesToExport(request, instances, remote, call)) |
699 { | 728 { |
700 return; | 729 return; |
701 } | 730 } |
702 | 731 |
703 OrthancPeerParameters peer; | 732 OrthancPeerParameters peer; |