buffet: Multiple listeners of add/remove new command.

Replace CommandDispatchInterface with callbacks.
Lists of callbacks in CommandQueue.

BUG=brillo:697
TEST=FEATURE=test emerge-gizmo buffet

Change-Id: I3c164c8c7c2cb098b896aa8d5c9a99d856b05172
Reviewed-on: https://chromium-review.googlesource.com/270350
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/commands/command_queue.cc b/buffet/commands/command_queue.cc
index 62d8c20..614261e 100644
--- a/buffet/commands/command_queue.cc
+++ b/buffet/commands/command_queue.cc
@@ -4,16 +4,23 @@
 
 #include "buffet/commands/command_queue.h"
 
+#include <base/bind.h>
 #include <base/time/time.h>
 
-#include "buffet/commands/command_dispatch_interface.h"
-
 namespace buffet {
 
 namespace {
 const int kRemoveCommandDelayMin = 5;
 }
 
+void CommandQueue::AddOnCommandAddedCallback(const Callback& callback) {
+  on_command_added_.push_back(callback);
+}
+
+void CommandQueue::AddOnCommandRemovedCallback(const Callback& callback) {
+  on_command_removed_.push_back(callback);
+}
+
 void CommandQueue::Add(std::unique_ptr<CommandInstance> instance) {
   std::string id = instance->GetID();
   LOG_IF(FATAL, id.empty()) << "Command has no ID";
@@ -21,8 +28,8 @@
   auto pair = map_.insert(std::make_pair(id, std::move(instance)));
   LOG_IF(FATAL, !pair.second) << "Command with ID '" << id
                               << "' is already in the queue";
-  if (dispatch_interface_)
-    dispatch_interface_->OnCommandAdded(pair.first->second.get());
+  for (const auto& cb : on_command_added_)
+    cb.Run(pair.first->second.get());
   Cleanup();
 }
 
@@ -43,8 +50,8 @@
   std::unique_ptr<CommandInstance> instance{std::move(p->second)};
   instance->SetCommandQueue(nullptr);
   map_.erase(p);
-  if (dispatch_interface_)
-    dispatch_interface_->OnCommandRemoved(instance.get());
+  for (const auto& cb : on_command_removed_)
+    cb.Run(instance.get());
   return true;
 }