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