Enable multiple commands to be queued at once

With this commit, the control host interface allows multiple commands
to be queued up and sent in a FIFO order to the host

Change-Id: I76908d988608ef6dcc1d7f945c6c4a1c5c29e44b
Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
diff --git a/host-interface.cpp b/host-interface.cpp
index aa32ff0..160c127 100644
--- a/host-interface.cpp
+++ b/host-interface.cpp
@@ -16,15 +16,14 @@
 // When you see base:: you know we're referencing our base class
 namespace base = sdbusplus::xyz::openbmc_project::Control::server;
 
-void Host::execute(base::Host::Command command)
-{
-    log<level::INFO>("Pushing cmd on to queue",
-            entry("CONTROL_HOST_CMD=%s",
-                  convertForMessage(command)));
-    this->workQueue.push(command);
+// TODO - Add timeout function?
+//          - If host does not respond to SMS, need to signal a failure
+//      - Flush queue on power off?  - Timeout would do this for us for free
+//      - Ignore requests when host state not running? - Timeout handles too
 
-    // If this was the only entry then send the SMS attention
-    if(this->workQueue.size() == 1)
+void Host::checkQueue()
+{
+    if (this->workQueue.size() >= 1)
     {
         log<level::INFO>("Asserting SMS Attention");
 
@@ -46,6 +45,26 @@
         }
         log<level::INFO>("SMS Attention asserted");
     }
+}
+
+void Host::execute(base::Host::Command command)
+{
+    log<level::INFO>("Pushing cmd on to queue",
+            entry("CONTROL_HOST_CMD=%s",
+                  convertForMessage(command)));
+
+    this->workQueue.push(command);
+
+    // Alert host if this is only command in queue otherwise host will
+    // be notified of next message after processing the current one
+    if (this->workQueue.size() == 1)
+    {
+        this->checkQueue();
+    }
+    else
+    {
+        log<level::INFO>("Command in process, no attention");
+    }
 
     return;
 }
diff --git a/host-interface.hpp b/host-interface.hpp
index 36b41d9..0ad3bfb 100644
--- a/host-interface.hpp
+++ b/host-interface.hpp
@@ -61,11 +61,15 @@
             Command command = this->workQueue.front();
             this->workQueue.pop();
             this->commandComplete(command, Result::Success);
+            this->checkQueue();
             return command;
         }
 
     private:
 
+        /** @brief Check if anything in queue and alert host if so */
+        void checkQueue();
+
         /** @brief Persistent sdbusplus DBus bus connection. */
         sdbusplus::bus::bus& bus;