comparison OrthancServer/OrthancFindRequestHandler.cpp @ 2218:3eefb84ac0bd

dynamically fix outgoing C-Find requests using "OutgoingFindRequestFilter()"
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 13 Dec 2016 10:27:20 +0100
parents 90ea60bee5ff
children e7beca979562
comparison
equal deleted inserted replaced
2217:4f39ab2cb453 2218:3eefb84ac0bd
484 const DicomMap& source, 484 const DicomMap& source,
485 const std::string& remoteIp, 485 const std::string& remoteIp,
486 const std::string& remoteAet, 486 const std::string& remoteAet,
487 const std::string& calledAet) 487 const std::string& calledAet)
488 { 488 {
489 Json::Value output; 489 LuaScripting::Locker locker(context_.GetLua());
490 490 static const char* CALLBACK = "IncomingFindRequestFilter";
491 {
492 LuaScripting::Locker locker(context_.GetLua());
493 static const char* NAME = "IncomingFindRequestFilter";
494 491
495 if (!locker.GetLua().IsExistingFunction(NAME)) 492 if (!locker.GetLua().IsExistingFunction(CALLBACK))
496 { 493 {
497 return false; 494 return false;
498 } 495 }
499 496 else
500 Json::Value tmp = Json::objectValue; 497 {
501 DicomArray a(source);
502
503 for (size_t i = 0; i < a.GetSize(); i++)
504 {
505 const DicomValue& v = a.GetElement(i).GetValue();
506 std::string s = (v.IsNull() || v.IsBinary()) ? "" : v.GetContent();
507 tmp[a.GetElement(i).GetTag().Format()] = s;
508 }
509
510 Json::Value origin = Json::objectValue; 498 Json::Value origin = Json::objectValue;
511 origin["RemoteIp"] = remoteIp; 499 origin["RemoteIp"] = remoteIp;
512 origin["RemoteAet"] = remoteAet; 500 origin["RemoteAet"] = remoteAet;
513 origin["CalledAet"] = calledAet; 501 origin["CalledAet"] = calledAet;
514 502
515 LuaFunctionCall call(locker.GetLua(), NAME); 503 LuaFunctionCall call(locker.GetLua(), CALLBACK);
516 call.PushJson(tmp); 504 call.PushDicom(source);
517 call.PushJson(origin); 505 call.PushJson(origin);
518 506 FromDcmtkBridge::ExecuteToDicom(target, call);
519 call.ExecuteToJson(output, true); 507
520 } 508 return true;
521 509 }
522 // The Lua context is released at this point
523
524 if (output.type() != Json::objectValue)
525 {
526 LOG(ERROR) << "Lua: IncomingFindRequestFilter must return a table";
527 throw OrthancException(ErrorCode_LuaBadOutput);
528 }
529
530 Json::Value::Members members = output.getMemberNames();
531
532 for (size_t i = 0; i < members.size(); i++)
533 {
534 if (output[members[i]].type() != Json::stringValue)
535 {
536 LOG(ERROR) << "Lua: IncomingFindRequestFilter must return a table mapping names of DICOM tags to strings";
537 throw OrthancException(ErrorCode_LuaBadOutput);
538 }
539
540 DicomTag tag(FromDcmtkBridge::ParseTag(members[i]));
541 target.SetValue(tag, output[members[i]].asString(), false);
542 }
543
544 return true;
545 } 510 }
546 511
547 512
548 void OrthancFindRequestHandler::Handle(DicomFindAnswers& answers, 513 void OrthancFindRequestHandler::Handle(DicomFindAnswers& answers,
549 const DicomMap& input, 514 const DicomMap& input,
700 complete = false; 665 complete = false;
701 break; 666 break;
702 } 667 }
703 else 668 else
704 { 669 {
705 std::auto_ptr<DicomMap> counters(ComputeCounters(context_, instances[i], level, input)); 670 std::auto_ptr<DicomMap> counters(ComputeCounters(context_, instances[i], level, *filteredInput));
706 AddAnswer(answers, dicom, query, sequencesToReturn, counters.get()); 671 AddAnswer(answers, dicom, query, sequencesToReturn, counters.get());
707 } 672 }
708 } 673 }
709 } 674 }
710 675