Add timer skeleton

This patchset creates the timer infrastructure that is then
used by soft power off object on user requests.

Change-Id: I6f7a5c161999fda89471f453c24725efddac65b9
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/softoff/mainapp.cpp b/softoff/mainapp.cpp
index 38b6984..f5fbf18 100644
--- a/softoff/mainapp.cpp
+++ b/softoff/mainapp.cpp
@@ -13,32 +13,60 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include <systemd/sd-event.h>
 #include <phosphor-logging/log.hpp>
 #include "softoff.hpp"
 #include "config.h"
+#include "timer.hpp"
 
 using namespace phosphor::logging;
 
 int main(int argc, char** argv)
 {
+    // systemd event handler
+    sd_event* events = nullptr;
+
     // Get a handle to system dbus.
     auto bus = sdbusplus::bus::new_default();
 
     // Add systemd object manager.
     sdbusplus::server::manager::manager(bus, SOFTOFF_OBJPATH);
 
+    // sd_event object
+    auto r = sd_event_default(&events);
+    if (r < 0)
+    {
+        log<level::ERR>("Failure to create sd_event handler",
+                entry("ERROR=%s", strerror(-r)));
+        return -1;
+    }
+
+    // Attach the bus to sd_event to service user requests
+    bus.attach_event(events, SD_EVENT_PRIORITY_NORMAL);
+
     // Create the SoftPowerOff object.
-    phosphor::ipmi::SoftPowerOff object(bus, SOFTOFF_OBJPATH);
+    phosphor::ipmi::SoftPowerOff powerObj(bus, events, SOFTOFF_OBJPATH);
 
     /** @brief Claim the bus */
     bus.request_name(SOFTOFF_BUSNAME);
 
-    /** @brief Wait for client requests */
-    while(true)
+    /** @brief Wait for client requests until this application has processed
+     *         at least one successful SoftPowerOff
+     */
+    while(!powerObj.isCompleted() && !powerObj.isTimerExpired())
     {
-        // Handle dbus message / signals discarding unhandled
-        bus.process_discard();
-        bus.wait();
+        // -1 denotes wait for ever
+        r = sd_event_run(events, (uint64_t)-1);
+        if (r < 0)
+        {
+            log<level::ERR>("Failure in processing request",
+                    entry("ERROR=%s", strerror(-r)));
+            break;
+        }
     }
+
+    // Cleanup the event handler
+    events = sd_event_unref(events);
+
     return 0;
 }