Mercurial > hg > orthanc
comparison Plugins/Engine/OrthancPlugins.cpp @ 2808:37583cd183ed
primitives to create jobs from plugins
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 05 Sep 2018 17:57:06 +0200 |
parents | 6e3a60b85da6 |
children | 6d5b20af216f |
comparison
equal
deleted
inserted
replaced
2807:6356e2ceb493 | 2808:37583cd183ed |
---|---|
42 #include "../../Core/ChunkedBuffer.h" | 42 #include "../../Core/ChunkedBuffer.h" |
43 #include "../../Core/DicomFormat/DicomArray.h" | 43 #include "../../Core/DicomFormat/DicomArray.h" |
44 #include "../../Core/HttpServer/HttpToolbox.h" | 44 #include "../../Core/HttpServer/HttpToolbox.h" |
45 #include "../../Core/Logging.h" | 45 #include "../../Core/Logging.h" |
46 #include "../../Core/OrthancException.h" | 46 #include "../../Core/OrthancException.h" |
47 #include "../../Core/SerializationToolbox.h" | |
47 #include "../../Core/Toolbox.h" | 48 #include "../../Core/Toolbox.h" |
48 #include "../../Core/DicomParsing/FromDcmtkBridge.h" | 49 #include "../../Core/DicomParsing/FromDcmtkBridge.h" |
49 #include "../../Core/DicomParsing/ToDcmtkBridge.h" | 50 #include "../../Core/DicomParsing/ToDcmtkBridge.h" |
50 #include "../../OrthancServer/OrthancInitialization.h" | 51 #include "../../OrthancServer/OrthancInitialization.h" |
51 #include "../../OrthancServer/ServerContext.h" | 52 #include "../../OrthancServer/ServerContext.h" |
60 #include "../../Core/Images/JpegReader.h" | 61 #include "../../Core/Images/JpegReader.h" |
61 #include "../../Core/Images/JpegWriter.h" | 62 #include "../../Core/Images/JpegWriter.h" |
62 #include "../../Core/Images/ImageProcessing.h" | 63 #include "../../Core/Images/ImageProcessing.h" |
63 #include "../../OrthancServer/DefaultDicomImageDecoder.h" | 64 #include "../../OrthancServer/DefaultDicomImageDecoder.h" |
64 #include "PluginsEnumerations.h" | 65 #include "PluginsEnumerations.h" |
66 #include "PluginsJob.h" | |
65 | 67 |
66 #include <boost/regex.hpp> | 68 #include <boost/regex.hpp> |
67 #include <dcmtk/dcmdata/dcdict.h> | 69 #include <dcmtk/dcmdata/dcdict.h> |
68 #include <dcmtk/dcmdata/dcdicent.h> | 70 #include <dcmtk/dcmdata/dcdicent.h> |
69 | 71 |
400 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; | 402 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; |
401 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; | 403 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; |
402 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; | 404 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; |
403 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; | 405 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; |
404 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; | 406 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; |
407 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; | |
405 typedef std::map<Property, std::string> Properties; | 408 typedef std::map<Property, std::string> Properties; |
406 | 409 |
407 PluginsManager manager_; | 410 PluginsManager manager_; |
408 | 411 |
409 RestCallbacks restCallbacks_; | 412 RestCallbacks restCallbacks_; |
410 OnStoredCallbacks onStoredCallbacks_; | 413 OnStoredCallbacks onStoredCallbacks_; |
411 OnChangeCallbacks onChangeCallbacks_; | 414 OnChangeCallbacks onChangeCallbacks_; |
412 OrthancPluginFindCallback findCallback_; | 415 OrthancPluginFindCallback findCallback_; |
413 OrthancPluginWorklistCallback worklistCallback_; | 416 OrthancPluginWorklistCallback worklistCallback_; |
414 DecodeImageCallbacks decodeImageCallbacks_; | 417 DecodeImageCallbacks decodeImageCallbacks_; |
418 JobsUnserializers jobsUnserializers_; | |
415 _OrthancPluginMoveCallback moveCallbacks_; | 419 _OrthancPluginMoveCallback moveCallbacks_; |
416 IncomingHttpRequestFilters incomingHttpRequestFilters_; | 420 IncomingHttpRequestFilters incomingHttpRequestFilters_; |
417 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; | 421 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; |
418 std::auto_ptr<StorageAreaFactory> storageArea_; | 422 std::auto_ptr<StorageAreaFactory> storageArea_; |
419 | 423 |
421 boost::recursive_mutex storedCallbackMutex_; | 425 boost::recursive_mutex storedCallbackMutex_; |
422 boost::recursive_mutex changeCallbackMutex_; | 426 boost::recursive_mutex changeCallbackMutex_; |
423 boost::mutex findCallbackMutex_; | 427 boost::mutex findCallbackMutex_; |
424 boost::mutex worklistCallbackMutex_; | 428 boost::mutex worklistCallbackMutex_; |
425 boost::mutex decodeImageCallbackMutex_; | 429 boost::mutex decodeImageCallbackMutex_; |
430 boost::mutex jobsUnserializersMutex_; | |
426 boost::recursive_mutex invokeServiceMutex_; | 431 boost::recursive_mutex invokeServiceMutex_; |
427 | 432 |
428 Properties properties_; | 433 Properties properties_; |
429 int argc_; | 434 int argc_; |
430 char** argv_; | 435 char** argv_; |
807 sizeof(int32_t) != sizeof(OrthancPluginDicomToJsonFormat) || | 812 sizeof(int32_t) != sizeof(OrthancPluginDicomToJsonFormat) || |
808 sizeof(int32_t) != sizeof(OrthancPluginCreateDicomFlags) || | 813 sizeof(int32_t) != sizeof(OrthancPluginCreateDicomFlags) || |
809 sizeof(int32_t) != sizeof(_OrthancPluginDatabaseAnswerType) || | 814 sizeof(int32_t) != sizeof(_OrthancPluginDatabaseAnswerType) || |
810 sizeof(int32_t) != sizeof(OrthancPluginIdentifierConstraint) || | 815 sizeof(int32_t) != sizeof(OrthancPluginIdentifierConstraint) || |
811 sizeof(int32_t) != sizeof(OrthancPluginInstanceOrigin) || | 816 sizeof(int32_t) != sizeof(OrthancPluginInstanceOrigin) || |
817 sizeof(int32_t) != sizeof(OrthancPluginJobStepStatus) || | |
812 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeBinary) != static_cast<int>(DicomToJsonFlags_IncludeBinary) || | 818 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeBinary) != static_cast<int>(DicomToJsonFlags_IncludeBinary) || |
813 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePrivateTags) != static_cast<int>(DicomToJsonFlags_IncludePrivateTags) || | 819 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePrivateTags) != static_cast<int>(DicomToJsonFlags_IncludePrivateTags) || |
814 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeUnknownTags) != static_cast<int>(DicomToJsonFlags_IncludeUnknownTags) || | 820 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeUnknownTags) != static_cast<int>(DicomToJsonFlags_IncludeUnknownTags) || |
815 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePixelData) != static_cast<int>(DicomToJsonFlags_IncludePixelData) || | 821 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePixelData) != static_cast<int>(DicomToJsonFlags_IncludePixelData) || |
816 static_cast<int>(OrthancPluginDicomToJsonFlags_ConvertBinaryToNull) != static_cast<int>(DicomToJsonFlags_ConvertBinaryToNull) || | 822 static_cast<int>(OrthancPluginDicomToJsonFlags_ConvertBinaryToNull) != static_cast<int>(DicomToJsonFlags_ConvertBinaryToNull) || |
1166 LOG(INFO) << "Plugin has registered a callback to decode DICOM images (" | 1172 LOG(INFO) << "Plugin has registered a callback to decode DICOM images (" |
1167 << pimpl_->decodeImageCallbacks_.size() << " decoder(s) now active)"; | 1173 << pimpl_->decodeImageCallbacks_.size() << " decoder(s) now active)"; |
1168 } | 1174 } |
1169 | 1175 |
1170 | 1176 |
1177 void OrthancPlugins::RegisterJobsUnserializer(const void* parameters) | |
1178 { | |
1179 const _OrthancPluginJobsUnserializer& p = | |
1180 *reinterpret_cast<const _OrthancPluginJobsUnserializer*>(parameters); | |
1181 | |
1182 boost::mutex::scoped_lock lock(pimpl_->jobsUnserializersMutex_); | |
1183 | |
1184 pimpl_->jobsUnserializers_.push_back(p.unserializer); | |
1185 LOG(INFO) << "Plugin has registered a callback to unserialize jobs (" | |
1186 << pimpl_->jobsUnserializers_.size() << " unserializer(s) now active)"; | |
1187 } | |
1188 | |
1189 | |
1171 void OrthancPlugins::RegisterIncomingHttpRequestFilter(const void* parameters) | 1190 void OrthancPlugins::RegisterIncomingHttpRequestFilter(const void* parameters) |
1172 { | 1191 { |
1173 const _OrthancPluginIncomingHttpRequestFilter& p = | 1192 const _OrthancPluginIncomingHttpRequestFilter& p = |
1174 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter*>(parameters); | 1193 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter*>(parameters); |
1175 | 1194 |
2855 | 2874 |
2856 case _OrthancPluginService_CallPeerApi: | 2875 case _OrthancPluginService_CallPeerApi: |
2857 CallPeerApi(parameters); | 2876 CallPeerApi(parameters); |
2858 return true; | 2877 return true; |
2859 | 2878 |
2879 case _OrthancPluginService_SubmitJob: | |
2880 { | |
2881 const _OrthancPluginSubmitJob& p = | |
2882 *reinterpret_cast<const _OrthancPluginSubmitJob*>(parameters); | |
2883 | |
2884 std::string uuid; | |
2885 | |
2886 PImpl::ServerContextLock lock(*pimpl_); | |
2887 lock.GetContext().GetJobsEngine().GetRegistry().Submit(uuid, new PluginsJob(p), p.priority_); | |
2888 | |
2889 return true; | |
2890 } | |
2891 | |
2860 default: | 2892 default: |
2861 return false; | 2893 return false; |
2862 } | 2894 } |
2863 } | 2895 } |
2864 | 2896 |
2902 RegisterMoveCallback(parameters); | 2934 RegisterMoveCallback(parameters); |
2903 return true; | 2935 return true; |
2904 | 2936 |
2905 case _OrthancPluginService_RegisterDecodeImageCallback: | 2937 case _OrthancPluginService_RegisterDecodeImageCallback: |
2906 RegisterDecodeImageCallback(parameters); | 2938 RegisterDecodeImageCallback(parameters); |
2939 return true; | |
2940 | |
2941 case _OrthancPluginService_RegisterJobsUnserializer: | |
2942 RegisterJobsUnserializer(parameters); | |
2907 return true; | 2943 return true; |
2908 | 2944 |
2909 case _OrthancPluginService_RegisterIncomingHttpRequestFilter: | 2945 case _OrthancPluginService_RegisterIncomingHttpRequestFilter: |
2910 RegisterIncomingHttpRequestFilter(parameters); | 2946 RegisterIncomingHttpRequestFilter(parameters); |
2911 return true; | 2947 return true; |
3317 DefaultDicomImageDecoder defaultDecoder; | 3353 DefaultDicomImageDecoder defaultDecoder; |
3318 return defaultDecoder.Decode(dicom, size, frame); | 3354 return defaultDecoder.Decode(dicom, size, frame); |
3319 } | 3355 } |
3320 } | 3356 } |
3321 | 3357 |
3322 | 3358 |
3323 bool OrthancPlugins::IsAllowed(HttpMethod method, | 3359 bool OrthancPlugins::IsAllowed(HttpMethod method, |
3324 const char* uri, | 3360 const char* uri, |
3325 const char* ip, | 3361 const char* ip, |
3326 const char* username, | 3362 const char* username, |
3327 const IHttpHandler::Arguments& httpHeaders, | 3363 const IHttpHandler::Arguments& httpHeaders, |
3392 } | 3428 } |
3393 } | 3429 } |
3394 | 3430 |
3395 return true; | 3431 return true; |
3396 } | 3432 } |
3433 | |
3434 | |
3435 bool OrthancPlugins::UnserializeJob(const Json::Value& value) | |
3436 { | |
3437 const std::string type = SerializationToolbox::ReadString(value, "Type"); | |
3438 const std::string serialized = value.toStyledString(); | |
3439 | |
3440 boost::mutex::scoped_lock lock(pimpl_->jobsUnserializersMutex_); | |
3441 | |
3442 for (PImpl::JobsUnserializers::iterator | |
3443 unserializer = pimpl_->jobsUnserializers_.begin(); | |
3444 unserializer != pimpl_->jobsUnserializers_.end(); ++unserializer) | |
3445 { | |
3446 if ((*unserializer) (type.c_str(), serialized.c_str()) == OrthancPluginErrorCode_Success) | |
3447 { | |
3448 return true; | |
3449 } | |
3450 } | |
3451 | |
3452 return false; | |
3453 } | |
3397 } | 3454 } |