# HG changeset patch # User Sebastien Jodogne # Date 1608622282 -3600 # Node ID cfeda58d0c8ebe0cb370ef2dfbe245c4103e7e2d # Parent 3abebab5d00447c461b5535cbe54184a26adf76e remove calls to deprecated classes of JsonCpp diff -r 3abebab5d004 -r cfeda58d0c8e Framework/HttpQueries/DetectTransferPlugin.cpp --- 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 #include - -#include +#include 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(answer), - reinterpret_cast(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 diff -r 3abebab5d004 -r cfeda58d0c8e Framework/PullMode/PullJob.cpp --- 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 // For std::unique_ptr #include -#include - 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_)) diff -r 3abebab5d004 -r cfeda58d0c8e Framework/PushMode/PushJob.cpp --- 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 // For std::unique_ptr #include -#include - 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())); diff -r 3abebab5d004 -r cfeda58d0c8e Plugin/Plugin.cpp --- 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 #include #include +#include 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); diff -r 3abebab5d004 -r cfeda58d0c8e Resources/Orthanc/CMake/DownloadOrthancFramework.cmake --- 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 diff -r 3abebab5d004 -r cfeda58d0c8e Resources/Orthanc/Plugins/OrthancPluginCppWrapper.cpp --- 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 #include #include + + #include +#include #include +#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(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(buffer), + reinterpret_cast(buffer) + size, target); +#else + Json::CharReaderBuilder builder; + const std::unique_ptr reader(builder.newCharReader()); + assert(reader.get() != NULL); + JSONCPP_STRING err; + if (reader->parse(reinterpret_cast(buffer), + reinterpret_cast(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); diff -r 3abebab5d004 -r cfeda58d0c8e Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h --- 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);