buffet: Replace CallbackList with vector<Callback>

We don't remove callback at runtime, so callbacks on WeakPtr
are enough there.

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

Change-Id: I02573979b208d0e9df62e59f4bb3bbec92608b71
Reviewed-on: https://chromium-review.googlesource.com/270279
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/commands/command_manager.cc b/buffet/commands/command_manager.cc
index dd90e7d..de2125b 100644
--- a/buffet/commands/command_manager.cc
+++ b/buffet/commands/command_manager.cc
@@ -53,7 +53,8 @@
                                   chromeos::ErrorPtr* error) {
   bool result =
       dictionary_.LoadCommands(json, category, &base_dictionary_, error);
-  on_command_changed_.Notify();
+  for (const auto& cb : on_command_changed_)
+    cb.Run();
   return result;
 }
 
@@ -128,10 +129,10 @@
 
   // Now that we know that all the command names were valid,
   // update the respective commands' visibility.
-  for (CommandDefinition* def : definitions) {
+  for (CommandDefinition* def : definitions)
     def->SetVisibility(visibility);
-  }
-  on_command_changed_.Notify();
+  for (const auto& cb : on_command_changed_)
+    cb.Run();
   return true;
 }
 
diff --git a/buffet/commands/command_manager.h b/buffet/commands/command_manager.h
index 072d055..b2b9eba 100644
--- a/buffet/commands/command_manager.h
+++ b/buffet/commands/command_manager.h
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include <base/callback.h>
-#include <base/callback_list.h>
 #include <base/files/file_path.h>
 #include <base/macros.h>
 #include <base/memory/weak_ptr.h>
@@ -35,13 +34,6 @@
 // dispatched to the device.
 class CommandManager final {
  public:
-  // A token given by CommandManager in response to AddOnCommandDefChanged().
-  // When the CallbackToken is destroyed, the registered notification
-  // callback associated with it will automatically be removed from the command
-  // manager's callback list.
-  using CallbackToken =
-      std::unique_ptr<base::CallbackList<void()>::Subscription>;
-
   CommandManager();
   explicit CommandManager(
       const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
@@ -50,9 +42,8 @@
   explicit CommandManager(CommandDispachInterface* dispatch_interface);
 
   // Sets callback which is called when command definitions is changed.
-  CallbackToken AddOnCommandDefChanged(
-      const base::Closure& callback) WARN_UNUSED_RESULT {
-    return CallbackToken{on_command_changed_.Add(callback).release()};
+  void AddOnCommandDefChanged(const base::Closure& callback) {
+    return on_command_changed_.push_back(callback);
   }
 
   // Returns the command definitions for the device.
@@ -114,7 +105,7 @@
   CommandDictionary dictionary_;  // Command definitions/schemas.
   CommandQueue command_queue_;
   DBusCommandDispacher command_dispatcher_;
-  base::CallbackList<void()> on_command_changed_;
+  std::vector<base::Callback<void()>> on_command_changed_;
 
   DISALLOW_COPY_AND_ASSIGN(CommandManager);
 };
diff --git a/buffet/commands/command_manager_unittest.cc b/buffet/commands/command_manager_unittest.cc
index 5b45cee..76a3246 100644
--- a/buffet/commands/command_manager_unittest.cc
+++ b/buffet/commands/command_manager_unittest.cc
@@ -164,7 +164,7 @@
   CommandManager manager;
   int update_count = 0;
   auto on_command_change = [&update_count]() { update_count++; };
-  auto token = manager.AddOnCommandDefChanged(base::Bind(on_command_change));
+  manager.AddOnCommandDefChanged(base::Bind(on_command_change));
 
   auto json = CreateDictionaryValue(R"({
     'foo': {
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index 3ed70a8..0ef58d7 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -141,7 +141,7 @@
       xmpp_enabled_{xmpp_enabled},
       manager_{manager} {
   OnConfigChanged();
-  command_changed_callback_token_ = command_manager_->AddOnCommandDefChanged(
+  command_manager_->AddOnCommandDefChanged(
       base::Bind(&DeviceRegistrationInfo::OnCommandDefsChanged,
                  weak_factory_.GetWeakPtr()));
 }
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index 8f74d2a..a762758 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -255,10 +255,6 @@
   // Device state manager.
   std::shared_ptr<StateManager> state_manager_;
 
-  // Token given by Command Manager to track the registered Command Definition
-  // change callback.
-  CommandManager::CallbackToken command_changed_callback_token_;
-
   std::unique_ptr<BuffetConfig> config_;
 
   const bool xmpp_enabled_;
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 82ee7a8..a5fff7d 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -53,8 +53,8 @@
                     const AsyncEventSequencer::CompletionAction& cb) {
   command_manager_ =
       std::make_shared<CommandManager>(dbus_object_.GetObjectManager());
-  command_changed_callback_token_ = command_manager_->AddOnCommandDefChanged(
-      base::Bind(&Manager::OnCommandDefsChanged, base::Unretained(this)));
+  command_manager_->AddOnCommandDefChanged(base::Bind(
+      &Manager::OnCommandDefsChanged, weak_ptr_factory_.GetWeakPtr()));
   command_manager_->Startup(base::FilePath{"/etc/buffet"},
                             test_definitions_path);
   state_change_queue_ = std::unique_ptr<StateChangeQueue>(
diff --git a/buffet/manager.h b/buffet/manager.h
index cc3a114..a685a05 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -89,9 +89,7 @@
   std::shared_ptr<StateManager> state_manager_;
   std::unique_ptr<DeviceRegistrationInfo> device_info_;
 
-  // Token given by Command Manager to track the registered Command Definition
-  // change callback.
-  CommandManager::CallbackToken command_changed_callback_token_;
+  base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(Manager);
 };