comparison OrthancServer/Plugins/Engine/OrthancPlugins.cpp @ 4845:02d77189d8ba received-instance-callback

added ReceivedInstanceCallback + sample C++ plugin
author Alain Mazy <am@osimis.io>
date Thu, 09 Dec 2021 17:22:40 +0100
parents b55babf15e4f
children 5ec96ada5a53
comparison
equal deleted inserted replaced
4844:55e8fb8e8028 4845:02d77189d8ba
1166 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; 1166 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
1167 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 1167 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
1168 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; 1168 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
1169 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters; 1169 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters;
1170 typedef std::list<OrthancPluginIncomingCStoreInstanceFilter> IncomingCStoreInstanceFilters; 1170 typedef std::list<OrthancPluginIncomingCStoreInstanceFilter> IncomingCStoreInstanceFilters;
1171 typedef std::list<OrthancPluginReceivedInstanceCallback> ReceivedInstanceCallbacks;
1171 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 1172 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
1172 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks; 1173 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks;
1173 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; 1174 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers;
1174 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; 1175 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks;
1175 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks; 1176 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks;
1189 _OrthancPluginMoveCallback moveCallbacks_; 1190 _OrthancPluginMoveCallback moveCallbacks_;
1190 IncomingHttpRequestFilters incomingHttpRequestFilters_; 1191 IncomingHttpRequestFilters incomingHttpRequestFilters_;
1191 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; 1192 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
1192 IncomingDicomInstanceFilters incomingDicomInstanceFilters_; 1193 IncomingDicomInstanceFilters incomingDicomInstanceFilters_;
1193 IncomingCStoreInstanceFilters incomingCStoreInstanceFilters_; // New in Orthanc 1.9.8 1194 IncomingCStoreInstanceFilters incomingCStoreInstanceFilters_; // New in Orthanc 1.9.8
1195 ReceivedInstanceCallbacks receivedInstanceCallbacks_; // New in Orthanc 1.9.8
1194 RefreshMetricsCallbacks refreshMetricsCallbacks_; 1196 RefreshMetricsCallbacks refreshMetricsCallbacks_;
1195 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_; 1197 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_;
1196 std::unique_ptr<StorageAreaFactory> storageArea_; 1198 std::unique_ptr<StorageAreaFactory> storageArea_;
1197 std::set<std::string> authorizationTokens_; 1199 std::set<std::string> authorizationTokens_;
1198 1200
2293 2295
2294 return STATUS_Success; 2296 return STATUS_Success;
2295 } 2297 }
2296 2298
2297 2299
2300 bool OrthancPlugins::ApplyReceivedInstanceCallbacks(const void* receivedDicom,
2301 size_t receivedDicomSize,
2302 void** modifiedDicomBufferData,
2303 size_t& modifiedDicomBufferSize)
2304 {
2305 uint64_t modifiedDicomSize64 = 0;
2306 *modifiedDicomBufferData = NULL;
2307
2308 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_);
2309
2310 for (PImpl::ReceivedInstanceCallbacks::const_iterator
2311 callback = pimpl_->receivedInstanceCallbacks_.begin();
2312 callback != pimpl_->receivedInstanceCallbacks_.end(); ++callback)
2313 {
2314 OrthancPluginReceivedInstanceCallbackResult callbackResult = (*callback) (receivedDicom,
2315 receivedDicomSize,
2316 modifiedDicomBufferData,
2317 &modifiedDicomSize64);
2318
2319 if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_Discard)
2320 {
2321 if (modifiedDicomSize64 > 0 || *modifiedDicomBufferData != NULL)
2322 {
2323 free(modifiedDicomBufferData);
2324 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is returning a modified buffer while it has discarded the instance");
2325 }
2326 return false;
2327 }
2328 else if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_KeepAsIs)
2329 {
2330 if (modifiedDicomSize64 > 0 || *modifiedDicomBufferData != NULL)
2331 {
2332 free(modifiedDicomBufferData);
2333 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is returning a modified buffer while it has not modified the instance");
2334 }
2335 return true;
2336 }
2337 else if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_Modified)
2338 {
2339 if (modifiedDicomSize64 > 0 && modifiedDicomBufferData != NULL)
2340 {
2341 if (static_cast<size_t>(modifiedDicomSize64) != modifiedDicomSize64) // Orthanc is running in 32bits and has received a > 4GB buffer
2342 {
2343 free(modifiedDicomBufferData);
2344 throw OrthancException(ErrorCode_Plugin, "The Plugin has returned a > 4GB which is too large for Orthanc running in 32bits");
2345 }
2346
2347 modifiedDicomBufferSize = static_cast<size_t>(modifiedDicomSize64);
2348 return true;
2349 }
2350 else
2351 {
2352 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is not returning a modified buffer while it has modified the instance");
2353 }
2354 }
2355 else
2356 {
2357 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback has returned an invalid value");
2358 }
2359 }
2360
2361 return STATUS_Success;
2362 }
2363
2298 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType, 2364 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType,
2299 OrthancPluginResourceType resourceType, 2365 OrthancPluginResourceType resourceType,
2300 const char* resource) 2366 const char* resource)
2301 { 2367 {
2302 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_); 2368 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_);
2519 2585
2520 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming C-Store DICOM instances"; 2586 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming C-Store DICOM instances";
2521 pimpl_->incomingCStoreInstanceFilters_.push_back(p.callback); 2587 pimpl_->incomingCStoreInstanceFilters_.push_back(p.callback);
2522 } 2588 }
2523 2589
2590 void OrthancPlugins::RegisterReceivedInstanceCallback(const void* parameters)
2591 {
2592 const _OrthancPluginReceivedInstanceCallback& p =
2593 *reinterpret_cast<const _OrthancPluginReceivedInstanceCallback*>(parameters);
2594
2595 CLOG(INFO, PLUGINS) << "Plugin has registered a received instance callback";
2596 pimpl_->receivedInstanceCallbacks_.push_back(p.callback);
2597 }
2524 2598
2525 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters) 2599 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters)
2526 { 2600 {
2527 const _OrthancPluginRegisterRefreshMetricsCallback& p = 2601 const _OrthancPluginRegisterRefreshMetricsCallback& p =
2528 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters); 2602 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters);
5002 5076
5003 case _OrthancPluginService_RegisterIncomingCStoreInstanceFilter: 5077 case _OrthancPluginService_RegisterIncomingCStoreInstanceFilter:
5004 RegisterIncomingCStoreInstanceFilter(parameters); 5078 RegisterIncomingCStoreInstanceFilter(parameters);
5005 return true; 5079 return true;
5006 5080
5081 case _OrthancPluginService_RegisterReceivedInstanceCallback:
5082 RegisterReceivedInstanceCallback(parameters);
5083 return true;
5084
5007 case _OrthancPluginService_RegisterRefreshMetricsCallback: 5085 case _OrthancPluginService_RegisterRefreshMetricsCallback:
5008 RegisterRefreshMetricsCallback(parameters); 5086 RegisterRefreshMetricsCallback(parameters);
5009 return true; 5087 return true;
5010 5088
5011 case _OrthancPluginService_RegisterStorageCommitmentScpCallback: 5089 case _OrthancPluginService_RegisterStorageCommitmentScpCallback: