changeset 31:cfeda58d0c8e

remove calls to deprecated classes of JsonCpp
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 22 Dec 2020 08:31:22 +0100
parents 3abebab5d004
children 3bd0ec7c5a7c
files Framework/HttpQueries/DetectTransferPlugin.cpp Framework/PullMode/PullJob.cpp Framework/PushMode/PushJob.cpp Plugin/Plugin.cpp Resources/Orthanc/CMake/DownloadOrthancFramework.cmake Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h
diffstat 7 files changed, 161 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/Framework/HttpQueries/DetectTransferPlugin.cpp	Fri Nov 06 18:06:55 2020 +0100
+++ b/Framework/HttpQueries/DetectTransferPlugin.cpp	Tue Dec 22 08:31:22 2020 +0100
@@ -24,8 +24,7 @@
 
 #include <Logging.h>
 #include <OrthancException.h>
-
-#include <json/reader.h>
+#include <Toolbox.h>
 
 
 namespace OrthancPlugins
@@ -49,13 +48,11 @@
   void DetectTransferPlugin::HandleAnswer(const void* answer,
                                           size_t size)
   {
-    Json::Reader reader;
     Json::Value value;
 
     bool enabled = false;
 
-    if (reader.parse(reinterpret_cast<const char*>(answer), 
-                     reinterpret_cast<const char*>(answer) + size, value) &&
+    if (Orthanc::Toolbox::ReadJson(value, answer, size) &&
         value.type() == Json::arrayValue)
     {
       // Loop over the plugins that are enabled on the remote peer
--- a/Framework/PullMode/PullJob.cpp	Fri Nov 06 18:06:55 2020 +0100
+++ b/Framework/PullMode/PullJob.cpp	Tue Dec 22 08:31:22 2020 +0100
@@ -26,8 +26,6 @@
 #include <Compatibility.h>  // For std::unique_ptr
 #include <Logging.h>
 
-#include <json/writer.h>
-
 
 namespace OrthancPlugins
 {
@@ -169,8 +167,8 @@
 
     virtual StateUpdate* Step()
     {
-      Json::FastWriter writer;
-      const std::string lookup = writer.write(job_.query_.GetResources()); 
+      std::string lookup;
+      Orthanc::Toolbox::WriteFastJson(lookup, job_.query_.GetResources());
 
       Json::Value answer;
       if (!DoPostPeer(answer, job_.peers_, job_.peerIndex_, URI_LOOKUP, lookup, job_.maxHttpRetries_))
--- a/Framework/PushMode/PushJob.cpp	Fri Nov 06 18:06:55 2020 +0100
+++ b/Framework/PushMode/PushJob.cpp	Tue Dec 22 08:31:22 2020 +0100
@@ -26,8 +26,6 @@
 #include <Compatibility.h>  // For std::unique_ptr
 #include <Logging.h>
 
-#include <json/writer.h>
-
 
 namespace OrthancPlugins
 {
@@ -202,8 +200,7 @@
                                       job.targetBucketSize_, 2 * job.targetBucketSize_,
                                       job_.query_.GetCompression());
 
-      Json::FastWriter writer;
-      createTransaction_ = writer.write(push);
+      Orthanc::Toolbox::WriteFastJson(createTransaction_, push);
 
       info_.SetContent("Peer", job_.query_.GetPeer());
       info_.SetContent("Compression", EnumerationToString(job_.query_.GetCompression()));
--- a/Plugin/Plugin.cpp	Fri Nov 06 18:06:55 2020 +0100
+++ b/Plugin/Plugin.cpp	Tue Dec 22 08:31:22 2020 +0100
@@ -28,6 +28,7 @@
 #include <ChunkedBuffer.h>
 #include <Compression/GzipCompressor.h>
 #include <Logging.h>
+#include <Toolbox.h>
 
 
 static bool DisplayPerformanceWarning()
@@ -187,14 +188,12 @@
                           OrthancPluginRestOutput* output,
                           const OrthancPluginHttpRequest* request)
 {
-  Json::Reader reader;
-
   if (request->method != OrthancPluginHttpMethod_Post)
   {
     OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
     return false;
   }
-  else if (reader.parse(request->body, request->body + request->bodySize, body))
+  else if (Orthanc::Toolbox::ReadJson(body, request->body, request->bodySize))
   {
     return true;
   }
@@ -237,9 +236,8 @@
     answer[KEY_INSTANCES].append(instance);
   }
   
-  Json::FastWriter writer;
-  std::string s = writer.write(answer);
-  
+  std::string s;
+  Orthanc::Toolbox::WriteFastJson(s, answer);  
   OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), "application/json");
 }
 
@@ -450,8 +448,8 @@
     lookup[KEY_ORIGINATOR_UUID] = context.GetPluginUuid();
     lookup[KEY_PEER] = remoteSelf;
 
-    Json::FastWriter writer;
-    std::string s = writer.write(lookup);
+    std::string s;
+    Orthanc::Toolbox::WriteFastJson(s, lookup);  
 
     Json::Value answer;
     if (DoPostPeer(answer, peers, query.GetPeer(), URI_PULL, s, context.GetMaxHttpRetries()) &&
@@ -513,8 +511,7 @@
     std::string tmp(serialized);
 
     Json::Value source;
-    Json::Reader reader;
-    if (reader.parse(tmp, source))
+    if (Orthanc::Toolbox::ReadJson(source, tmp))
     {
       OrthancPlugins::TransferQuery query(source);
 
--- a/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake	Fri Nov 06 18:06:55 2020 +0100
+++ b/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake	Tue Dec 22 08:31:22 2020 +0100
@@ -118,6 +118,10 @@
         set(ORTHANC_FRAMEWORK_MD5 "19fcb7c21876af86546baa048a22c6c0")
       elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.8.0")
         set(ORTHANC_FRAMEWORK_MD5 "f8ec7554ef5d23ea4ce474b1e8214de9")
+      elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.8.1")
+        set(ORTHANC_FRAMEWORK_MD5 "db094f96399cbe8b9bbdbce34884c220")
+      elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.8.2")
+        set(ORTHANC_FRAMEWORK_MD5 "8bfa10e66c9931e74111be0bfb1f4548")
 
       # Below this point are development snapshots that were used to
       # release some plugin, before an official release of the Orthanc
@@ -129,6 +133,12 @@
       elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "ae0e3fd609df")
         # DICOMweb 1.1 (framework pre-1.6.0)
         set(ORTHANC_FRAMEWORK_MD5 "7e09e9b530a2f527854f0b782d7e0645")
+      elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "82652c5fc04f")
+        # Stone Web viewer 1.0 (framework pre-1.8.1)
+        set(ORTHANC_FRAMEWORK_MD5 "d77331d68917e66a3f4f9b807bbdab7f")
+      elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "4a3ba4bf4ba7")
+        # PostgreSQL 3.3 (framework pre-1.8.2)
+        set(ORTHANC_FRAMEWORK_MD5 "2d82bddf06f9cfe82095495cb3b8abde")
       endif()
     endif()
   endif()
@@ -524,6 +534,16 @@
       include_directories(${DCMTK_INCLUDE_DIRS})
       link_libraries(${DCMTK_LIBRARIES})
     endif()
+
+    # Optional component - OpenSSL
+    if (ENABLE_SSL)
+      include(FindOpenSSL)
+      if (NOT ${OPENSSL_FOUND})
+        message(FATAL_ERROR "Unable to find OpenSSL")
+      endif()
+      include_directories(${OPENSSL_INCLUDE_DIR})
+      link_libraries(${OPENSSL_LIBRARIES})
+    endif()
   endif()
 
   # Look for Orthanc framework shared library
--- a/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp	Fri Nov 06 18:06:55 2020 +0100
+++ b/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp	Tue Dec 22 08:31:22 2020 +0100
@@ -24,9 +24,33 @@
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/move/unique_ptr.hpp>
 #include <boost/thread.hpp>
+
+
 #include <json/reader.h>
+#include <json/version.h>
 #include <json/writer.h>
 
+#if !defined(JSONCPP_VERSION_MAJOR) || !defined(JSONCPP_VERSION_MINOR)
+#  error Cannot access the version of JsonCpp
+#endif
+
+
+/**
+ * We use deprecated "Json::Reader", "Json::StyledWriter" and
+ * "Json::FastWriter" if JsonCpp < 1.7.0. This choice is rather
+ * arbitrary, but if Json >= 1.9.0, gcc generates explicit deprecation
+ * warnings (clang was warning in earlier versions). For reference,
+ * these classes seem to have been deprecated since JsonCpp 1.4.0 (on
+ * February 2015) by the following changeset:
+ * https://github.com/open-source-parsers/jsoncpp/commit/8df98f6112890d6272734975dd6d70cf8999bb22
+ **/
+#if (JSONCPP_VERSION_MAJOR >= 2 ||                                      \
+     (JSONCPP_VERSION_MAJOR == 1 && JSONCPP_VERSION_MINOR >= 8))
+#  define JSONCPP_USE_DEPRECATED 0
+#else
+#  define JSONCPP_USE_DEPRECATED 1
+#endif
+
 
 #if !ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 2, 0)
 static const OrthancPluginErrorCode OrthancPluginErrorCode_NullPointer = OrthancPluginErrorCode_Plugin;
@@ -202,10 +226,7 @@
       ORTHANC_PLUGINS_THROW_EXCEPTION(InternalError);
     }
 
-    const char* tmp = reinterpret_cast<const char*>(buffer_.data);
-
-    Json::Reader reader;
-    if (!reader.parse(tmp, tmp + buffer_.size, target))
+    if (!ReadJson(target, buffer_.data, buffer_.size))
     {
       LogError("Cannot convert some memory buffer to JSON");
       ORTHANC_PLUGINS_THROW_EXCEPTION(BadFileFormat);
@@ -292,12 +313,80 @@
   }
 
 
+  bool ReadJson(Json::Value& target,
+                const std::string& source)
+  {
+#if JSONCPP_USE_DEPRECATED == 1
+    Json::Reader reader;
+    return reader.parse(source, target);
+#else
+    return ReadJson(target, source.c_str(), source.size());
+#endif
+  }
+  
+
+  bool ReadJson(Json::Value& target,
+                const void* buffer,
+                size_t size)
+  {
+#if JSONCPP_USE_DEPRECATED == 1
+    Json::Reader reader;
+    return reader.parse(reinterpret_cast<const char*>(buffer),
+                        reinterpret_cast<const char*>(buffer) + size, target);
+#else
+    Json::CharReaderBuilder builder;
+    const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
+    assert(reader.get() != NULL);
+    JSONCPP_STRING err;
+    if (reader->parse(reinterpret_cast<const char*>(buffer),
+                      reinterpret_cast<const char*>(buffer) + size, &target, &err))
+    {
+      return true;
+    }
+    else
+    {
+      LogError("Cannot parse JSON: " + err);
+      return false;
+    }
+#endif
+  }
+  
+
+  void WriteFastJson(std::string& target,
+                     const Json::Value& source)
+  {
+#if JSONCPP_USE_DEPRECATED == 1
+    Json::FastWriter writer;
+    target = writer.write(source);
+#else
+    Json::StreamWriterBuilder builder;
+    builder.settings_["indentation"] = "";
+    target = Json::writeString(builder, source);
+#endif
+  }
+  
+
+  void WriteStyledJson(std::string& target,
+                       const Json::Value& source)
+  {
+#if JSONCPP_USE_DEPRECATED == 1
+    Json::StyledWriter writer;
+    target = writer.write(source);
+#else
+    Json::StreamWriterBuilder builder;
+    builder.settings_["indentation"] = "   ";
+    target = Json::writeString(builder, source);
+#endif
+  }
+
+
   bool MemoryBuffer::RestApiPost(const std::string& uri,
                                  const Json::Value& body,
                                  bool applyPlugins)
   {
-    Json::FastWriter writer;
-    return RestApiPost(uri, writer.write(body), applyPlugins);
+    std::string s;
+    WriteFastJson(s, body);
+    return RestApiPost(uri, s, applyPlugins);
   }
 
 
@@ -305,8 +394,9 @@
                                 const Json::Value& body,
                                 bool applyPlugins)
   {
-    Json::FastWriter writer;
-    return RestApiPut(uri, writer.write(body), applyPlugins);
+    std::string s;
+    WriteFastJson(s, body);
+    return RestApiPut(uri, s, applyPlugins);
   }
 
 
