sdr: 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: I0adfcd6c0e41daafe2d81918a527925997f96585
Signed-off-by: George Liu <liuxiwei@ieisystem.com>
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index a175f20..e641a93 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -1128,8 +1128,7 @@
 }
 
 ipmi::Cc populate_record_from_dbus(get_sdr::SensorDataFullRecordBody* body,
-                                   const ipmi::sensor::Info* info,
-                                   ipmi_data_len_t)
+                                   const ipmi::sensor::Info* info)
 {
     /* Functional sensor case */
     if (isAnalogSensor(info->propertyInterfaces.begin()->first))
@@ -1166,27 +1165,24 @@
     return ipmi::ccSuccess;
 };
 
-ipmi::Cc ipmi_fru_get_sdr(ipmi_request_t request, ipmi_response_t response,
-                          ipmi_data_len_t data_len)
+ipmi::RspType<uint16_t,            // nextRecordId
+              std::vector<uint8_t> // recordData
+              >
+    ipmiFruGetSdr(uint16_t recordID, uint8_t offset, uint8_t bytesToRead)
 {
-    auto req = reinterpret_cast<get_sdr::GetSdrReq*>(request);
-    auto resp = reinterpret_cast<get_sdr::GetSdrResp*>(response);
-    get_sdr::SensorDataFruRecord record{};
-    auto dataLength = 0;
-
     auto fru = frus.begin();
     uint8_t fruID{};
-    auto recordID = get_sdr::request::get_record_id(req);
 
     fruID = recordID - FRU_RECORD_ID_START;
     fru = frus.find(fruID);
     if (fru == frus.end())
     {
-        return ipmi::ccSensorInvalid;
+        return ipmi::responseSensorInvalid();
     }
 
+    get_sdr::SensorDataFruRecord record{};
     /* Header */
-    get_sdr::header::set_record_id(recordID, &(record.header));
+    record.header.recordId = recordID;
     record.header.sdr_version = SDR_VERSION; // Based on IPMI Spec v2.0 rev 1.1
     record.header.record_type = get_sdr::SENSOR_DATA_FRU_RECORD;
     record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1217,6 +1213,7 @@
         get_sdr::body::set_device_id_strlen(deviceID.length(), &(record.body));
     }
 
+    uint16_t nextRecordId{};
     strncpy(record.body.deviceID, deviceID.c_str(),
             get_sdr::body::get_device_id_strlen(&(record.body)));
 
@@ -1227,60 +1224,53 @@
         const auto& entityRecords =
             ipmi::sensor::EntityInfoMapContainer::getContainer()
                 ->getIpmiEntityRecords();
-        auto next_record_id =
+        nextRecordId =
             (entityRecords.size())
                 ? entityRecords.begin()->first + ENTITY_RECORD_ID_START
                 : END_OF_RECORD;
-        get_sdr::response::set_next_record_id(next_record_id, resp);
     }
     else
     {
-        get_sdr::response::set_next_record_id(
-            (FRU_RECORD_ID_START + fru->first), resp);
+        nextRecordId = FRU_RECORD_ID_START + fru->first;
     }
 
     // Check for invalid offset size
-    if (req->offset > sizeof(record))
+    if (offset > sizeof(record))
     {
-        return ipmi::ccParmOutOfRange;
+        return ipmi::responseParmOutOfRange();
     }
 
-    dataLength = std::min(static_cast<size_t>(req->bytes_to_read),
-                          sizeof(record) - req->offset);
+    size_t dataLen =
+        std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
 
-    std::memcpy(resp->record_data,
-                reinterpret_cast<uint8_t*>(&record) + req->offset, dataLength);
+    std::vector<uint8_t> recordData(dataLen);
+    std::memcpy(recordData.data(),
+                reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
 
-    *data_len = dataLength;
-    *data_len += 2; // additional 2 bytes for next record ID
-
-    return ipmi::ccSuccess;
+    return ipmi::responseSuccess(nextRecordId, recordData);
 }
 
-ipmi::Cc ipmi_entity_get_sdr(ipmi_request_t request, ipmi_response_t response,
-                             ipmi_data_len_t data_len)
+ipmi::RspType<uint16_t,            // nextRecordId
+              std::vector<uint8_t> // recordData
+              >
+    ipmiEntityGetSdr(uint16_t recordID, uint8_t offset, uint8_t bytesToRead)
 {
-    auto req = reinterpret_cast<get_sdr::GetSdrReq*>(request);
-    auto resp = reinterpret_cast<get_sdr::GetSdrResp*>(response);
-    get_sdr::SensorDataEntityRecord record{};
-    auto dataLength = 0;
-
     const auto& entityRecords =
         ipmi::sensor::EntityInfoMapContainer::getContainer()
             ->getIpmiEntityRecords();
     auto entity = entityRecords.begin();
     uint8_t entityRecordID;
-    auto recordID = get_sdr::request::get_record_id(req);
 
     entityRecordID = recordID - ENTITY_RECORD_ID_START;
     entity = entityRecords.find(entityRecordID);
     if (entity == entityRecords.end())
     {
-        return ipmi::ccSensorInvalid;
+        return ipmi::responseSensorInvalid();
     }
 
+    get_sdr::SensorDataEntityRecord record{};
     /* Header */
-    get_sdr::header::set_record_id(recordID, &(record.header));
+    record.header.recordId = recordID;
     record.header.sdr_version = SDR_VERSION; // Based on IPMI Spec v2.0 rev 1.1
     record.header.record_type = get_sdr::SENSOR_DATA_ENTITY_RECORD;
     record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1301,47 +1291,41 @@
     record.body.entityId4 = entity->second.containedEntities[3].first;
     record.body.entityInstance4 = entity->second.containedEntities[3].second;
 
+    uint16_t nextRecordId{};
     if (++entity == entityRecords.end())
     {
-        get_sdr::response::set_next_record_id(END_OF_RECORD,
-                                              resp); // last record
+        nextRecordId = END_OF_RECORD;
     }
     else
     {
-        get_sdr::response::set_next_record_id(
-            (ENTITY_RECORD_ID_START + entity->first), resp);
+        nextRecordId = entity->first + ENTITY_RECORD_ID_START;
     }
 
     // Check for invalid offset size
-    if (req->offset > sizeof(record))
+    if (offset > sizeof(record))
     {
-        return ipmi::ccParmOutOfRange;
+        return ipmi::responseParmOutOfRange();
     }
 
-    dataLength = std::min(static_cast<size_t>(req->bytes_to_read),
-                          sizeof(record) - req->offset);
+    size_t dataLen =
+        std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
 
-    std::memcpy(resp->record_data,
-                reinterpret_cast<uint8_t*>(&record) + req->offset, dataLength);
+    std::vector<uint8_t> recordData(dataLen);
+    std::memcpy(recordData.data(),
+                reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
 
-    *data_len = dataLength;
-    *data_len += 2; // additional 2 bytes for next record ID
-
-    return ipmi::ccSuccess;
+    return ipmi::responseSuccess(nextRecordId, recordData);
 }
 
-ipmi::Cc ipmi_sen_get_sdr(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,            // nextRecordId
+              std::vector<uint8_t> // recordData
+              >
+    ipmiSensorGetSdr(uint16_t /* reservationId */, uint16_t recordID,
+                     uint8_t offset, uint8_t bytesToRead)
 {
-    ipmi::Cc ret = ipmi::ccSuccess;
-    get_sdr::GetSdrReq* req = (get_sdr::GetSdrReq*)request;
-    get_sdr::GetSdrResp* resp = (get_sdr::GetSdrResp*)response;
-
     // Note: we use an iterator so we can provide the next ID at the end of
     // the call.
     auto sensor = ipmi::sensor::sensors.begin();
-    auto recordID = get_sdr::request::get_record_id(req);
 
     // At the beginning of a scan, the host side will send us id=0.
     if (recordID != 0)
@@ -1353,19 +1337,19 @@
         // record, FRU record and Enttiy Association record.
         if (recordID >= ENTITY_RECORD_ID_START)
         {
-            return ipmi_entity_get_sdr(request, response, data_len);
+            return ipmiEntityGetSdr(recordID, offset, bytesToRead);
         }
         else if (recordID >= FRU_RECORD_ID_START &&
                  recordID < ENTITY_RECORD_ID_START)
         {
-            return ipmi_fru_get_sdr(request, response, data_len);
+            return ipmiFruGetSdr(recordID, offset, bytesToRead);
         }
         else
         {
             sensor = ipmi::sensor::sensors.find(recordID);
             if (sensor == ipmi::sensor::sensors.end())
             {
-                return ipmi::ccSensorInvalid;
+                return ipmi::responseSensorInvalid();
             }
         }
     }
@@ -1377,7 +1361,7 @@
     {
         /* Header */
         get_sdr::SensorDataFullRecord record = {};
-        get_sdr::header::set_record_id(sensor_id, &(record.header));
+        record.header.recordId = sensor_id;
         record.header.sdr_version = 0x51; // Based on IPMI Spec v2.0 rev 1.1
         record.header.record_type = get_sdr::SENSOR_DATA_FULL_RECORD;
         record.header.record_length = sizeof(record.key) + sizeof(record.body);
@@ -1398,46 +1382,38 @@
         }
 
         // Set the type-specific details given the DBus interface
-        populate_record_from_dbus(&(record.body), &(sensor->second), data_len);
+        populate_record_from_dbus(&(record.body), &(sensor->second));
         sdrCacheMap[sensor_id] = std::move(record);
     }
 
+    uint16_t nextRecordId{};
     const auto& record = sdrCacheMap[sensor_id];
 
     if (++sensor == ipmi::sensor::sensors.end())
     {
         // we have reached till end of sensor, so assign the next record id
         // to 256(Max Sensor ID = 255) + FRU ID(may start with 0).
-        auto next_record_id = (frus.size())
-                                  ? frus.begin()->first + FRU_RECORD_ID_START
-                                  : END_OF_RECORD;
-
-        get_sdr::response::set_next_record_id(next_record_id, resp);
+        nextRecordId = (frus.size()) ? frus.begin()->first + FRU_RECORD_ID_START
+                                     : END_OF_RECORD;
     }
     else
     {
-        get_sdr::response::set_next_record_id(sensor->first, resp);
+        nextRecordId = sensor->first;
     }
 
-    if (req->offset > sizeof(record))
+    if (offset > sizeof(record))
     {
-        return ipmi::ccParmOutOfRange;
+        return ipmi::responseParmOutOfRange();
     }
 
-    // data_len will ultimately be the size of the record, plus
-    // the size of the next record ID:
-    *data_len = std::min(static_cast<size_t>(req->bytes_to_read),
-                         sizeof(record) - req->offset);
+    size_t dataLen =
+        std::min(static_cast<size_t>(bytesToRead), sizeof(record) - offset);
 
-    std::memcpy(resp->record_data,
-                reinterpret_cast<const uint8_t*>(&record) + req->offset,
-                *data_len);
+    std::vector<uint8_t> recordData(dataLen);
+    std::memcpy(recordData.data(),
+                reinterpret_cast<const uint8_t*>(&record) + offset, dataLen);
 
-    // data_len should include the LSB and MSB:
-    *data_len += sizeof(resp->next_record_id_lsb) +
-                 sizeof(resp->next_record_id_msb);
-
-    return ret;
+    return ipmi::responseSuccess(nextRecordId, recordData);
 }
 
 static bool isFromSystemChannel()
@@ -1571,9 +1547,9 @@
                           ipmi::Privilege::User, ipmiSenSetSensorThresholds);
 
     // <Get Device SDR>
-    ipmi_register_callback(ipmi::netFnSensor,
-                           ipmi::sensor_event::cmdGetDeviceSdr, nullptr,
-                           ipmi_sen_get_sdr, PRIVILEGE_USER);
+    ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnSensor,
+                          ipmi::sensor_event::cmdGetDeviceSdr,
+                          ipmi::Privilege::User, ipmiSensorGetSdr);
 
 #endif