soft-off: Send soft off request to the host and wait the host soft off responds

The pldm-softpoweroff application will send a set state effecter states request
to host, then the host will soft off.

The pldm-softpoweroff need two timers. One of the timer is used to wait the
response of the pldm soft off request message(default 30s). Another timer
is used to wait the host graceful shutdown complete(default 7200s).If the host
response is not received within the timeout then log an error and exit the
application.

The pldm-softpowerroff application need Subscribe to the
xyz.openbmc_project.PLDM.Event StateSensorEvent signal,When the host soft off
is complete, it sends a pldm event Msg to BMC.After pldmd receive this
event Msg ,it will emit the StateSensorEvent signal.When the pldm-softpowerroff
receive the signal,it will stop the timer and exit.

Tested in fp5280g2 system:
1、If the host state is not "Running", this application will exit with success(0).
2、If no ACK of the soft off request is received within 30 seconds, this
   application will exit with error(-1).
3、If no pldm event Msg(host gracefully shutdown complete) is received within
   7200 seconds, this application will record an error log and exit with
   error(-1).
4、If the pldm event Msg(host gracefully shutdown complete) is received within
   7200 seconds, this application will exit with success(0).

Signed-off-by: Chicago Duan <duanzhijia01@inspur.com>
Change-Id: I486d8068d013766329f78685acc0508fc3cb6c95
diff --git a/softoff/main.cpp b/softoff/main.cpp
index e56a008..4ff2a4d 100644
--- a/softoff/main.cpp
+++ b/softoff/main.cpp
@@ -1,8 +1,55 @@
-#include "libpldm/platform.h"
+#include "common/utils.hpp"
+#include "softoff.hpp"
 
 #include <iostream>
 
 int main()
 {
+    // Get a default event loop
+    auto event = sdeventplus::Event::get_default();
+
+    // Get a handle to system D-Bus.
+    auto& bus = pldm::utils::DBusHandler::getBus();
+
+    // Attach the bus to sd_event to service user requests
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+
+    pldm::SoftPowerOff softPower(bus, event.get());
+
+    if (softPower.isError())
+    {
+        std::cerr << "Host failed to gracefully shutdown, exiting "
+                     "pldm-softpoweroff app\n";
+        return -1;
+    }
+
+    if (softPower.isCompleted())
+    {
+        std::cerr << "Host current state is not Running, exiting "
+                     "pldm-softpoweroff app\n";
+        return 0;
+    }
+
+    // Send the gracefully shutdown request to the host and
+    // wait the host gracefully shutdown.
+    if (softPower.hostSoftOff(event))
+    {
+        std::cerr << "pldm-softpoweroff:Failure in sending soft off request to "
+                     "the host. Exiting pldm-softpoweroff app\n";
+
+        return -1;
+    }
+
+    if (softPower.isTimerExpired() && softPower.isReceiveResponse())
+    {
+        pldm::utils::reportError(
+            "pldm soft off: Waiting for the host soft off timeout");
+        std::cerr
+            << "PLDM host soft off: ERROR! Wait for the host soft off timeout."
+            << "Exit the pldm-softpoweroff "
+            << "\n";
+        return -1;
+    }
+
     return 0;
 }