pldm: Implement SetNumericEffecterValue function

Register the setNumericEffecterValue method and get the PDR structure
according to the EffecterId attribute.

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I7eb56331813d7777a67d6c50f15b244f57e8492c
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index df0f2d1..c0fff44 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -3,6 +3,7 @@
 
 #include "pdr_numeric_effecter.hpp"
 #include "pdr_state_effecter.hpp"
+#include "platform_numeric_effecter.hpp"
 #include "platform_state_effecter.hpp"
 #include "utils.hpp"
 
@@ -459,6 +460,38 @@
     return PLDM_SUCCESS;
 }
 
+Response Handler::setNumericEffecterValue(const pldm_msg* request,
+                                          size_t payloadLength)
+{
+    Response response(sizeof(pldm_msg_hdr) +
+                      PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
+    uint16_t effecterId{};
+    uint8_t effecterDataSize{};
+    uint8_t effecterValue[4] = {};
+
+    if ((payloadLength > sizeof(effecterId) + sizeof(effecterDataSize) +
+                             sizeof(union_effecter_data_size)) ||
+        (payloadLength < sizeof(effecterId) + sizeof(effecterDataSize) + 1))
+    {
+        return ccOnlyResponse(request, PLDM_ERROR_INVALID_LENGTH);
+    }
+
+    int rc = decode_set_numeric_effecter_value_req(
+        request, payloadLength, &effecterId, &effecterDataSize,
+        reinterpret_cast<uint8_t*>(&effecterValue));
+
+    if (rc == PLDM_SUCCESS)
+    {
+        const pldm::utils::DBusHandler dBusIntf;
+        rc = platform_numeric_effecter::setNumericEffecterValueHandler<
+            pldm::utils::DBusHandler, Handler>(dBusIntf, *this, effecterId,
+                                               effecterDataSize, effecterValue,
+                                               sizeof(effecterValue));
+    }
+
+    return ccOnlyResponse(request, rc);
+}
+
 } // namespace platform
 } // namespace responder
 } // namespace pldm