Memory VPD parser

This commit supports Implementation part of Memory vpd parser.
JSON support for DIMMs need to be done, so not tested.

Change-Id: I6bff9c75a335b0267d8f2b9fa4f1905953b24da5
Signed-off-by: Alpana Kumari <alpankum@in.ibm.com>
diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index 24363d0..ac96295 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -2,6 +2,7 @@
 
 #include "defines.hpp"
 #include "keyword_vpd_parser.hpp"
+#include "memory_vpd_parser.hpp"
 #include "parser.hpp"
 #include "utils.hpp"
 
@@ -24,6 +25,7 @@
 namespace fs = filesystem;
 using json = nlohmann::json;
 using namespace openpower::vpd::inventory;
+using namespace openpower::vpd::memory::parser;
 
 /**
  * @brief Expands location codes
@@ -475,10 +477,23 @@
                 KeywordVpdParser parserObj(move(vpdVector));
                 // Invoking KW Vpd Parser
                 const auto& kwValMap = parserObj.parseKwVpd();
-                string preIntrStr = "com.ibm.kwvpd.KWVPD";
+                string preIntrStr = "com.ibm.ipzvpd.VINI";
                 populateDbus(kwValMap, js, file, preIntrStr);
             }
             break;
+
+            case MEMORY_VPD:
+            {
+                // Get an object to call API & get the key-value map
+                memoryVpdParser vpdParser(move(vpdVector));
+                const auto& memKwValMap = vpdParser.parseMemVpd();
+
+                string preIntrStr = "com.ibm.kwvpd.KWVPD";
+                // js(define dimm sys path in js), ObjPath(define in JS)
+                populateDbus(memKwValMap, js, file, preIntrStr);
+            }
+            break;
+
             default:
                 throw std::runtime_error("Invalid VPD format");
         }
diff --git a/memory_vpd_parser.cpp b/memory_vpd_parser.cpp
new file mode 100644
index 0000000..0fae663
--- /dev/null
+++ b/memory_vpd_parser.cpp
@@ -0,0 +1,60 @@
+#include "memory_vpd_parser.hpp"
+
+#include <iostream>
+#include <numeric>
+#include <string>
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+using namespace inventory;
+using namespace parser;
+using namespace constants;
+using namespace std;
+
+KeywordVpdMap memoryVpdParser::readKeywords(Binary::const_iterator iterator)
+{
+    KeywordVpdMap map{};
+
+    vector<uint8_t> partNumber(iterator, iterator + PART_NUM_LEN);
+
+    advance(iterator, PART_NUM_LEN);
+    vector<uint8_t> serialNumber(iterator, iterator + SERIAL_NUM_LEN);
+
+    advance(iterator, SERIAL_NUM_LEN);
+    vector<uint8_t> ccin(iterator, iterator + CCIN_LEN);
+
+    map.emplace("PN", move(partNumber));
+    map.emplace("SN", move(serialNumber));
+    map.emplace("CC", move(ccin));
+
+    return map;
+}
+
+KeywordVpdMap memoryVpdParser::parseMemVpd()
+{
+    // check if vpd file is empty
+    if (memVpd.empty())
+    {
+        throw runtime_error("VPD file is empty.");
+    }
+
+    // Read the data and return the map
+    auto iterator = memVpd.cbegin();
+    // point the iterator to DIMM data and skip "11S"
+    advance(iterator, MEMORY_VPD_DATA_START + 3);
+
+    auto vpdDataMap = readKeywords(iterator);
+
+    return vpdDataMap;
+}
+
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/memory_vpd_parser.hpp b/memory_vpd_parser.hpp
new file mode 100644
index 0000000..18f4519
--- /dev/null
+++ b/memory_vpd_parser.hpp
@@ -0,0 +1,55 @@
+#pragma once
+
+#include "impl.hpp"
+#include "types.hpp"
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+
+class memoryVpdParser
+{
+  public:
+    /**
+     * @brief Move Constructor
+     *
+     * Move kwVpdVector to parser object's kwVpdVector
+     */
+    memoryVpdParser(Binary&& memVpdVector) : memVpd(std::move(memVpdVector))
+    {
+    }
+
+    /**
+     * @brief Destructor
+     *
+     * Delete the parser object
+     */
+    ~memoryVpdParser(){};
+
+    /**
+     * @brief Parse the memory VPD binary data.
+     *
+     * Collects and emplace the keyword-value pairs in map.
+     *
+     * @return map of keyword:value
+     */
+    inventory::KeywordVpdMap parseMemVpd();
+
+  private:
+    /**
+     */
+    inventory::KeywordVpdMap readKeywords(Binary::const_iterator iterator);
+
+    /**
+     */
+    Binary memVpd;
+};
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/meson.build b/meson.build
index 7d76402..affd99f 100644
--- a/meson.build
+++ b/meson.build
@@ -46,7 +46,8 @@
                                 'utils.cpp',
                                 'keyword_vpd_parser.cpp',
                                 'vpdecc/vpdecc.c',
-                                'vpdecc/vpdecc_support.c'
+                                'vpdecc/vpdecc_support.c',
+                                'memory_vpd_parser.cpp'
                                ]
 
         ibm_vpd_exe = executable(