Mercurial > hg > orthanc
diff Plugins/Engine/OrthancPlugins.cpp @ 1177:5b2d8c280ac2 db-changes
Plugins can monitor changes through callbacks
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 24 Sep 2014 17:37:44 +0200 |
parents | 1ea4094d077c |
children | c71d25e6a63c |
line wrap: on
line diff
--- a/Plugins/Engine/OrthancPlugins.cpp Mon Sep 22 14:11:37 2014 +0200 +++ b/Plugins/Engine/OrthancPlugins.cpp Wed Sep 24 17:37:44 2014 +0200 @@ -84,11 +84,13 @@ typedef std::pair<boost::regex*, OrthancPluginRestCallback> RestCallback; typedef std::list<RestCallback> RestCallbacks; typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; + typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks; ServerContext& context_; RestCallbacks restCallbacks_; OrthancRestApi* restApi_; OnStoredCallbacks onStoredCallbacks_; + OnChangeCallbacks onChangeCallbacks_; bool hasStorageArea_; _OrthancPluginRegisterStorageArea storageArea_; @@ -123,6 +125,83 @@ } + static OrthancPluginResourceType Convert(ResourceType type) + { + switch (type) + { + case ResourceType_Patient: + return OrthancPluginResourceType_Patient; + + case ResourceType_Study: + return OrthancPluginResourceType_Study; + + case ResourceType_Series: + return OrthancPluginResourceType_Series; + + case ResourceType_Instance: + return OrthancPluginResourceType_Instance; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } + + + static OrthancPluginChangeType Convert(ChangeType type) + { + switch (type) + { + case ChangeType_AnonymizedPatient: + return OrthancPluginChangeType_AnonymizedPatient; + + case ChangeType_AnonymizedSeries: + return OrthancPluginChangeType_AnonymizedSeries; + + case ChangeType_AnonymizedStudy: + return OrthancPluginChangeType_AnonymizedStudy; + + case ChangeType_CompletedSeries: + return OrthancPluginChangeType_CompletedSeries; + + case ChangeType_Deleted: + return OrthancPluginChangeType_Deleted; + + case ChangeType_ModifiedPatient: + return OrthancPluginChangeType_ModifiedPatient; + + case ChangeType_ModifiedSeries: + return OrthancPluginChangeType_ModifiedSeries; + + case ChangeType_ModifiedStudy: + return OrthancPluginChangeType_ModifiedStudy; + + case ChangeType_NewInstance: + return OrthancPluginChangeType_NewInstance; + + case ChangeType_NewPatient: + return OrthancPluginChangeType_NewPatient; + + case ChangeType_NewSeries: + return OrthancPluginChangeType_NewSeries; + + case ChangeType_NewStudy: + return OrthancPluginChangeType_NewStudy; + + case ChangeType_StablePatient: + return OrthancPluginChangeType_StablePatient; + + case ChangeType_StableSeries: + return OrthancPluginChangeType_StableSeries; + + case ChangeType_StableStudy: + return OrthancPluginChangeType_StableStudy; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + } + + OrthancPlugins::OrthancPlugins(ServerContext& context) { pimpl_.reset(new PImpl(context)); @@ -279,7 +358,7 @@ void OrthancPlugins::SignalStoredInstance(DicomInstanceToStore& instance, - const std::string& instanceId) + const std::string& instanceId) { for (PImpl::OnStoredCallbacks::const_iterator callback = pimpl_->onStoredCallbacks_.begin(); @@ -292,6 +371,27 @@ + void OrthancPlugins::SignalChange(ChangeType changeType, + ResourceType resourceType, + const std::string& publicId) + { + for (PImpl::OnChangeCallbacks::const_iterator + callback = pimpl_->onChangeCallbacks_.begin(); + callback != pimpl_->onChangeCallbacks_.end(); ++callback) + { + try + { + (*callback) (Convert(changeType), Convert(resourceType), publicId.c_str()); + } + catch (OrthancException&) + { + // This change type or resource type is not supported by the plugin SDK + } + } + } + + + static void CopyToMemoryBuffer(OrthancPluginMemoryBuffer& target, const void* data, size_t size) @@ -353,6 +453,16 @@ } + void OrthancPlugins::RegisterOnChangeCallback(const void* parameters) + { + const _OrthancPluginOnChangeCallback& p = + *reinterpret_cast<const _OrthancPluginOnChangeCallback*>(parameters); + + LOG(INFO) << "Plugin has registered an OnChange callback"; + pimpl_->onChangeCallbacks_.push_back(p.callback); + } + + void OrthancPlugins::AnswerBuffer(const void* parameters) { @@ -777,6 +887,10 @@ RegisterOnStoredInstanceCallback(parameters); return true; + case _OrthancPluginService_RegisterOnChangeCallback: + RegisterOnChangeCallback(parameters); + return true; + case _OrthancPluginService_AnswerBuffer: AnswerBuffer(parameters); return true;