Mercurial > hg > orthanc
comparison OrthancServer/Plugins/Engine/OrthancPlugins.cpp @ 4860:3e9a76464e8a openssl-3.x
integration mainline->openssl-3.x
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 24 Dec 2021 16:52:51 +0100 |
parents | 2e71a08eea15 5c1805499dec |
children | 6eff25f70121 |
comparison
equal
deleted
inserted
replaced
4832:2e71a08eea15 | 4860:3e9a76464e8a |
---|---|
68 #include <boost/regex.hpp> | 68 #include <boost/regex.hpp> |
69 #include <dcmtk/dcmdata/dcdict.h> | 69 #include <dcmtk/dcmdata/dcdict.h> |
70 #include <dcmtk/dcmdata/dcdicent.h> | 70 #include <dcmtk/dcmdata/dcdicent.h> |
71 #include <dcmtk/dcmnet/dimse.h> | 71 #include <dcmtk/dcmnet/dimse.h> |
72 | 72 |
73 #define ERROR_MESSAGE_64BIT "A 64bit version of the Orthanc API is necessary" | 73 #define ERROR_MESSAGE_64BIT "A 64bit version of the Orthanc SDK is necessary to use buffers > 4GB and it is currently not available !" |
74 | 74 |
75 | 75 |
76 namespace Orthanc | 76 namespace Orthanc |
77 { | 77 { |
78 static void CopyToMemoryBuffer(OrthancPluginMemoryBuffer& target, | 78 static void CopyToMemoryBuffer(OrthancPluginMemoryBuffer& target, |
1154 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; | 1154 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; |
1155 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; | 1155 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; |
1156 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; | 1156 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; |
1157 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters; | 1157 typedef std::list<OrthancPluginIncomingDicomInstanceFilter> IncomingDicomInstanceFilters; |
1158 typedef std::list<OrthancPluginIncomingCStoreInstanceFilter> IncomingCStoreInstanceFilters; | 1158 typedef std::list<OrthancPluginIncomingCStoreInstanceFilter> IncomingCStoreInstanceFilters; |
1159 typedef std::list<OrthancPluginReceivedInstanceCallback> ReceivedInstanceCallbacks; | |
1159 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; | 1160 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; |
1160 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks; | 1161 typedef std::list<OrthancPluginTranscoderCallback> TranscoderCallbacks; |
1161 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; | 1162 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; |
1162 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; | 1163 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; |
1163 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks; | 1164 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks; |
1177 _OrthancPluginMoveCallback moveCallbacks_; | 1178 _OrthancPluginMoveCallback moveCallbacks_; |
1178 IncomingHttpRequestFilters incomingHttpRequestFilters_; | 1179 IncomingHttpRequestFilters incomingHttpRequestFilters_; |
1179 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; | 1180 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; |
1180 IncomingDicomInstanceFilters incomingDicomInstanceFilters_; | 1181 IncomingDicomInstanceFilters incomingDicomInstanceFilters_; |
1181 IncomingCStoreInstanceFilters incomingCStoreInstanceFilters_; // New in Orthanc 1.9.8 | 1182 IncomingCStoreInstanceFilters incomingCStoreInstanceFilters_; // New in Orthanc 1.9.8 |
1183 ReceivedInstanceCallbacks receivedInstanceCallbacks_; // New in Orthanc 1.9.8 | |
1182 RefreshMetricsCallbacks refreshMetricsCallbacks_; | 1184 RefreshMetricsCallbacks refreshMetricsCallbacks_; |
1183 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_; | 1185 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_; |
1184 std::unique_ptr<StorageAreaFactory> storageArea_; | 1186 std::unique_ptr<StorageAreaFactory> storageArea_; |
1185 std::set<std::string> authorizationTokens_; | 1187 std::set<std::string> authorizationTokens_; |
1186 | 1188 |
2281 | 2283 |
2282 return STATUS_Success; | 2284 return STATUS_Success; |
2283 } | 2285 } |
2284 | 2286 |
2285 | 2287 |
2288 bool OrthancPlugins::ApplyReceivedInstanceCallbacks(const void* receivedDicom, | |
2289 size_t receivedDicomSize, | |
2290 void** modifiedDicomBufferData, | |
2291 size_t& modifiedDicomBufferSize) | |
2292 { | |
2293 uint64_t modifiedDicomSize64 = 0; | |
2294 *modifiedDicomBufferData = NULL; | |
2295 | |
2296 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_); | |
2297 | |
2298 for (PImpl::ReceivedInstanceCallbacks::const_iterator | |
2299 callback = pimpl_->receivedInstanceCallbacks_.begin(); | |
2300 callback != pimpl_->receivedInstanceCallbacks_.end(); ++callback) | |
2301 { | |
2302 OrthancPluginReceivedInstanceCallbackResult callbackResult = (*callback) (receivedDicom, | |
2303 receivedDicomSize, | |
2304 modifiedDicomBufferData, | |
2305 &modifiedDicomSize64); | |
2306 | |
2307 if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_Discard) | |
2308 { | |
2309 if (modifiedDicomSize64 > 0 || *modifiedDicomBufferData != NULL) | |
2310 { | |
2311 free(modifiedDicomBufferData); | |
2312 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is returning a modified buffer while it has discarded the instance"); | |
2313 } | |
2314 | |
2315 CLOG(INFO, PLUGINS) << "A plugin has discarded the instance in its ReceivedInstanceCallback"; | |
2316 return false; | |
2317 } | |
2318 else if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_KeepAsIs) | |
2319 { | |
2320 if (modifiedDicomSize64 > 0 || *modifiedDicomBufferData != NULL) | |
2321 { | |
2322 free(modifiedDicomBufferData); | |
2323 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is returning a modified buffer while it has not modified the instance"); | |
2324 } | |
2325 return true; | |
2326 } | |
2327 else if (callbackResult == OrthancPluginReceivedInstanceCallbackResult_Modified) | |
2328 { | |
2329 if (modifiedDicomSize64 > 0 && modifiedDicomBufferData != NULL) | |
2330 { | |
2331 if (static_cast<size_t>(modifiedDicomSize64) != modifiedDicomSize64) // Orthanc is running in 32bits and has received a > 4GB buffer | |
2332 { | |
2333 free(modifiedDicomBufferData); | |
2334 throw OrthancException(ErrorCode_Plugin, "The Plugin has returned a > 4GB which is too large for Orthanc running in 32bits"); | |
2335 } | |
2336 | |
2337 modifiedDicomBufferSize = static_cast<size_t>(modifiedDicomSize64); | |
2338 | |
2339 CLOG(INFO, PLUGINS) << "A plugin has modified the instance in its ReceivedInstanceCallback"; | |
2340 return true; | |
2341 } | |
2342 else | |
2343 { | |
2344 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is not returning a modified buffer while it has modified the instance"); | |
2345 } | |
2346 } | |
2347 else | |
2348 { | |
2349 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback has returned an invalid value"); | |
2350 } | |
2351 } | |
2352 | |
2353 return true; | |
2354 } | |
2355 | |
2286 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType, | 2356 void OrthancPlugins::SignalChangeInternal(OrthancPluginChangeType changeType, |
2287 OrthancPluginResourceType resourceType, | 2357 OrthancPluginResourceType resourceType, |
2288 const char* resource) | 2358 const char* resource) |
2289 { | 2359 { |
2290 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_); | 2360 boost::recursive_mutex::scoped_lock lock(pimpl_->changeCallbackMutex_); |
2507 | 2577 |
2508 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming C-Store DICOM instances"; | 2578 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming C-Store DICOM instances"; |
2509 pimpl_->incomingCStoreInstanceFilters_.push_back(p.callback); | 2579 pimpl_->incomingCStoreInstanceFilters_.push_back(p.callback); |
2510 } | 2580 } |
2511 | 2581 |
2582 void OrthancPlugins::RegisterReceivedInstanceCallback(const void* parameters) | |
2583 { | |
2584 const _OrthancPluginReceivedInstanceCallback& p = | |
2585 *reinterpret_cast<const _OrthancPluginReceivedInstanceCallback*>(parameters); | |
2586 | |
2587 CLOG(INFO, PLUGINS) << "Plugin has registered a received instance callback"; | |
2588 pimpl_->receivedInstanceCallbacks_.push_back(p.callback); | |
2589 } | |
2512 | 2590 |
2513 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters) | 2591 void OrthancPlugins::RegisterRefreshMetricsCallback(const void* parameters) |
2514 { | 2592 { |
2515 const _OrthancPluginRegisterRefreshMetricsCallback& p = | 2593 const _OrthancPluginRegisterRefreshMetricsCallback& p = |
2516 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters); | 2594 *reinterpret_cast<const _OrthancPluginRegisterRefreshMetricsCallback*>(parameters); |
4990 | 5068 |
4991 case _OrthancPluginService_RegisterIncomingCStoreInstanceFilter: | 5069 case _OrthancPluginService_RegisterIncomingCStoreInstanceFilter: |
4992 RegisterIncomingCStoreInstanceFilter(parameters); | 5070 RegisterIncomingCStoreInstanceFilter(parameters); |
4993 return true; | 5071 return true; |
4994 | 5072 |
5073 case _OrthancPluginService_RegisterReceivedInstanceCallback: | |
5074 RegisterReceivedInstanceCallback(parameters); | |
5075 return true; | |
5076 | |
4995 case _OrthancPluginService_RegisterRefreshMetricsCallback: | 5077 case _OrthancPluginService_RegisterRefreshMetricsCallback: |
4996 RegisterRefreshMetricsCallback(parameters); | 5078 RegisterRefreshMetricsCallback(parameters); |
4997 return true; | 5079 return true; |
4998 | 5080 |
4999 case _OrthancPluginService_RegisterStorageCommitmentScpCallback: | 5081 case _OrthancPluginService_RegisterStorageCommitmentScpCallback: |