ibm-oem: add FileAck handler for PELs

Extend the FileAck* commands to let the host firmware to ack PELs it has
received from the BMC.

Signed-off-by: vkaverap <vkaverap@in.ibm.com>
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: Iafc1c92c64c8ea7a51367c2c36842613af1f46b5
diff --git a/oem/ibm/libpldmresponder/file_io.cpp b/oem/ibm/libpldmresponder/file_io.cpp
index d191d3d..177fe3f 100644
--- a/oem/ibm/libpldmresponder/file_io.cpp
+++ b/oem/ibm/libpldmresponder/file_io.cpp
@@ -659,6 +659,46 @@
     return response;
 }
 
+Response Handler::fileAck(const pldm_msg* request, size_t payloadLength)
+{
+    Response response(sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_RESP_BYTES);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
+    if (payloadLength != PLDM_FILE_ACK_REQ_BYTES)
+    {
+        encode_file_ack_resp(request->hdr.instance_id,
+                             PLDM_ERROR_INVALID_LENGTH, responsePtr);
+        return response;
+    }
+    uint16_t fileType{};
+    uint32_t fileHandle{};
+    uint8_t fileStatus{};
+
+    auto rc = decode_file_ack_req(request, payloadLength, &fileType,
+                                  &fileHandle, &fileStatus);
+    if (rc != PLDM_SUCCESS)
+    {
+        encode_file_ack_resp(request->hdr.instance_id, rc, responsePtr);
+        return response;
+    }
+
+    std::unique_ptr<FileHandler> handler{};
+    try
+    {
+        handler = getHandlerByType(fileType, fileHandle);
+    }
+    catch (const InternalFailure& e)
+    {
+        encode_file_ack_resp(request->hdr.instance_id, PLDM_INVALID_FILE_TYPE,
+                             responsePtr);
+        return response;
+    }
+
+    rc = handler->fileAck(fileStatus);
+    encode_file_ack_resp(request->hdr.instance_id, rc, responsePtr);
+    return response;
+}
+
 } // namespace oem_ibm
 } // namespace responder
 } // namespace pldm