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