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