diff Plugins/Engine/PluginsJob.cpp @ 2814:7d1d3136f6cf

more generic handling of content and serialization in plugin jobs
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 07 Sep 2018 10:09:17 +0200
parents ea7aea6f6a95
children 925d8dc03a23
line wrap: on
line diff
--- a/Plugins/Engine/PluginsJob.cpp	Thu Sep 06 18:24:44 2018 +0200
+++ b/Plugins/Engine/PluginsJob.cpp	Fri Sep 07 10:09:17 2018 +0200
@@ -39,6 +39,7 @@
 #endif
 
 
+#include "../../Core/Logging.h"
 #include "../../Core/OrthancException.h"
 
 #include <json/reader.h>
@@ -47,70 +48,39 @@
 namespace Orthanc
 {
   PluginsJob::PluginsJob(const _OrthancPluginSubmitJob& parameters) :
-    job_(parameters.job_),
-    free_(parameters.free_),
-    getProgress_(parameters.getProgress_),
-    step_(parameters.step_),
-    stop_(parameters.stop_),
-    reset_(parameters.reset_)
+    parameters_(parameters)
   {
-    if (job_ == NULL ||
-        parameters.type_ == NULL ||
-        free_ == NULL ||
-        getProgress_ == NULL ||
-        step_ == NULL ||
-        stop_ == NULL ||
-        reset_ == NULL)
+    if (parameters_.job == NULL)
     {
       throw OrthancException(ErrorCode_NullPointer);
     }
+    
+    if (parameters_.resultId == NULL ||
+        parameters_.freeJob == NULL ||
+        parameters_.type == NULL ||
+        parameters_.getProgress == NULL ||
+        parameters_.getContent == NULL ||
+        parameters_.getSerialized == NULL ||
+        parameters_.step == NULL ||
+        parameters_.stop == NULL ||
+        parameters_.reset == NULL)
+    {
+      parameters_.freeJob(parameters.job);
+      throw OrthancException(ErrorCode_NullPointer);
+    }
 
-    type_.assign(parameters.type_);
-
-    if (parameters.content_ == NULL)
-    {
-      publicContent_ = Json::objectValue;
-    }
-    else
-    {
-      Json::Reader reader;
-      if (!reader.parse(parameters.content_, publicContent_) ||
-          publicContent_.type() != Json::objectValue)
-      {
-        free_(job_);
-        throw OrthancException(ErrorCode_BadFileFormat);
-      }
-    }
-
-    if (parameters.serialized_ == NULL)
-    {
-      hasSerialized_ = false;
-    }
-    else
-    {
-      hasSerialized_ = true;
-
-      Json::Reader reader;
-      if (!reader.parse(parameters.serialized_, serialized_) ||
-          serialized_.type() != Json::objectValue ||
-          !serialized_.isMember("Type") ||
-          serialized_["Type"].type() != Json::stringValue)
-      {
-        free_(job_);
-        throw OrthancException(ErrorCode_BadFileFormat);
-      }
-    }
+    type_.assign(parameters.type);
   }
 
   PluginsJob::~PluginsJob()
   {
-    assert(job_ != NULL);
-    free_(job_);
+    assert(parameters_.job != NULL);
+    parameters_.freeJob(parameters_.job);
   }
 
   JobStepResult PluginsJob::Step()
   {
-    OrthancPluginJobStepStatus status = step_(job_);
+    OrthancPluginJobStepStatus status = parameters_.step(parameters_.job);
 
     switch (status)
     {
@@ -130,7 +100,7 @@
 
   void PluginsJob::Reset()
   {
-    reset_(job_);
+    parameters_.reset(parameters_.job);
   }
 
   void PluginsJob::Stop(JobStopReason reason)
@@ -138,19 +108,19 @@
     switch (reason)
     {
       case JobStopReason_Success:
-        stop_(job_, OrthancPluginJobStopReason_Success);
+        parameters_.stop(parameters_.job, OrthancPluginJobStopReason_Success);
         break;
 
       case JobStopReason_Failure:
-        stop_(job_, OrthancPluginJobStopReason_Failure);
+        parameters_.stop(parameters_.job, OrthancPluginJobStopReason_Failure);
         break;
 
       case JobStopReason_Canceled:
-        stop_(job_, OrthancPluginJobStopReason_Canceled);
+        parameters_.stop(parameters_.job, OrthancPluginJobStopReason_Canceled);
         break;
 
       case JobStopReason_Paused:
-        stop_(job_, OrthancPluginJobStopReason_Paused);
+        parameters_.stop(parameters_.job, OrthancPluginJobStopReason_Paused);
         break;
 
       default:
@@ -160,19 +130,60 @@
 
   float PluginsJob::GetProgress()
   {
-    return getProgress_(job_);
+    return parameters_.getProgress(parameters_.job);
+  }
+
+  void PluginsJob::GetPublicContent(Json::Value& value)
+  {
+    const char* content = parameters_.getContent(parameters_.job);
+
+    if (content == NULL)
+    {
+      value = Json::objectValue;
+    }
+    else
+    {
+      Json::Reader reader;
+      
+      if (!reader.parse(content, value) ||
+          value.type() != Json::objectValue)
+      {
+        LOG(ERROR) << "A job plugin must provide a JSON object as its public content";
+        throw OrthancException(ErrorCode_Plugin);
+      }
+    }
   }
 
   bool PluginsJob::Serialize(Json::Value& value)
   {
-    if (hasSerialized_)
+    const char* serialized = parameters_.getSerialized(parameters_.job);
+
+    if (serialized == NULL)
     {
-      value = serialized_;
-      return true;
+      return false;
     }
     else
     {
-      return false;
+      Json::Reader reader;
+      
+      if (!reader.parse(serialized, value) ||
+          value.type() != Json::objectValue)
+      {
+        LOG(ERROR) << "A job plugin must provide a JSON object as its serialized content";
+        throw OrthancException(ErrorCode_Plugin);
+      }
+
+
+      static const char* KEY_TYPE = "Type";
+      
+      if (value.isMember(KEY_TYPE))
+      {
+        LOG(ERROR) << "The \"Type\" field is for reserved use for serialized job";
+        throw OrthancException(ErrorCode_Plugin);
+      }
+
+      value[KEY_TYPE] = type_;
+      return true;
     }
   }
 }