Handle CPU Module and FRU in write VPD

Test-
1. Using vpd-tool
 ./vpd-tool --readKeyword   --object  /system/chassis/motherboard --record VINI --keyword SN
{
    "/system/chassis/motherboard": {
        "SN": "YL2E2D010000"
    }
}
 ./vpd-tool --writeKeyword    --object  /system/chassis/motherboard --record VINI --keyword SN --value 0x303030

 ./vpd-tool --readKeyword   --object  /system/chassis/motherboard --record VINI --keyword SN           {
    "/system/chassis/motherboard": {
        "SN": "000E2D010000"
    }
}

COM interface-

Change-Id: I39ee0448483be581da254f5633b0817637292dff
-------------
.SN                                                  property  ay        12 48 48 48 69 50 68 48 49 48 48 48 48   emits-change writable

Common Interface-
----------------
xyz.openbmc_project.Inventory.Decorator.Asset        interface -         -                                        -
.SerialNumber                                        property  s         "000E2D010000"                           emits-change writable

sys path updated-
--------
00000110  35 53 4e 0c 30 30 30 45  32 44 30 31 30 30 30 30  |5SN.000E2D010000|

2. Tested on simics with spi driver supported image for 1 DCM
verified CPUs and other FRUs to work as expected.

1- busctl call WriteKeyword ossay  "/system/chassis/motherboard/cpu0" "VINI" "DR" 1 65
Updating CI, so updated cpu0, cpu1 and spi2 vpd.

2- busctl call WriteKeyword ossay  "/system/chassis/motherboard/cpu1" "VINI" "DR" 1 66
Updating CI, so updated cpu0, cpu1 and spi2 vpd.

3- busctl call WriteKeyword ossay  "/system/chassis/motherboard/cpu0" "VINI" "CC" 1 67
Not a CI, so only cpu0 and spi2 vpd updated.

4- busctl call WriteKeyword ossay  "/system/chassis/motherboard/cpu1" "VINI" "CC" 1 67
Not a CI, so only cpu1 and spi6 vpd updated.

cpu1 updated 1 Byte data of DR (7)-
busctl call WriteKeyword ossay "/system/chassis/motherboard/cpu1" "VINI" "DR" 1 55

Read file info at spi2.0/spi2.00/nvmem offset 0x30000-
000001a0  04 56 49 4e 49 44 52 10  37 20 57 41 59 20 20 50  |.VINIDR.7 WAY  P|  <--DR updated 1 Byte

Change-Id: I5e99c1ac4e09b2d0e05be18a10d1d50eba22fea2
Signed-off-by: Alpana Kumari <alpankum@in.ibm.com>
diff --git a/vpd-manager/editor_impl.hpp b/vpd-manager/editor_impl.hpp
index b3d24f7..d4d5598 100644
--- a/vpd-manager/editor_impl.hpp
+++ b/vpd-manager/editor_impl.hpp
@@ -65,9 +65,10 @@
      *  @param[in] path - Path to the vpd file
      */
     EditorImpl(const inventory::Path& path, const nlohmann::json& json,
-               const std::string& record, const std::string& kwd) :
+               const std::string& record, const std::string& kwd,
+               const sdbusplus::message::object_path& inventoryPath) :
         vpdFilePath(path),
-        jsonFile(json), thisRecord(record, kwd)
+        objPath(inventoryPath), jsonFile(json), thisRecord(record, kwd)
     {
     }
 
@@ -151,11 +152,17 @@
                       const std::string& property, const std::variant<T>& data);
 
     // path to the VPD file to edit
-    const inventory::Path vpdFilePath;
+    inventory::Path vpdFilePath;
+
+    // inventory path of fru/module to update keyword
+    const inventory::Path objPath;
 
     // stream to perform operation on file
     std::fstream vpdFileStream;
 
+    // offset to get vpd data from EEPROM
+    uint32_t offset;
+
     // file to store parsed json
     const nlohmann::json jsonFile;
 
@@ -181,6 +188,25 @@
 
     Binary vpdFile;
 
+    // If requested Interface is common Interface
+    bool isCI;
+
+    /** @brief This API will be used to find out Parent FRU of Module/CPU
+     *
+     * @param[in] - moduleObjPath, object path of that FRU
+     * @param[in] - fruType, Type of Parent FRU
+     *              for Module/CPU Parent Type- FruAndModule
+     *
+     * @return returns vpd file path of Parent Fru of that Module
+     */
+    std::string getSysPathForThisFruType(const std::string& moduleObjPath,
+                                         const std::string& fruType);
+
+    /** @brief This API will search for correct EEPROM path for asked CPU
+     *         and will init vpdFilePath
+     */
+    void getVpdPathForCpu();
+
 }; // class EditorImpl
 
 } // namespace editor