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: