pldmtool: Add support for CancelUpdateComponent

Tested:

pldmtool fw_update CancelUpdateComponent -m 13
{
    "CompletionCode": "SUCCESS"
}

Change-Id: I1b2c36ad9d181ae9bd8d611b769bfbc8287c36f1
Signed-off-by: Tom Joseph <rushtotom@gmail.com>
diff --git a/pldmtool/pldm_fw_update_cmd.cpp b/pldmtool/pldm_fw_update_cmd.cpp
index d07b197..3921925 100644
--- a/pldmtool/pldm_fw_update_cmd.cpp
+++ b/pldmtool/pldm_fw_update_cmd.cpp
@@ -1215,6 +1215,46 @@
     bool8_t selfContainedActivRequest;
 };
 
+class CancelUpdateComponent : public CommandInterface
+{
+  public:
+    ~CancelUpdateComponent() = default;
+    CancelUpdateComponent() = delete;
+    CancelUpdateComponent(const CancelUpdateComponent&) = delete;
+    CancelUpdateComponent(CancelUpdateComponent&&) = delete;
+    CancelUpdateComponent& operator=(const CancelUpdateComponent&) = delete;
+    CancelUpdateComponent& operator=(CancelUpdateComponent&&) = delete;
+
+    using CommandInterface::CommandInterface;
+
+    std::pair<int, std::vector<uint8_t>> createRequestMsg() override
+    {
+        std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
+        auto request = new (requestMsg.data()) pldm_msg;
+        auto rc = encode_cancel_update_component_req(
+            instanceId, request, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES);
+        return {rc, requestMsg};
+    }
+
+    void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
+    {
+        uint8_t cc = 0;
+
+        auto rc = decode_cancel_update_component_resp(responsePtr,
+                                                      payloadLength, &cc);
+        if (rc != PLDM_SUCCESS)
+        {
+            std::cerr << "Parsing CancelUpdateComponent response failed: "
+                      << "rc=" << rc << ",cc=" << static_cast<int>(cc) << "\n";
+            return;
+        }
+
+        ordered_json data;
+        fillCompletionCode(cc, data, PLDM_FWUP);
+        pldmtool::helper::DisplayInJson(data);
+    }
+};
+
 void registerCommand(CLI::App& app)
 {
     auto fwUpdate =
@@ -1254,6 +1294,11 @@
         fwUpdate->add_subcommand("ActivateFirmware", "To activate firmware");
     commands.push_back(std::make_unique<ActivateFirmware>(
         "fw_update", "ActivateFirmware", activateFirmware));
+
+    auto cancelUpdateComp = fwUpdate->add_subcommand(
+        "CancelUpdateComponent", "To cancel component update");
+    commands.push_back(std::make_unique<CancelUpdateComponent>(
+        "fw_update", "CancelUpdateComponent", cancelUpdateComp));
 }
 
 } // namespace fw_update