@@ -315,8 +405,8 @@
   {
     Clear();
 
-    Json::FastWriter writer;
-    std::string s = writer.write(tags);
+    std::string s;
+    WriteFastJson(s, tags);
 
     Check(OrthancPluginCreateDicom(GetGlobalContext(), &buffer_, s.c_str(), NULL, flags));
   }
@@ -327,8 +417,8 @@
   {
     Clear();
 
-    Json::FastWriter writer;
-    std::string s = writer.write(tags);
+    std::string s;
+    WriteFastJson(s, tags);
 
     Check(OrthancPluginCreateDicom(GetGlobalContext(), &buffer_, s.c_str(), pixelData.GetObject(), flags));
   }
@@ -390,8 +480,7 @@
       ORTHANC_PLUGINS_THROW_EXCEPTION(InternalError);
     }
 
-    Json::Reader reader;
-    if (!reader.parse(str_, target))
+    if (!ReadJson(target, str_))
     {
       LogError("Cannot convert some memory buffer to JSON");
       ORTHANC_PLUGINS_THROW_EXCEPTION(BadFileFormat);
@@ -1190,19 +1279,16 @@
 #endif /* HAS_ORTHANC_PLUGIN_FIND_MATCHER == 1 */
 
   void AnswerJson(const Json::Value& value,
-                  OrthancPluginRestOutput* output
-    )
+                  OrthancPluginRestOutput* output)
   {
-    Json::StyledWriter writer;
-    std::string bodyString = writer.write(value);
-
+    std::string bodyString;
+    WriteStyledJson(bodyString, value);    
     OrthancPluginAnswerBuffer(GetGlobalContext(), output, bodyString.c_str(), bodyString.size(), "application/json");
   }
 
   void AnswerString(const std::string& answer,
                     const char* mimeType,
-                    OrthancPluginRestOutput* output
-    )
+                    OrthancPluginRestOutput* output)
   {
     OrthancPluginAnswerBuffer(GetGlobalContext(), output, answer.c_str(), answer.size(), mimeType);
   }
@@ -1324,8 +1410,9 @@
                    const Json::Value& body,
                    bool applyPlugins)
   {
-    Json::FastWriter writer;
-    return RestApiPost(result, uri, writer.write(body), applyPlugins);
+    std::string s;
+    WriteFastJson(s, body);
+    return RestApiPost(result, uri, s, applyPlugins);
   }
 
 
@@ -1357,8 +1444,9 @@
                   const Json::Value& body,
                   bool applyPlugins)
   {
-    Json::FastWriter writer;
-    return RestApiPut(result, uri, writer.write(body), applyPlugins);
+    std::string s;
+    WriteFastJson(s, body);
+    return RestApiPut(result, uri, s, applyPlugins);
   }
 
 
@@ -2020,8 +2108,7 @@
     }
     else
     {
-      Json::FastWriter writer;
-      content_ = writer.write(content);
+      WriteFastJson(content_, content);
     }
   }
 
@@ -2041,8 +2128,7 @@
     }
     else
     {
-      Json::FastWriter writer;
-      serialized_ = writer.write(serialized);
+      WriteFastJson(serialized_, serialized);
       hasSerialized_ = true;
     }
   }
@@ -2902,8 +2988,7 @@
     std::string body;
     Execute(answerHeaders, body);
     
-    Json::Reader reader;
-    if (!reader.parse(body, answerBody))
+    if (!ReadJson(answerBody, body))
     {
       LogError("Cannot convert HTTP answer body to JSON");
       ORTHANC_PLUGINS_THROW_EXCEPTION(BadFileFormat);
--- a/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h	Fri Nov 06 18:06:55 2020 +0100
+++ b/Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h	Tue Dec 22 08:31:22 2020 +0100
@@ -476,6 +476,19 @@
 #endif
 
 
+  bool ReadJson(Json::Value& target,
+                const std::string& source);
+  
+  bool ReadJson(Json::Value& target,
+                const void* buffer,
+                size_t size);
+
+  void WriteFastJson(std::string& target,
+                     const Json::Value& source);
+
+  void WriteStyledJson(std::string& target,
+                       const Json::Value& source);
+
   bool RestApiGet(Json::Value& result,
                   const std::string& uri,
                   bool applyPlugins);