Add dbus service to support MDR V2 - part 2

Add send and get directory function for MDR V2 ipmi
command store and get data through dbus interface.

Signed-off-by: Cheng C Yang <cheng.c.yang@linux.intel.com>
Change-Id: I8c0718e20911e329086f29ad1cc227d1a6a1b91b
diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index 7568603..afdb897 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -30,6 +30,36 @@
 
 std::vector<uint8_t> MDR_V2::getDirectoryInformation(uint8_t dirIndex)
 {
+    std::vector<uint8_t> responseDir;
+    if (dirIndex > smbiosDir.dirEntries)
+    {
+        responseDir.push_back(0);
+        throw sdbusplus::xyz::openbmc_project::Smbios::MDR_V2::Error::
+            InvalidParameter();
+    }
+    responseDir.push_back(mdr2Version);
+    responseDir.push_back(smbiosDir.dirVersion);
+    uint8_t returnedEntries = smbiosDir.dirEntries - dirIndex;
+    responseDir.push_back(returnedEntries);
+    if ((dirIndex + returnedEntries) >= smbiosDir.dirEntries)
+    {
+        responseDir.push_back(0);
+    }
+    else
+    {
+        responseDir.push_back(smbiosDir.dirEntries - dirIndex -
+                              returnedEntries);
+    }
+    for (uint8_t index = dirIndex; index < smbiosDir.dirEntries; index++)
+    {
+        for (uint8_t indexId = 0; indexId < sizeof(DataIdStruct); indexId++)
+        {
+            responseDir.push_back(
+                smbiosDir.dir[index].common.id.dataInfo[indexId]);
+        }
+    }
+
+    return responseDir;
 }
 
 bool MDR_V2::smbiosIsAvailForUpdate(uint8_t index)
@@ -153,6 +183,57 @@
                                       uint8_t remainingEntries,
                                       std::vector<uint8_t> dirEntry)
 {
+    bool teminate = false;
+    if ((dirIndex >= maxDirEntries) || (returnedEntries < 1))
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Send Dir info failed - input parameter invalid");
+        throw sdbusplus::xyz::openbmc_project::Smbios::MDR_V2::Error::
+            InvalidParameter();
+    }
+    if (dirEntry.size() < sizeof(Mdr2DirEntry))
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Directory size invalid");
+        throw sdbusplus::xyz::openbmc_project::Smbios::MDR_V2::Error::
+            InvalidParameter();
+    }
+    if (dirVersion == smbiosDir.dirVersion)
+    {
+        teminate = true;
+    }
+    else
+    {
+        if (remainingEntries > 0)
+        {
+            teminate = false;
+        }
+        else
+        {
+            teminate = true;
+            smbiosDir.dirVersion = dirVersion;
+        }
+        uint8_t idIndex = dirIndex;
+
+        uint8_t* pData = dirEntry.data();
+        if (pData == nullptr)
+        {
+            return false;
+        }
+        for (uint8_t index = 0; index < returnedEntries; index++)
+        {
+            auto data = reinterpret_cast<const Mdr2DirEntry*>(pData);
+            smbiosDir.dir[idIndex + index].common.dataVersion =
+                data->dataVersion;
+            std::copy(data->id.dataInfo,
+                      data->id.dataInfo + sizeof(DataIdStruct),
+                      smbiosDir.dir[idIndex + index].common.id.dataInfo);
+            smbiosDir.dir[idIndex + index].common.dataSetSize = data->size;
+            smbiosDir.dir[idIndex + index].common.timestamp = data->timestamp;
+            pData += sizeof(returnedEntries);
+        }
+    }
+    return teminate;
 }
 
 bool MDR_V2::sendDataInformation(uint8_t idIndex, uint8_t flag,