Set error code for getParsedJson API

This commit updates getParsedJson API to set error codes in case of
error. This helps caller of the API to take action based on the error
code returned from the API.

Change-Id: I0b88806bbc2201ae162e1714613fa6a9bfe3df9d
Signed-off-by: Rekha Aparna <vrekhaaparna@ibm.com>
diff --git a/vpd-manager/src/backup_restore.cpp b/vpd-manager/src/backup_restore.cpp
index 61d5ba5..89d7d2a 100644
--- a/vpd-manager/src/backup_restore.cpp
+++ b/vpd-manager/src/backup_restore.cpp
@@ -21,13 +21,16 @@
     std::string l_backupAndRestoreCfgFilePath =
         i_sysCfgJsonObj.value("backupRestoreConfigPath", "");
 
+    uint16_t l_errCode = 0;
     m_backupAndRestoreCfgJsonObj =
-        jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath);
+        jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath, l_errCode);
 
-    if (m_backupAndRestoreCfgJsonObj.empty())
+    if (l_errCode)
     {
-        throw JsonException("JSON parsing failed",
-                            l_backupAndRestoreCfgFilePath);
+        throw JsonException(
+            "JSON parsing failed for file [" + l_backupAndRestoreCfgFilePath +
+                "], error : " + vpdSpecificUtility::getErrCodeMsg(l_errCode),
+            l_backupAndRestoreCfgFilePath);
     }
 }
 
diff --git a/vpd-manager/src/event_logger.cpp b/vpd-manager/src/event_logger.cpp
index a9ba077..9959d2f 100644
--- a/vpd-manager/src/event_logger.cpp
+++ b/vpd-manager/src/event_logger.cpp
@@ -354,9 +354,20 @@
             {
                 if (!l_ec)
                 {
+                    nlohmann::json l_parsedJson = jsonUtility::getParsedJson(
+                        INVENTORY_JSON_SYM_LINK, l_errCode);
+
+                    if (l_errCode)
+                    {
+                        logging::logMessage(
+                            "Failed to parse JSON file [ " +
+                            std::string(INVENTORY_JSON_SYM_LINK) +
+                            " ], error : " +
+                            vpdSpecificUtility::getErrCodeMsg(l_errCode));
+                    }
+
                     l_calloutInvPath = jsonUtility::getInventoryObjPathFromJson(
-                        jsonUtility::getParsedJson(INVENTORY_JSON_SYM_LINK),
-                        std::get<0>(i_callouts[0]), l_errCode);
+                        l_parsedJson, std::get<0>(i_callouts[0]), l_errCode);
                 }
                 else
                 {
diff --git a/vpd-manager/src/listener.cpp b/vpd-manager/src/listener.cpp
index 435f3d9..87cb182 100644
--- a/vpd-manager/src/listener.cpp
+++ b/vpd-manager/src/listener.cpp
@@ -269,12 +269,17 @@
 {
     try
     {
+        uint16_t l_errCode = 0;
         m_correlatedPropJson =
-            jsonUtility::getParsedJson(i_correlatedPropJsonFile);
-        if (m_correlatedPropJson.empty())
+            jsonUtility::getParsedJson(i_correlatedPropJsonFile, l_errCode);
+
+        if (l_errCode)
         {
-            throw JsonException("Failed to parse correlated properties JSON",
-                                i_correlatedPropJsonFile);
+            throw JsonException(
+                "Failed to parse correlated properties JSON [" +
+                    i_correlatedPropJsonFile + "], error : " +
+                    vpdSpecificUtility::getErrCodeMsg(l_errCode),
+                i_correlatedPropJsonFile);
         }
 
         const nlohmann::json& l_serviceJsonObjectList =
diff --git a/vpd-manager/src/single_fab.cpp b/vpd-manager/src/single_fab.cpp
index f2c73f8..0b3875e 100644
--- a/vpd-manager/src/single_fab.cpp
+++ b/vpd-manager/src/single_fab.cpp
@@ -23,14 +23,24 @@
 {
     try
     {
+        uint16_t l_errCode = 0;
         auto l_parsedVsbpJsonObj =
-            jsonUtility::getParsedJson(pimPersistVsbpPath);
+            jsonUtility::getParsedJson(pimPersistVsbpPath, l_errCode);
+
+        if (l_errCode)
+        {
+            throw JsonException(
+                "Failed to parse JSON file [ " +
+                    std::string(pimPersistVsbpPath) + " ], error : " +
+                    vpdSpecificUtility::getErrCodeMsg(l_errCode),
+                pimPersistVsbpPath);
+        }
+
         if (!l_parsedVsbpJsonObj.contains("value0") ||
             !l_parsedVsbpJsonObj["value0"].contains(constants::kwdIM) ||
             !l_parsedVsbpJsonObj["value0"][constants::kwdIM].is_array())
         {
-            throw std::runtime_error(
-                "Json is empty or mandatory tag(s) missing from JSON");
+            throw std::runtime_error("Mandatory tag(s) missing from JSON");
         }
 
         const types::BinaryVector l_imValue =
diff --git a/vpd-manager/src/worker.cpp b/vpd-manager/src/worker.cpp
index 63989dc..a80957d 100644
--- a/vpd-manager/src/worker.cpp
+++ b/vpd-manager/src/worker.cpp
@@ -42,7 +42,17 @@
 
         try
         {
-            m_parsedJson = jsonUtility::getParsedJson(m_configJsonPath);
+            uint16_t l_errCode = 0;
+            m_parsedJson =
+                jsonUtility::getParsedJson(m_configJsonPath, l_errCode);
+
+            if (l_errCode)
+            {
+                throw std::runtime_error(
+                    "JSON parsing failed for file [ " + m_configJsonPath +
+                    " ], error : " +
+                    vpdSpecificUtility::getErrCodeMsg(l_errCode));
+            }
 
             // check for mandatory fields at this point itself.
             if (!m_parsedJson.contains("frus"))
@@ -373,12 +383,17 @@
             "No system JSON found corresponding to IM read from VPD.");
     }
 
-    // re-parse the JSON once appropriate JSON has been selected.
-    m_parsedJson = jsonUtility::getParsedJson(systemJson);
+    uint16_t l_errCode = 0;
 
-    if (m_parsedJson.empty())
+    // re-parse the JSON once appropriate JSON has been selected.
+    m_parsedJson = jsonUtility::getParsedJson(systemJson, l_errCode);
+
+    if (l_errCode)
     {
-        throw(JsonException("Json parsing failed", systemJson));
+        throw(JsonException(
+            "JSON parsing failed for file [ " + systemJson +
+                " ], error : " + vpdSpecificUtility::getErrCodeMsg(l_errCode),
+            systemJson));
     }
 
     std::string devTreeFromJson;
@@ -1594,16 +1609,21 @@
 {
     try
     {
+        uint16_t l_errCode = 0;
         std::string l_backupAndRestoreCfgFilePath =
             m_parsedJson.value("backupRestoreConfigPath", "");
 
         nlohmann::json l_backupAndRestoreCfgJsonObj =
-            jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath);
+            jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath,
+                                       l_errCode);
 
-        if (l_backupAndRestoreCfgJsonObj.empty())
+        if (l_errCode)
         {
-            throw JsonException("JSON parsing failed",
-                                l_backupAndRestoreCfgFilePath);
+            throw JsonException(
+                "JSON parsing failed for file [ " +
+                    l_backupAndRestoreCfgFilePath + " ], error : " +
+                    vpdSpecificUtility::getErrCodeMsg(l_errCode),
+                l_backupAndRestoreCfgFilePath);
         }
 
         // check if either of "source" or "destination" has inventory path.