buffet: Remove DBusManager class

Move the TestMethod to the Manager, then remove the DBusManager
entirely.  This lets us turn the object at org/chromium/Buffet
into a pure object manager and removes a lot of boilerplate.

BUG=chromium:359190
TEST=buffet_client continues to demonstrate buffet functionality
through the TestMethod, which is now implementated by the Manager.

Change-Id: Ie9ecf0f7dd4dd50a3355ad7b06b8e2cfca71d9f9
Reviewed-on: https://chromium-review.googlesource.com/198760
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index ed036bd..3a62f13 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -29,7 +29,6 @@
       'sources': [
         'data_encoding.cc',
         'dbus_constants.cc',
-        'dbus_manager.cc',
         'dbus_utils.cc',
         'device_registration_info.cc',
         'exported_object_manager.cc',
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index dba2f4d..f351040 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -16,7 +16,6 @@
 #include <dbus/values_util.h>
 
 #include "buffet/dbus_constants.h"
-#include "buffet/dbus_manager.h"
 #include "buffet/data_encoding.h"
 
 using namespace buffet::dbus_constants;
@@ -32,8 +31,8 @@
 }
 
 bool CallTestMethod(dbus::ObjectProxy* proxy) {
-  dbus::MethodCall method_call(buffet::dbus_constants::kRootInterface,
-                               buffet::dbus_constants::kRootTestMethod);
+  dbus::MethodCall method_call(buffet::dbus_constants::kManagerInterface,
+                               buffet::dbus_constants::kManagerTestMethod);
   scoped_ptr<dbus::Response> response(
     proxy->CallMethodAndBlock(&method_call, default_timeout_ms));
   if (!response) {
@@ -178,7 +177,7 @@
 
 void usage() {
   std::cerr << "Possible commands:" << std::endl;
-  std::cerr << "  " << kRootTestMethod << std::endl;
+  std::cerr << "  " << kManagerTestMethod << std::endl;
   std::cerr << "  " << kManagerCheckDeviceRegistered << std::endl;
   std::cerr << "  " << kManagerGetDeviceInfo << std::endl;
   std::cerr << "  " << kManagerStartRegisterDevice
@@ -208,9 +207,9 @@
   std::string command = args.front();
   args.erase(args.begin());
   bool success = false;
-  if (command.compare(kRootTestMethod) == 0) {
+  if (command.compare(kManagerTestMethod) == 0) {
     auto proxy = GetBuffetDBusProxy(
-        bus, buffet::dbus_constants::kRootServicePath);
+        bus, buffet::dbus_constants::kManagerServicePath);
     success = CallTestMethod(proxy);
   } else if (command.compare(kManagerCheckDeviceRegistered) == 0 ||
              command.compare("cr") == 0) {
diff --git a/buffet/dbus_constants.cc b/buffet/dbus_constants.cc
index f352bbe..d8c70ba 100644
--- a/buffet/dbus_constants.cc
+++ b/buffet/dbus_constants.cc
@@ -10,11 +10,8 @@
 
 const char kServiceName[] = "org.chromium.Buffet";
 
-const char kRootInterface[] = "org.chromium.Buffet";
 const char kRootServicePath[] = "/org/chromium/Buffet";
 
-const char kRootTestMethod[] = "TestMethod";
-
 const char kManagerInterface[] = "org.chromium.Buffet.Manager";
 const char kManagerServicePath[] = "/org/chromium/Buffet/Manager";
 
@@ -23,6 +20,7 @@
 const char kManagerStartRegisterDevice[]    = "StartRegisterDevice";
 const char kManagerFinishRegisterDevice[]   = "FinishRegisterDevice";
 const char kManagerUpdateStateMethod[]      = "UpdateState";
+const char kManagerTestMethod[]             = "TestMethod";
 
 }  // namespace dbus_constants
 
diff --git a/buffet/dbus_constants.h b/buffet/dbus_constants.h
index 13c8a71..b7e9239 100644
--- a/buffet/dbus_constants.h
+++ b/buffet/dbus_constants.h
@@ -12,13 +12,9 @@
 // The service name claimed by the Buffet daemon.
 extern const char kServiceName[];
 
-// Interface implemented by the object at kRootServicePath.
-extern const char kRootInterface[];
+// The object at this path implements the ObjectManager interface.
 extern const char kRootServicePath[];
 
-// Methods exposed as part of kRootInterface.
-extern const char kRootTestMethod[];
-
 // Interface implemented by the object at kManagerServicePath.
 extern const char kManagerInterface[];
 extern const char kManagerServicePath[];
@@ -29,6 +25,7 @@
 extern const char kManagerStartRegisterDevice[];
 extern const char kManagerFinishRegisterDevice[];
 extern const char kManagerUpdateStateMethod[];
+extern const char kManagerTestMethod[];
 
 }  // namespace dbus_constants
 
diff --git a/buffet/dbus_manager.cc b/buffet/dbus_manager.cc
deleted file mode 100644
index e1b3426..0000000
--- a/buffet/dbus_manager.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "buffet/dbus_manager.h"
-
-#include <string>
-
-#include <base/bind.h>
-#include <dbus/object_path.h>
-
-#include "buffet/async_event_sequencer.h"
-#include "buffet/dbus_constants.h"
-#include "buffet/dbus_utils.h"
-
-using ::std::string;
-
-namespace buffet {
-
-DBusManager::DBusManager(dbus::Bus* bus)
-    : bus_(bus),
-      exported_object_(bus->GetExportedObject(
-          dbus::ObjectPath(dbus_constants::kRootServicePath))) { }
-
-DBusManager::~DBusManager() {
-  // Unregister ourselves from the Bus.  This prevents the bus from calling
-  // our callbacks in between the Manager's death and the bus unregistering
-  // our exported object on shutdown.  Unretained makes no promises of memory
-  // management.
-  exported_object_->Unregister();
-  exported_object_ = nullptr;
-}
-
-void DBusManager::Init(const OnInitFinish& cb) {
-  scoped_refptr<dbus_utils::AsyncEventSequencer> sequencer(
-      new dbus_utils::AsyncEventSequencer());
-  exported_object_->ExportMethod(
-      dbus_constants::kRootInterface, dbus_constants::kRootTestMethod,
-      dbus_utils::GetExportableDBusMethod(
-          base::Bind(&DBusManager::HandleTestMethod, base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kRootInterface, dbus_constants::kRootTestMethod,
-          "Failed exporting DBusManager's test method",
-          true));
-  sequencer->OnAllTasksCompletedCall({cb});
-}
-
-scoped_ptr<dbus::Response> DBusManager::HandleTestMethod(
-    dbus::MethodCall* method_call) {
-  LOG(INFO) << "Received call to test method.";
-  return scoped_ptr<dbus::Response>();
-}
-
-}  // namespace buffet
diff --git a/buffet/dbus_manager.h b/buffet/dbus_manager.h
deleted file mode 100644
index 13aa8f4..0000000
--- a/buffet/dbus_manager.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BUFFET_DBUS_MANAGER_H_
-#define BUFFET_DBUS_MANAGER_H_
-
-#include <string>
-
-#include <base/memory/scoped_ptr.h>
-#include <dbus/bus.h>
-#include <dbus/exported_object.h>
-#include <dbus/message.h>
-
-namespace buffet {
-
-// Class that manages dbus interactions in buffet.
-class DBusManager {
- public:
-  typedef base::Callback<void(bool success)> OnInitFinish;
-
-  DBusManager(dbus::Bus* bus);
-  virtual ~DBusManager();
-
-  void Init(const OnInitFinish& cb);
-  void Finalize();
-
-  // Get an object owned by the ::dbus::Bus object.  This object
-  // has methods to export DBus facing methods.
-  ::dbus::ExportedObject* GetExportedObject(
-      const std::string& object_path);
-
-  // Exports |method_name| on |exported_object| and uses |member|
-  // to handle calls.
-  void ExportDBusMethod(
-      ::dbus::ExportedObject* exported_object,
-      const std::string& interface_name,
-      const std::string& method_name,
-      base::Callback<scoped_ptr<::dbus::Response>(
-          ::dbus::MethodCall*)> handler);
-
- private:
-  // Connects to the D-Bus system bus and exports methods.
-  void InitDBus();
-  void ShutDownDBus();
-
-  // Callbacks for handling D-Bus signals and method calls.
-  scoped_ptr<::dbus::Response> HandleTestMethod(
-      ::dbus::MethodCall* method_call);
-
-  scoped_refptr<::dbus::Bus> bus_;  // Must outlive this object.
-  dbus::ExportedObject* exported_object_;  // Owned by the bus.
-
-  DISALLOW_COPY_AND_ASSIGN(DBusManager);
-};
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_MANAGER_H_
diff --git a/buffet/main.cc b/buffet/main.cc
index 6d8ddc2..e48a1b0 100644
--- a/buffet/main.cc
+++ b/buffet/main.cc
@@ -12,10 +12,10 @@
 #include <base/message_loop/message_loop.h>
 #include <base/strings/string_util.h>
 #include <base/strings/stringprintf.h>
+#include <dbus/bus.h>
 #include <sysexits.h>
 
 #include "buffet/async_event_sequencer.h"
-#include "buffet/dbus_manager.h"
 #include "buffet/manager.h"
 
 using buffet::dbus_utils::AsyncEventSequencer;
@@ -87,8 +87,6 @@
 void EnterMainLoop(base::MessageLoopForIO* message_loop,
                    scoped_refptr<dbus::Bus> bus) {
   scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer());
-  buffet::DBusManager dbus_manager(bus.get());
-  dbus_manager.Init(sequencer->GetHandler("DBusManager.Init() failed.", true));
   buffet::Manager manager(bus.get());
   manager.Init(sequencer->GetHandler("Manager.Init() failed.", true));
   sequencer->OnAllTasksCompletedCall(
diff --git a/buffet/manager.cc b/buffet/manager.cc
index a6c8d9f..7e64223 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -6,13 +6,13 @@
 
 #include <base/bind.h>
 #include <base/bind_helpers.h>
+#include <base/json/json_writer.h>
+#include <dbus/bus.h>
 #include <dbus/object_path.h>
 #include <dbus/values_util.h>
-#include <base/json/json_writer.h>
 
 #include "buffet/async_event_sequencer.h"
 #include "buffet/dbus_constants.h"
-#include "buffet/dbus_manager.h"
 #include "buffet/dbus_utils.h"
 
 using buffet::dbus_utils::GetBadArgsError;
@@ -93,6 +93,14 @@
           dbus_constants::kManagerUpdateStateMethod,
           "Failed exporting UpdateState method",
           true));
+  exported_object_->ExportMethod(
+      dbus_constants::kManagerInterface, dbus_constants::kManagerTestMethod,
+      dbus_utils::GetExportableDBusMethod(
+          base::Bind(&Manager::HandleTestMethod, base::Unretained(this))),
+      sequencer->GetExportHandler(
+          dbus_constants::kManagerInterface, dbus_constants::kManagerTestMethod,
+          "Failed exporting TestMethod method",
+          true));
   properties_.reset(new Properties(bus_));
   // TODO(wiley): Initialize all properties appropriately before claiming
   //              the properties interface.
@@ -242,4 +250,10 @@
   return dbus::Response::FromMethodCall(method_call);
 }
 
+scoped_ptr<dbus::Response> Manager::HandleTestMethod(
+    dbus::MethodCall* method_call) {
+  LOG(INFO) << "Received call to test method.";
+  return scoped_ptr<dbus::Response>();
+}
+
 }  // namespace buffet
diff --git a/buffet/manager.h b/buffet/manager.h
index ad66252..d2b2859 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -58,6 +58,9 @@
   // Handles calls to org.chromium.Buffet.Manager.UpdateState().
   scoped_ptr<dbus::Response> HandleUpdateState(
       dbus::MethodCall* method_call);
+  // Handles calls to org.chromium.Buffet.Manager.Test()
+  scoped_ptr<::dbus::Response> HandleTestMethod(
+      ::dbus::MethodCall* method_call);
 
   dbus::Bus* bus_;
   dbus::ExportedObject* exported_object_;  // weak; owned by the Bus object.