Add responder for Platform Event Message

Provide infrastructure to hook handler for each PLDM event type.

Change-Id: I67480bb923f5eca311b2b0e597a146e020a5baf7
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 6aef73d..0a33d86 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -195,6 +195,89 @@
     return response;
 }
 
+Response Handler::platformEventMessage(const pldm_msg* request,
+                                       size_t payloadLength)
+{
+    uint8_t formatVersion{};
+    uint8_t tid{};
+    uint8_t eventClass{};
+    size_t offset{};
+
+    auto rc = decode_platform_event_message_req(
+        request, payloadLength, &formatVersion, &tid, &eventClass, &offset);
+    if (rc != PLDM_SUCCESS)
+    {
+        return CmdHandler::ccOnlyResponse(request, rc);
+    }
+
+    try
+    {
+        const auto& handlers = eventHandlers.at(eventClass);
+        for (const auto& handler : handlers)
+        {
+            auto rc =
+                handler(request, payloadLength, formatVersion, tid, offset);
+            if (rc != PLDM_SUCCESS)
+            {
+                return CmdHandler::ccOnlyResponse(request, rc);
+            }
+        }
+    }
+    catch (const std::out_of_range& e)
+    {
+        return CmdHandler::ccOnlyResponse(request, PLDM_ERROR_INVALID_DATA);
+    }
+
+    Response response(
+        sizeof(pldm_msg_hdr) + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES, 0);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
+    rc = encode_platform_event_message_resp(request->hdr.instance_id, rc,
+                                            PLDM_EVENT_NO_LOGGING, responsePtr);
+    if (rc != PLDM_SUCCESS)
+    {
+        return ccOnlyResponse(request, rc);
+    }
+
+    return response;
+}
+
+int Handler::sensorEvent(const pldm_msg* request, size_t payloadLength,
+                         uint8_t /*formatVersion*/, uint8_t /*tid*/,
+                         size_t eventDataOffset)
+{
+    uint16_t sensorId{};
+    uint8_t eventClass{};
+    size_t eventClassDataOffset{};
+    auto eventData =
+        reinterpret_cast<const uint8_t*>(request->payload) + eventDataOffset;
+    auto eventDataSize = payloadLength - eventDataOffset;
+
+    auto rc = decode_sensor_event_data(eventData, eventDataSize, &sensorId,
+                                       &eventClass, &eventClassDataOffset);
+    if (rc != PLDM_SUCCESS)
+    {
+        return rc;
+    }
+
+    if (eventClass == PLDM_STATE_SENSOR_STATE)
+    {
+        uint8_t sensorOffset{};
+        uint8_t eventState{};
+        uint8_t previousEventState{};
+
+        rc = decode_state_sensor_data(&eventClass, eventClassDataOffset,
+                                      &sensorOffset, &eventState,
+                                      &previousEventState);
+    }
+    else
+    {
+        return PLDM_ERROR_INVALID_DATA;
+    }
+
+    return PLDM_SUCCESS;
+}
+
 } // namespace platform
 } // namespace responder
 } // namespace pldm