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 }