comparison OrthancServer/Plugins/Engine/OrthancPlugins.cpp @ 4796:94616af363ec filter-store-instance

added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
author Alain Mazy <am@osimis.io>
date Fri, 01 Oct 2021 18:36:45 +0200
parents 9804d6490872
children 0bd98c52474b
comparison
equal deleted inserted replaced
4795:22d5b611dea7 4796:94616af363ec
77 #include "PluginsJob.h" 77 #include "PluginsJob.h"
78 78
79 #include <boost/regex.hpp> 79 #include <boost/regex.hpp>
80 #include <dcmtk/dcmdata/dcdict.h> 80 #include <dcmtk/dcmdata/dcdict.h>
81 #include <dcmtk/dcmdata/dcdicent.h> 81 #include <dcmtk/dcmdata/dcdicent.h>
82 #include <dcmtk/dcmnet/dimse.h>
82 83
83 #define ERROR_MESSAGE_64BIT "A 64bit version of the Orthanc API is necessary" 84 #define ERROR_MESSAGE_64BIT "A 64bit version of the Orthanc API is necessary"
84 85
85 86
86 namespace Orthanc 87 namespace Orthanc
1163 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; 1164 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks;
1164 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; 1165 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
1165 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 1166 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
1166 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; 1167 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
1167 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters; 1168 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters;
1169 typedef std::list<OrthancPluginIncomingCStoreInstanceFilter> IncomingCStoreInstanceFilters;
1168 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 1170 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
1169 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks; 1171 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks;
1170 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; 1172 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers;
1171 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; 1173 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks;
1172 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks; 1174 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks;
1185 JobsUnserializers jobsUnserializers_; 1187 JobsUnserializers jobsUnserializers_;
1186 _OrthancPluginMoveCallback moveCallbacks_; 1188 _OrthancPluginMoveCallback moveCallbacks_;
1187 IncomingHttpRequestFilters incomingHttpRequestFilters_; 1189 IncomingHttpRequestFilters incomingHttpRequestFilters_;
1188 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; 1190 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
1189 IncomingDicomInstanceFilters incomingDicomInstanceFilters_; 1191 IncomingDicomInstanceFilters incomingDicomInstanceFilters_;
1192 IncomingCStoreInstanceFilters incomingCStoreInstanceFilters_; // New in Orthanc 1.9.8
1190 RefreshMetricsCallbacks refreshMetricsCallbacks_; 1193 RefreshMetricsCallbacks refreshMetricsCallbacks_;
1191 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_; 1194 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_;
1192 std::unique_ptr<StorageAreaFactory> storageArea_; 1195 std::unique_ptr<StorageAreaFactory> storageArea_;
1193 std::set<std::string> authorizationTokens_; 1196 std::set<std::string> authorizationTokens_;
1194 1197
2259 } 2262 }
2260 2263
2261 return true; 2264 return true;
2262 } 2265 }
2263 2266
2264 2267
2268
2269 uint16_t OrthancPlugins::FilterIncomingCStoreInstance(const DicomInstanceToStore& instance,
2270 const Json::Value& simplified)
2271 {
2272 DicomInstanceFromCallback wrapped(instance);
2273
2274 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_);
2275
2276 for (PImpl::IncomingCStoreInstanceFilters::const_iterator
2277 filter = pimpl_->incomingCStoreInstanceFilters_.begin();
2278 filter != pimpl_->incomingCStoreInstanceFilters_.end(); ++filter)
2279 {
2280 int32_t filterResult = (*filter) (reinterpret_cast<const OrthancPluginDicomInstance*>(&wrapped));
2281
2282 if (filterResult >= 0 && filterResult <= 0xFFFF)
2283 {
2284 return static_cast<uint16_t>(filterResult);
2285 }
2286 else
2287 {
2288 // The callback is only allowed to answer uint16_t
2289 throw OrthancException(ErrorCode_Plugin);
2290 }
2291 }
2292
2293 return STATUS_Success;
2294 }
2295
2296
2265 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType, 2297 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType,
2266 OrthancPluginResourceType resourceType, 2298 OrthancPluginResourceType resourceType,
2267 const char* resource) 2299 const char* resource)
2268 { 2300 {
2269 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_); 2301 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_);
2476 2508
2477 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming DICOM instances"; 2509 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming DICOM instances";
2478 pimpl_->incomingDicomInstanceFilters_.push_back(p.callback); 2510 pimpl_->incomingDicomInstanceFilters_.push_back(p.callback);
2479 } 2511 }
2480 2512
2513
2514 void OrthancPlugins::RegisterIncomingCStoreInstanceFilter(const void* parameters)
2515 {
2516 const _OrthancPluginIncomingCStoreInstanceFilter& p =
2517 *reinterpret_cast<const _OrthancPluginIncomingCStoreInstanceFilter*>(parameters);
2518
2519 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming C-Store DICOM instances";
2520 pimpl_->incomingCStoreInstanceFilters_.push_back(p.callback);
2521 }
2522
2523
2524 void RegisterIncomingCStoreInstanceFilter(const void* parameters);
2481 2525
2482 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters) 2526 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters)
2483 { 2527 {
2484 const _OrthancPluginRegisterRefreshMetricsCallback& p = 2528 const _OrthancPluginRegisterRefreshMetricsCallback& p =
2485 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters); 2529 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters);