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;