sel entry: Use registerHandler instead of ipmi_register_callback

Since ipmi_register_callback declared in api.h has been gradually
deprecated, this submission is to use registerHandler instead of
ipmi_register_callback.

Change-Id: I706897d656dccc779fe5b0763c1f6c8feb21e89b
Signed-off-by: George Liu <liuxiwei@ieisystem.com>
diff --git a/selutility.hpp b/selutility.hpp
index c6ba6b0..ace17d8 100644
--- a/selutility.hpp
+++ b/selutility.hpp
@@ -57,18 +57,6 @@
 static constexpr bool getSelAllocationInfo = false;
 } // namespace operationSupport
 
-/** @struct GetSELEntryRequest
- *
- *  IPMI payload for Get SEL Entry command request.
- */
-struct GetSELEntryRequest
-{
-    uint16_t reservationID; //!< Reservation ID.
-    uint16_t selRecordID;   //!< SEL Record ID.
-    uint8_t offset;         //!< Offset into record.
-    uint8_t readLength;     //!< Bytes to read.
-} __attribute__((packed));
-
 constexpr size_t SELRecordLength = 16;
 
 /** @struct SELEventRecord
diff --git a/storagehandler.cpp b/storagehandler.cpp
index 43cc142..c9cf08d 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -282,25 +282,17 @@
         ipmi::sel::operationSupport::overflow);
 }
 
-ipmi::Cc getSELEntry(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request,
-                     ipmi_response_t response, ipmi_data_len_t data_len,
-                     ipmi_context_t)
+ipmi::RspType<uint16_t,            // Next Record ID
+              std::vector<uint8_t> // SEL data
+              >
+    getSELEntry(uint16_t reservationID, uint16_t selRecordID, uint8_t offset,
+                uint8_t readLength)
 {
-    if (*data_len != sizeof(ipmi::sel::GetSELEntryRequest))
+    if (reservationID != 0)
     {
-        *data_len = 0;
-        return ipmi::ccReqDataLenInvalid;
-    }
-
-    auto requestData =
-        reinterpret_cast<const ipmi::sel::GetSELEntryRequest*>(request);
-
-    if (requestData->reservationID != 0)
-    {
-        if (!checkSELReservation(requestData->reservationID))
+        if (!checkSELReservation(reservationID))
         {
-            *data_len = 0;
-            return ipmi::ccInvalidReservationId;
+            return ipmi::responseInvalidReservationId();
         }
     }
 
@@ -312,18 +304,17 @@
 
     if (selCacheMap.empty())
     {
-        *data_len = 0;
-        return ipmi::ccSensorInvalid;
+        return ipmi::responseSensorInvalid();
     }
 
     SELCacheMap::const_iterator iter;
 
     // Check for the requested SEL Entry.
-    if (requestData->selRecordID == ipmi::sel::firstEntry)
+    if (selRecordID == ipmi::sel::firstEntry)
     {
         iter = selCacheMap.begin();
     }
-    else if (requestData->selRecordID == ipmi::sel::lastEntry)
+    else if (selRecordID == ipmi::sel::lastEntry)
     {
         if (selCacheMap.size() > 1)
         {
@@ -338,11 +329,10 @@
     }
     else
     {
-        iter = selCacheMap.find(requestData->selRecordID);
+        iter = selCacheMap.find(selRecordID);
         if (iter == selCacheMap.end())
         {
-            *data_len = 0;
-            return ipmi::ccSensorInvalid;
+            return ipmi::responseSensorInvalid();
         }
     }
 
@@ -358,35 +348,32 @@
         record.nextRecordID = iter->first;
     }
 
-    if (requestData->readLength == ipmi::sel::entireRecord)
+    uint16_t nextRecordID = record.nextRecordID;
+    std::vector<uint8_t> buffer;
+    if (readLength == ipmi::sel::entireRecord)
     {
-        std::memcpy(response, &record, sizeof(record));
-        *data_len = sizeof(record);
+        buffer.resize(sizeof(record));
+        std::memcpy(buffer.data(), &record.event, sizeof(record.event));
     }
     else
     {
-        if (requestData->offset >= ipmi::sel::selRecordSize ||
-            requestData->readLength > ipmi::sel::selRecordSize)
+        if (offset >= ipmi::sel::selRecordSize ||
+            readLength > ipmi::sel::selRecordSize)
         {
-            *data_len = 0;
-            return ipmi::ccInvalidFieldRequest;
+            return ipmi::responseInvalidFieldRequest();
         }
 
-        auto diff = ipmi::sel::selRecordSize - requestData->offset;
-        auto readLength =
-            std::min(diff, static_cast<int>(requestData->readLength));
+        auto diff = ipmi::sel::selRecordSize - offset;
+        auto minReadLength = std::min(diff, static_cast<int>(readLength));
 
-        uint16_t nextRecordID = record.nextRecordID;
-        std::memcpy(response, &nextRecordID, sizeof(nextRecordID));
-
+        buffer.resize(minReadLength);
         const ipmi::sel::SELEventRecordFormat* evt = &record.event;
-        std::memcpy(static_cast<uint8_t*>(response) + sizeof(nextRecordID),
-                    reinterpret_cast<const uint8_t*>(evt) + requestData->offset,
-                    readLength);
-        *data_len = sizeof(nextRecordID) + readLength;
+        std::memcpy(buffer.data(),
+                    reinterpret_cast<const uint8_t*>(evt) + offset,
+                    minReadLength);
     }
 
-    return ipmi::ccSuccess;
+    return ipmi::responseSuccess(nextRecordID, buffer);
 }
 
 /** @brief implements the delete SEL entry command
@@ -893,8 +880,9 @@
                           ipmiStorageGetSelTimeUtcOffset);
 
     // <Get SEL Entry>
-    ipmi_register_callback(ipmi::netFnStorage, ipmi::storage::cmdGetSelEntry,
-                           nullptr, getSELEntry, PRIVILEGE_USER);
+    ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
+                          ipmi::storage::cmdGetSelEntry, ipmi::Privilege::User,
+                          getSELEntry);
 
     // <Delete SEL Entry>
     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,