comparison Plugins/Engine/OrthancPlugins.cpp @ 3847:1491d501836a

actual implementation of OrthancPluginRegisterIncomingDicomInstanceFilter()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 17 Apr 2020 16:21:50 +0200
parents e7003b2203a7
children fe0e4ef52a72 8f7ad4989fec
comparison
equal deleted inserted replaced
3846:67e765d51bdf 3847:1491d501836a
823 typedef std::list<ChunkedRestCallback*> ChunkedRestCallbacks; 823 typedef std::list<ChunkedRestCallback*> ChunkedRestCallbacks;
824 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; 824 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks;
825 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; 825 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
826 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 826 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
827 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; 827 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
828 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters;
828 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 829 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
829 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; 830 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers;
830 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; 831 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks;
831 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks; 832 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks;
832 typedef std::map<Property, std::string> Properties; 833 typedef std::map<Property, std::string> Properties;
842 DecodeImageCallbacks decodeImageCallbacks_; 843 DecodeImageCallbacks decodeImageCallbacks_;
843 JobsUnserializers jobsUnserializers_; 844 JobsUnserializers jobsUnserializers_;
844 _OrthancPluginMoveCallback moveCallbacks_; 845 _OrthancPluginMoveCallback moveCallbacks_;
845 IncomingHttpRequestFilters incomingHttpRequestFilters_; 846 IncomingHttpRequestFilters incomingHttpRequestFilters_;
846 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; 847 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
848 IncomingDicomInstanceFilters incomingDicomInstanceFilters_;
847 RefreshMetricsCallbacks refreshMetricsCallbacks_; 849 RefreshMetricsCallbacks refreshMetricsCallbacks_;
848 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_; 850 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_;
849 std::unique_ptr<StorageAreaFactory> storageArea_; 851 std::unique_ptr<StorageAreaFactory> storageArea_;
850 852
851 boost::recursive_mutex restCallbackMutex_; 853 boost::recursive_mutex restCallbackMutex_;
1780 } 1782 }
1781 } 1783 }
1782 } 1784 }
1783 1785
1784 1786
1785 1787 bool OrthancPlugins::FilterIncomingInstance(const DicomInstanceToStore& instance,
1788 const Json::Value& simplified)
1789 {
1790 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_);
1791
1792 for (PImpl::IncomingDicomInstanceFilters::const_iterator
1793 filter = pimpl_->incomingDicomInstanceFilters_.begin();
1794 filter != pimpl_->incomingDicomInstanceFilters_.end(); ++filter)
1795 {
1796 int32_t allowed = (*filter) (
1797 reinterpret_cast<const OrthancPluginDicomInstance*>(&instance));
1798
1799 if (allowed == 0)
1800 {
1801 return false;
1802 }
1803 else if (allowed != 1)
1804 {
1805 // The callback is only allowed to answer 0 or 1
1806 throw OrthancException(ErrorCode_Plugin);
1807 }
1808 }
1809
1810 return true;
1811 }
1812
1813
1786 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType, 1814 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType,
1787 OrthancPluginResourceType resourceType, 1815 OrthancPluginResourceType resourceType,
1788 const char* resource) 1816 const char* resource)
1789 { 1817 {
1790 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_); 1818 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_);
1962 const _OrthancPluginIncomingHttpRequestFilter2& p = 1990 const _OrthancPluginIncomingHttpRequestFilter2& p =
1963 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters); 1991 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters);
1964 1992
1965 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests"; 1993 LOG(INFO) << "Plugin has registered a callback to filter incoming HTTP requests";
1966 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback); 1994 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback);
1995 }
1996
1997
1998 void OrthancPlugins::RegisterIncomingDicomInstanceFilter(const void* parameters)
1999 {
2000 const _OrthancPluginIncomingDicomInstanceFilter& p =
2001 *reinterpret_cast<const _OrthancPluginIncomingDicomInstanceFilter*>(parameters);
2002
2003 LOG(INFO) << "Plugin has registered a callback to filter incoming DICOM instances";
2004 pimpl_->incomingDicomInstanceFilters_.push_back(p.callback);
1967 } 2005 }
1968 2006
1969 2007
1970 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters) 2008 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters)
1971 { 2009 {
2417 const void* parameters) 2455 const void* parameters)
2418 { 2456 {
2419 const _OrthancPluginAccessDicomInstance& p = 2457 const _OrthancPluginAccessDicomInstance& p =
2420 *reinterpret_cast<const _OrthancPluginAccessDicomInstance*>(parameters); 2458 *reinterpret_cast<const _OrthancPluginAccessDicomInstance*>(parameters);
2421 2459
2422 DicomInstanceToStore& instance = 2460 const DicomInstanceToStore& instance =
2423 *reinterpret_cast<DicomInstanceToStore*>(p.instance); 2461 *reinterpret_cast<const DicomInstanceToStore*>(p.instance);
2424 2462
2425 switch (service) 2463 switch (service)
2426 { 2464 {
2427 case _OrthancPluginService_GetInstanceRemoteAet: 2465 case _OrthancPluginService_GetInstanceRemoteAet:
2428 *p.resultString = instance.GetOrigin().GetRemoteAetC(); 2466 *p.resultString = instance.GetOrigin().GetRemoteAetC();
2465 return; 2503 return;
2466 } 2504 }
2467 2505
2468 case _OrthancPluginService_GetInstanceOrigin: // New in Orthanc 0.9.5 2506 case _OrthancPluginService_GetInstanceOrigin: // New in Orthanc 0.9.5
2469 *p.resultOrigin = Plugins::Convert(instance.GetOrigin().GetRequestOrigin()); 2507 *p.resultOrigin = Plugins::Convert(instance.GetOrigin().GetRequestOrigin());
2508 return;
2509
2510 case _OrthancPluginService_GetInstanceTransferSyntaxUid: // New in Orthanc 1.6.1
2511 {
2512 std::string s;
2513 if (!instance.LookupTransferSyntax(s))
2514 {
2515 s.clear();
2516 }
2517
2518 *p.resultStringToFree = CopyString(s);
2519 return;
2520 }
2521
2522 case _OrthancPluginService_HasInstancePixelData: // New in Orthanc 1.6.1
2523 *p.resultInt64 = instance.HasPixelData();
2470 return; 2524 return;
2471 2525
2472 default: 2526 default:
2473 throw OrthancException(ErrorCode_InternalError); 2527 throw OrthancException(ErrorCode_InternalError);
2474 } 2528 }
3418 case _OrthancPluginService_GetInstanceJson: 3472 case _OrthancPluginService_GetInstanceJson:
3419 case _OrthancPluginService_GetInstanceSimplifiedJson: 3473 case _OrthancPluginService_GetInstanceSimplifiedJson:
3420 case _OrthancPluginService_HasInstanceMetadata: 3474 case _OrthancPluginService_HasInstanceMetadata:
3421 case _OrthancPluginService_GetInstanceMetadata: 3475 case _OrthancPluginService_GetInstanceMetadata:
3422 case _OrthancPluginService_GetInstanceOrigin: 3476 case _OrthancPluginService_GetInstanceOrigin:
3477 case _OrthancPluginService_GetInstanceTransferSyntaxUid:
3478 case _OrthancPluginService_HasInstancePixelData:
3423 AccessDicomInstance(service, parameters); 3479 AccessDicomInstance(service, parameters);
3424 return true; 3480 return true;
3425 3481
3426 case _OrthancPluginService_SetGlobalProperty: 3482 case _OrthancPluginService_SetGlobalProperty:
3427 { 3483 {
4032 4088
4033 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2: 4089 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
4034 RegisterIncomingHttpRequestFilter2(parameters); 4090 RegisterIncomingHttpRequestFilter2(parameters);
4035 return true; 4091 return true;
4036 4092
4093 case _OrthancPluginService_RegisterIncomingDicomInstanceFilter:
4094 RegisterIncomingDicomInstanceFilter(parameters);
4095 return true;
4096
4037 case _OrthancPluginService_RegisterRefreshMetricsCallback: 4097 case _OrthancPluginService_RegisterRefreshMetricsCallback:
4038 RegisterRefreshMetricsCallback(parameters); 4098 RegisterRefreshMetricsCallback(parameters);
4039 return true; 4099 return true;
4040 4100
4041 case _OrthancPluginService_RegisterStorageCommitmentScpCallback: 4101 case _OrthancPluginService_RegisterStorageCommitmentScpCallback:
4475 { 4535 {
4476 getKeys[i] = getArguments[i].first.c_str(); 4536 getKeys[i] = getArguments[i].first.c_str();
4477 getValues[i] = getArguments[i].second.c_str(); 4537 getValues[i] = getArguments[i].second.c_str();
4478 } 4538 }
4479 4539
4480 // Improved callback with support for GET arguments, since Orthanc 1.3.0 4540 {
4481 for (PImpl::IncomingHttpRequestFilters2::const_iterator 4541 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_);
4482 filter = pimpl_->incomingHttpRequestFilters2_.begin(); 4542
4483 filter != pimpl_->incomingHttpRequestFilters2_.end(); ++filter) 4543 // Improved callback with support for GET arguments, since Orthanc 1.3.0
4484 { 4544 for (PImpl::IncomingHttpRequestFilters2::const_iterator
4485 int32_t allowed = (*filter) (cMethod, uri, ip, 4545 filter = pimpl_->incomingHttpRequestFilters2_.begin();
4486 httpKeys.size(), 4546 filter != pimpl_->incomingHttpRequestFilters2_.end(); ++filter)
4487 httpKeys.empty() ? NULL : &httpKeys[0], 4547 {
4488 httpValues.empty() ? NULL : &httpValues[0], 4548 int32_t allowed = (*filter) (cMethod, uri, ip,
4489 getKeys.size(), 4549 httpKeys.size(),
4490 getKeys.empty() ? NULL : &getKeys[0], 4550 httpKeys.empty() ? NULL : &httpKeys[0],
4491 getValues.empty() ? NULL : &getValues[0]); 4551 httpValues.empty() ? NULL : &httpValues[0],
4492 4552 getKeys.size(),
4493 if (allowed == 0) 4553 getKeys.empty() ? NULL : &getKeys[0],
4494 { 4554 getValues.empty() ? NULL : &getValues[0]);
4495 return false; 4555
4496 } 4556 if (allowed == 0)
4497 else if (allowed != 1) 4557 {
4498 { 4558 return false;
4499 // The callback is only allowed to answer 0 or 1 4559 }
4500 throw OrthancException(ErrorCode_Plugin); 4560 else if (allowed != 1)
4501 } 4561 {
4502 } 4562 // The callback is only allowed to answer 0 or 1
4503 4563 throw OrthancException(ErrorCode_Plugin);
4504 for (PImpl::IncomingHttpRequestFilters::const_iterator 4564 }
4505 filter = pimpl_->incomingHttpRequestFilters_.begin(); 4565 }
4506 filter != pimpl_->incomingHttpRequestFilters_.end(); ++filter) 4566
4507 { 4567 for (PImpl::IncomingHttpRequestFilters::const_iterator
4508 int32_t allowed = (*filter) (cMethod, uri, ip, httpKeys.size(), 4568 filter = pimpl_->incomingHttpRequestFilters_.begin();
4509 httpKeys.empty() ? NULL : &httpKeys[0], 4569 filter != pimpl_->incomingHttpRequestFilters_.end(); ++filter)
4510 httpValues.empty() ? NULL : &httpValues[0]); 4570 {
4511 4571 int32_t allowed = (*filter) (cMethod, uri, ip, httpKeys.size(),
4512 if (allowed == 0) 4572 httpKeys.empty() ? NULL : &httpKeys[0],
4513 { 4573 httpValues.empty() ? NULL : &httpValues[0]);
4514 return false; 4574
4515 } 4575 if (allowed == 0)
4516 else if (allowed != 1) 4576 {
4517 { 4577 return false;
4518 // The callback is only allowed to answer 0 or 1 4578 }
4519 throw OrthancException(ErrorCode_Plugin); 4579 else if (allowed != 1)
4580 {
4581 // The callback is only allowed to answer 0 or 1
4582 throw OrthancException(ErrorCode_Plugin);
4583 }
4520 } 4584 }
4521 } 4585 }
4522 4586
4523 return true; 4587 return true;
4524 } 4588 }