From 4e29bcfc0954b7b37257022cf66dc60cad8b56b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 5 Feb 2025 15:54:50 -0500
Subject: [PATCH] utils: use parseJson

Change-Id: I827de0a30a32e75e21993b435a0a68d71d846653
---
 src/call.cpp                           |  6 ++---
 src/conference.cpp                     |  8 +++---
 src/jamidht/account_manager.cpp        | 17 +++---------
 src/jamidht/account_manager.h          |  1 -
 src/jamidht/conversationrepository.cpp | 37 +++++---------------------
 src/jamidht/jamiaccount.cpp            | 24 ++++-------------
 src/jamidht/namedirectory.cpp          | 23 +++-------------
 7 files changed, 22 insertions(+), 94 deletions(-)

diff --git a/src/call.cpp b/src/call.cpp
index 710e7e268..2eb52f1ad 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -33,6 +33,7 @@
 #include "enumclass_utils.h"
 
 #include "errno.h"
+#include "json_utils.h"
 
 #include <dhtnet/ip_utils.h>
 #include <opendht/thread_pool.h>
@@ -636,10 +637,7 @@ Call::setConferenceInfo(const std::string& msg)
 {
     ConfInfo newInfo;
     Json::Value json;
-    std::string err;
-    Json::CharReaderBuilder rbuilder;
-    auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-    if (reader->parse(msg.data(), msg.data() + msg.size(), &json, &err)) {
+    if (parseJson(msg, json)) {
         if (json.isObject()) {
             // new confInfo
             if (json.isMember("p")) {
diff --git a/src/conference.cpp b/src/conference.cpp
index e1671da22..b844e19c9 100644
--- a/src/conference.cpp
+++ b/src/conference.cpp
@@ -43,6 +43,7 @@
 #include "jami/media_const.h"
 #include "audio/ringbufferpool.h"
 #include "sip/sipcall.h"
+#include "json_utils.h"
 
 #include <opendht/thread_pool.h>
 
@@ -1119,12 +1120,9 @@ Conference::onConfOrder(const std::string& callId, const std::string& confOrder)
     // Check if the peer is a master
     if (auto call = getCall(callId)) {
         const auto& peerId = getRemoteId(call);
-        std::string err;
         Json::Value root;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (!reader->parse(confOrder.c_str(), confOrder.c_str() + confOrder.size(), &root, &err)) {
-            JAMI_WARN("Unable to parse conference order from %s", peerId.c_str());
+        if (!parseJson(confOrder, root)) {
+            JAMI_WARNING("Unable to parse conference order from {}", peerId);
             return;
         }
 
diff --git a/src/jamidht/account_manager.cpp b/src/jamidht/account_manager.cpp
index 6fe707aeb..6f839a1bc 100644
--- a/src/jamidht/account_manager.cpp
+++ b/src/jamidht/account_manager.cpp
@@ -24,6 +24,7 @@
 #include "manager.h"
 
 #include "libdevcrypto/Common.h"
+#include "json_utils.h"
 
 #include <opendht/thread_pool.h>
 #include <opendht/crypto.h>
@@ -213,8 +214,8 @@ AccountManager::useIdentity(const dht::crypto::Identity& identity,
         return nullptr;
     }
 
-    auto root = announceFromReceipt(receipt);
-    if (!root.isMember("announce")) {
+    Json::Value root;
+    if (!parseJson(receipt, root) || !root.isMember("announce")) {
         JAMI_ERROR("[Account {}] [Auth] device receipt parsing error", accountId_);
         return nullptr;
     }
@@ -268,18 +269,6 @@ AccountManager::reloadContacts()
     }
 }
 
-Json::Value
-AccountManager::announceFromReceipt(const std::string& receipt)
-{
-    Json::Value root;
-    Json::CharReaderBuilder rbuilder;
-    auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-    if (!reader->parse(&receipt[0], &receipt[receipt.size()], &root, nullptr)) {
-        JAMI_ERROR("[Account {}] error parsing device receipt", accountId_);
-    }
-    return root;
-}
-
 void
 AccountManager::startSync(const OnNewDeviceCb& cb, const OnDeviceAnnouncedCb& dcb, bool publishPresence)
 {
diff --git a/src/jamidht/account_manager.h b/src/jamidht/account_manager.h
index 32b75e759..3a5c8ee7b 100644
--- a/src/jamidht/account_manager.h
+++ b/src/jamidht/account_manager.h
@@ -135,7 +135,6 @@ public:
                                    const std::vector<uint8_t>& receiptSignature,
                                    const std::string& username,
                                    const OnChangeCallback& onChange);
-    Json::Value announceFromReceipt(const std::string& receipt);
 
     void setDht(const std::shared_ptr<dht::DhtRunner>& dht) { dht_ = dht; }
 
diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 8112003aa..7b5715a66 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -24,6 +24,7 @@
 #include "string_utils.h"
 #include "client/ring_signal.h"
 #include "vcard.h"
+#include "json_utils.h"
 
 #include <ctime>
 #include <fstream>
@@ -1740,14 +1741,9 @@ ConversationRepository::Impl::checkInitialCommit(const std::string& userDevice,
 
     std::string invited = {};
     if (mode_ == ConversationMode::ONE_TO_ONE) {
-        std::string err;
         Json::Value cm;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (reader->parse(commitMsg.data(), commitMsg.data() + commitMsg.size(), &cm, &err)) {
+        if (parseJson(commitMsg, cm)) {
             invited = cm["invited"].asString();
-        } else {
-            JAMI_WARNING("{}", err);
         }
     }
 
@@ -2012,11 +2008,8 @@ ConversationRepository::Impl::mode() const
     }
     auto commitMsg = lastMsg[0].commit_msg;
 
-    std::string err;
     Json::Value root;
-    Json::CharReaderBuilder rbuilder;
-    auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-    if (!reader->parse(commitMsg.data(), commitMsg.data() + commitMsg.size(), &root, &err)) {
+    if (!parseJson(commitMsg, root)) {
         emitSignal<libjami::ConversationSignal::OnConversationError>(accountId_,
                                                                         id_,
                                                                         EINVALIDMODE,
@@ -2384,14 +2377,8 @@ ConversationRepository::Impl::getInitialMembers() const
         return {};
     auto authorId = cert->issuer->getId().toString();
     if (mode() == ConversationMode::ONE_TO_ONE) {
-        std::string err;
         Json::Value root;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (!reader->parse(commit.commit_msg.data(),
-                           commit.commit_msg.data() + commit.commit_msg.size(),
-                           &root,
-                           &err)) {
+        if (!parseJson(commit.commit_msg, root)) {
             return {authorId};
         }
         if (root.isMember("invited") && root["invited"].asString() != authorId)
@@ -2531,14 +2518,8 @@ ConversationRepository::Impl::convCommitToMap(const ConversationCommit& commit)
     std::string body {};
     std::map<std::string, std::string> message;
     if (type.empty()) {
-        std::string err;
         Json::Value cm;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (reader->parse(commit.commit_msg.data(),
-                          commit.commit_msg.data() + commit.commit_msg.size(),
-                          &cm,
-                          &err)) {
+        if (parseJson(commit.commit_msg, cm)) {
             for (auto const& id : cm.getMemberNames()) {
                 if (id == "type") {
                     type = cm[id].asString();
@@ -2546,8 +2527,6 @@ ConversationRepository::Impl::convCommitToMap(const ConversationCommit& commit)
                 }
                 message.insert({id, cm[id].asString()});
             }
-        } else {
-            JAMI_WARNING("{}", err);
         }
     }
     if (type.empty()) {
@@ -2732,15 +2711,11 @@ ConversationRepository::Impl::validCommits(
             }
         } else if (commit.parents.size() == 1) {
             std::string type = {}, editId = {};
-            std::string err;
             Json::Value cm;
-            Json::CharReaderBuilder rbuilder;
-            auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-            if (reader->parse(commit.commit_msg.data(), commit.commit_msg.data() + commit.commit_msg.size(), &cm, &err)) {
+            if (parseJson(commit.commit_msg, cm)) {
                 type = cm["type"].asString();
                 editId = cm["edit"].asString();
             } else {
-                JAMI_WARNING("{}", err);
                 emitSignal<libjami::ConversationSignal::OnConversationError>(
                     accountId_, id_, EVALIDFETCH, "Malformed commit");
                 return false;
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index d52fc3157..75ac0eba9 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -68,6 +68,7 @@
 #include "string_utils.h"
 #include "archiver.h"
 #include "data_transfer.h"
+#include "json_utils.h"
 
 #include "libdevcrypto/Common.h"
 #include "base64.h"
@@ -923,11 +924,8 @@ JamiAccount::loadConfig()
         try {
             auto str = fileutils::loadCacheTextFile(cachePath_ / "dhtproxy",
                                                     std::chrono::hours(24 * 7));
-            std::string err;
             Json::Value root;
-            Json::CharReaderBuilder rbuilder;
-            auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-            if (reader->parse(str.data(), str.data() + str.size(), &root, &err)) {
+            if (parseJson(str, root)) {
                 proxyServerCached_ = root[getProxyConfigKey()].asString();
             }
         } catch (const std::exception& e) {
@@ -3161,11 +3159,7 @@ JamiAccount::sendMessage(const std::string& to,
     // to load the conversation.
     auto extractIdFromJson = [](const std::string& jsonData) -> std::string {
         Json::Value parsed;
-        Json::CharReaderBuilder readerBuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(readerBuilder.newCharReader());
-        std::string errors;
-
-        if (reader->parse(jsonData.c_str(), jsonData.c_str() + jsonData.size(), &parsed, &errors)) {
+        if (parseJson(jsonData, parsed)) {
             auto value = parsed.get("id", Json::nullValue);
             if (value && value.isString()) {
                 return value.asString();
@@ -3518,11 +3512,7 @@ JamiAccount::handleMessage(const std::string& from, const std::pair<std::string,
 {
     if (m.first == MIME_TYPE_GIT) {
         Json::Value json;
-        std::string err;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (!reader->parse(m.second.data(), m.second.data() + m.second.size(), &json, &err)) {
-            JAMI_ERROR("Unable to parse server response: {}", err);
+        if (!parseJson(m.second, json)) {
             return false;
         }
 
@@ -3542,11 +3532,7 @@ JamiAccount::handleMessage(const std::string& from, const std::pair<std::string,
         return true;
     } else if (m.first == MIME_TYPE_INVITE_JSON) {
         Json::Value json;
-        std::string err;
-        Json::CharReaderBuilder rbuilder;
-        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-        if (!reader->parse(m.second.data(), m.second.data() + m.second.size(), &json, &err)) {
-            JAMI_ERROR("Unable to parse server response: {}", err);
+        if (!parseJson(m.second, json)) {
             return false;
         }
         convModule()->onConversationRequest(from, json);
diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp
index 9e7998ef0..38716acc3 100644
--- a/src/jamidht/namedirectory.cpp
+++ b/src/jamidht/namedirectory.cpp
@@ -37,7 +37,7 @@
 
 #include <cstddef>
 #include <msgpack.hpp>
-#include <json/json.h>
+#include "json_utils.h"
 
 /* for visual studio */
 #include <ciso646>
@@ -200,16 +200,7 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb)
                 } else {
                     try {
                         Json::Value json;
-                        std::string err;
-                        Json::CharReaderBuilder rbuilder;
-                        auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-                        if (!reader->parse(response.body.data(),
-                                           response.body.data() + response.body.size(),
-                                           &json,
-                                           &err)) {
-                            JAMI_DBG("Address lookup for %s: Unable to parse server response: %s",
-                                     addr.c_str(),
-                                     response.body.c_str());
+                        if (!parseJson(response.body, json)) {
                             cb("", "", Response::error);
                             return;
                         }
@@ -285,15 +276,7 @@ NameDirectory::lookupName(const std::string& name, LookupCallback cb)
             } else {
                 try {
                     Json::Value json;
-                    std::string err;
-                    Json::CharReaderBuilder rbuilder;
-                    auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader());
-                    if (!reader->parse(response.body.data(),
-                                       response.body.data() + response.body.size(),
-                                       &json,
-                                       &err)) {
-                        JAMI_ERROR("Name lookup for {}: Unable to parse server response: {}",
-                                 name, response.body);
+                    if (!parseJson(response.body, json)) {
                         cb("", "", Response::error);
                         return;
                     }
-- 
GitLab