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;