buffet: Switch buffet::Manager to use DBusObject

Use DBusObject to implement "/org/chromium/Buffet/Manager" object.

BUG=chromium:374864
TEST=USE=buffet P2_TEST_FILTER="buffet::*" FEATURES=test emerge-link platform2

Change-Id: I91141ce76a1dbd4478577f2f7548f99a33241fb5
Reviewed-on: https://chromium-review.googlesource.com/212682
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 6c258ba..749e84a 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -22,112 +22,41 @@
 #include "buffet/dbus_constants.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
-using chromeos::dbus_utils::GetBadArgsError;
 using chromeos::dbus_utils::ExportedObjectManager;
-using chromeos::dbus_utils::GetDBusError;
 
 namespace buffet {
 
-Manager::Manager(
-    const base::WeakPtr<ExportedObjectManager>& object_manager)
-    : exported_object_(object_manager->GetBus()->GetExportedObject(
-          dbus::ObjectPath(dbus_constants::kManagerServicePath))),
-      object_manager_(object_manager) { }
+Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
+    : dbus_object_(object_manager.get(),
+                   object_manager->GetBus(),
+                   dbus::ObjectPath(dbus_constants::kManagerServicePath)) {}
 
-Manager::~Manager() {
-  object_manager_->ReleaseInterface(
-      dbus::ObjectPath(dbus_constants::kManagerServicePath),
-      dbus_constants::kManagerInterface);
-  // Prevent the properties object from making calls to the exported object.
-  properties_.reset(nullptr);
-  // 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 Manager::Init(const OnInitFinish& cb) {
-  scoped_refptr<AsyncEventSequencer> sequencer(
-      new AsyncEventSequencer());
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface,
-      dbus_constants::kManagerCheckDeviceRegistered,
-      chromeos::dbus_utils::GetExportableDBusMethod(
-          base::Bind(&Manager::HandleCheckDeviceRegistered,
-          base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kManagerInterface,
-          dbus_constants::kManagerCheckDeviceRegistered,
-          "Failed exporting CheckDeviceRegistered method",
-          true));
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface,
-      dbus_constants::kManagerGetDeviceInfo,
-      chromeos::dbus_utils::GetExportableDBusMethod(
-          base::Bind(&Manager::HandleGetDeviceInfo,
-          base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kManagerInterface,
-          dbus_constants::kManagerGetDeviceInfo,
-          "Failed exporting GetDeviceInfo method",
-          true));
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface,
-      dbus_constants::kManagerStartRegisterDevice,
-      chromeos::dbus_utils::GetExportableDBusMethod(
-          base::Bind(&Manager::HandleStartRegisterDevice,
-          base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kManagerInterface,
-          dbus_constants::kManagerStartRegisterDevice,
-          "Failed exporting StartRegisterDevice method",
-          true));
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface,
-      dbus_constants::kManagerFinishRegisterDevice,
-      chromeos::dbus_utils::GetExportableDBusMethod(
-          base::Bind(&Manager::HandleFinishRegisterDevice,
-          base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kManagerInterface,
-          dbus_constants::kManagerFinishRegisterDevice,
-          "Failed exporting FinishRegisterDevice method",
-          true));
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface,
-      dbus_constants::kManagerUpdateStateMethod,
-      chromeos::dbus_utils::GetExportableDBusMethod(
-          base::Bind(&Manager::HandleUpdateState,
-          base::Unretained(this))),
-      sequencer->GetExportHandler(
-          dbus_constants::kManagerInterface,
-          dbus_constants::kManagerUpdateStateMethod,
-          "Failed exporting UpdateState method",
-          true));
-  exported_object_->ExportMethod(
-      dbus_constants::kManagerInterface, dbus_constants::kManagerTestMethod,
-      chromeos::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(object_manager_->GetBus()));
+void Manager::Init(const AsyncEventSequencer::CompletionAction& cb) {
+  chromeos::dbus_utils::DBusInterface* itf =
+      dbus_object_.AddOrGetInterface(dbus_constants::kManagerInterface);
+  itf->AddMethodHandler(dbus_constants::kManagerCheckDeviceRegistered,
+                        base::Unretained(this),
+                        &Manager::HandleCheckDeviceRegistered);
+  itf->AddMethodHandler(dbus_constants::kManagerGetDeviceInfo,
+                        base::Unretained(this),
+                        &Manager::HandleGetDeviceInfo);
+  itf->AddMethodHandler(dbus_constants::kManagerStartRegisterDevice,
+                        base::Unretained(this),
+                        &Manager::HandleStartRegisterDevice);
+  itf->AddMethodHandler(dbus_constants::kManagerFinishRegisterDevice,
+                        base::Unretained(this),
+                        &Manager::HandleFinishRegisterDevice);
+  itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
+                        base::Unretained(this),
+                        &Manager::HandleUpdateState);
+  itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
+                        base::Unretained(this),
+                        &Manager::HandleTestMethod);
+  itf->AddProperty("State", &state_);
   // TODO(wiley): Initialize all properties appropriately before claiming
   //              the properties interface.
-  properties_->state_.SetValue("{}");
-  properties_->Init(
-      sequencer->GetHandler("Manager properties export failed.", true));
-  auto claim_interface_task = sequencer->WrapCompletionTask(
-      base::Bind(&ExportedObjectManager::ClaimInterface,
-                 object_manager_->AsWeakPtr(),
-                 dbus::ObjectPath(dbus_constants::kManagerServicePath),
-                 dbus_constants::kManagerInterface,
-                 properties_->GetPropertyWriter(
-                     dbus_constants::kManagerInterface)));
-  sequencer->OnAllTasksCompletedCall({claim_interface_task, cb});
+  state_.SetValue("{}");
+  dbus_object_.RegisterAsync(cb);
   command_manager_ = std::make_shared<CommandManager>();
   command_manager_->Startup();
   device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
@@ -135,177 +64,63 @@
   device_info_->Load();
 }
 
-scoped_ptr<dbus::Response> Manager::HandleCheckDeviceRegistered(
-    dbus::MethodCall* method_call) {
-  // Read the parameters to the method.
-  dbus::MessageReader reader(method_call);
-  if (reader.HasMoreData()) {
-    return GetBadArgsError(method_call,
-                           "Too many parameters to CheckDeviceRegistered");
-  }
-
+std::string Manager::HandleCheckDeviceRegistered(chromeos::ErrorPtr* error) {
   LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
-
-  chromeos::ErrorPtr error;
-  bool registered = device_info_->CheckRegistration(&error);
+  std::string device_id;
+  bool registered = device_info_->CheckRegistration(error);
   // If it fails due to any reason other than 'device not registered',
   // treat it as a real error and report it to the caller.
   if (!registered &&
-      !error->HasError(kErrorDomainGCD, "device_not_registered")) {
-    return scoped_ptr<dbus::Response>(
-        GetDBusError(method_call, error.get()).release());
+      !(*error)->HasError(kErrorDomainGCD, "device_not_registered")) {
+    return device_id;
   }
 
-  std::string device_id;
-  if (registered) {
-    device_id = device_info_->GetDeviceId(&error);
-    if (device_id.empty())
-      return scoped_ptr<dbus::Response>(
-          GetDBusError(method_call, error.get()).release());
-  }
-  // Send back our response.
-  scoped_ptr<dbus::Response> response(
-      dbus::Response::FromMethodCall(method_call));
-  dbus::MessageWriter writer(response.get());
-  writer.AppendString(device_id);
-  return response.Pass();
+  error->reset();
+
+  if (registered)
+    device_id = device_info_->GetDeviceId(error);
+
+  return device_id;
 }
 
-scoped_ptr<dbus::Response> Manager::HandleGetDeviceInfo(
-    dbus::MethodCall* method_call) {
-  // Read the parameters to the method.
-  dbus::MessageReader reader(method_call);
-  if (reader.HasMoreData()) {
-    return GetBadArgsError(method_call,
-                           "Too many parameters to GetDeviceInfo");
-  }
-
+std::string Manager::HandleGetDeviceInfo(chromeos::ErrorPtr* error) {
   LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
 
   std::string device_info_str;
-  chromeos::ErrorPtr error;
-  auto device_info = device_info_->GetDeviceInfo(&error);
+  auto device_info = device_info_->GetDeviceInfo(error);
   if (!device_info)
-    return scoped_ptr<dbus::Response>(
-        GetDBusError(method_call, error.get()).release());
+    return device_info_str;
 
   base::JSONWriter::Write(device_info.get(), &device_info_str);
-
-  // Send back our response.
-  scoped_ptr<dbus::Response> response(
-      dbus::Response::FromMethodCall(method_call));
-  dbus::MessageWriter writer(response.get());
-  writer.AppendString(device_info_str);
-  return response.Pass();
+  return device_info_str;
 }
 
-scoped_ptr<dbus::Response> Manager::HandleStartRegisterDevice(
-    dbus::MethodCall* method_call) {
-  // Read the parameters to the method.
-  dbus::MessageReader reader(method_call);
-  if (!reader.HasMoreData()) {
-    return GetBadArgsError(method_call, "No parameters to StartRegisterDevice");
-  }
-
-  dbus::MessageReader array_reader(nullptr);
-  if (!reader.PopArray(&array_reader))
-    return GetBadArgsError(method_call, "Failed to read the parameter array");
-  std::map<std::string, std::shared_ptr<base::Value>> params;
-  while (array_reader.HasMoreData()) {
-    dbus::MessageReader dict_entry_reader(nullptr);
-    if (!array_reader.PopDictEntry(&dict_entry_reader))
-      return GetBadArgsError(method_call, "Failed to get a call parameter");
-    std::string key;
-    if (!dict_entry_reader.PopString(&key))
-      return GetBadArgsError(method_call, "Failed to read parameter key");
-    base::Value* value = dbus::PopDataAsValue(&dict_entry_reader);
-    if (!value)
-      return GetBadArgsError(method_call, "Failed to read parameter value");
-    params.insert(std::make_pair(key, std::shared_ptr<base::Value>(value)));
-  }
-  if (reader.HasMoreData())
-    return GetBadArgsError(method_call,
-                           "Too many parameters to StartRegisterDevice");
-
+std::string Manager::HandleStartRegisterDevice(
+    chromeos::ErrorPtr* error,
+    const std::map<std::string,
+    std::unique_ptr<base::Value>>& params) {
   LOG(INFO) << "Received call to Manager.StartRegisterDevice()";
 
-  chromeos::ErrorPtr error;
-  std::string id = device_info_->StartRegistration(params, &error);
-  if (id.empty())
-    return scoped_ptr<dbus::Response>(
-        GetDBusError(method_call, error.get()).release());
-
-  // Send back our response.
-  scoped_ptr<dbus::Response> response(
-      dbus::Response::FromMethodCall(method_call));
-  dbus::MessageWriter writer(response.get());
-  writer.AppendString(id);
-  return response.Pass();
+  return device_info_->StartRegistration(params, error);
 }
 
-scoped_ptr<dbus::Response> Manager::HandleFinishRegisterDevice(
-  dbus::MethodCall* method_call) {
-  // Read the parameters to the method.
-  dbus::MessageReader reader(method_call);
-  if (!reader.HasMoreData()) {
-    return GetBadArgsError(method_call,
-                           "No parameters to FinishRegisterDevice");
-  }
-  std::string user_auth_code;
-  if (!reader.PopString(&user_auth_code)) {
-    return GetBadArgsError(method_call, "Failed to read UserAuthCode");
-  }
-  if (reader.HasMoreData()) {
-    return GetBadArgsError(method_call,
-                           "Too many parameters to FinishRegisterDevice");
-  }
-
+std::string Manager::HandleFinishRegisterDevice(
+    chromeos::ErrorPtr* error, const std::string& user_auth_code) {
   LOG(INFO) << "Received call to Manager.FinishRegisterDevice()";
-  chromeos::ErrorPtr error;
-  if (!device_info_->FinishRegistration(user_auth_code, &error))
-    return scoped_ptr<dbus::Response>(
-        GetDBusError(method_call, error.get()).release());
+  if (!device_info_->FinishRegistration(user_auth_code, error))
+    return std::string();
 
-  std::string device_id = device_info_->GetDeviceId(&error);
-  if (device_id.empty())
-    return scoped_ptr<dbus::Response>(
-        GetDBusError(method_call, error.get()).release());
-
-  // Send back our response.
-  scoped_ptr<dbus::Response> response(
-    dbus::Response::FromMethodCall(method_call));
-  dbus::MessageWriter writer(response.get());
-  writer.AppendString(device_id);
-  return response.Pass();
+  return device_info_->GetDeviceId(error);
 }
 
-scoped_ptr<dbus::Response> Manager::HandleUpdateState(
-    dbus::MethodCall *method_call) {
-  // Read the parameters to the method.
-  dbus::MessageReader reader(method_call);
-  if (!reader.HasMoreData()) {
-    return GetBadArgsError(method_call, "No parameters to UpdateState");
-  }
-  std::string json_state_fragment;
-  if (!reader.PopString(&json_state_fragment)) {
-    return GetBadArgsError(method_call, "Failed to read json_state_fragment");
-  }
-  if (reader.HasMoreData()) {
-    return GetBadArgsError(method_call, "Too many parameters to UpdateState");
-  }
-
-  LOG(INFO) << "Received call to Manager.UpdateState()";
+void Manager::HandleUpdateState(
+    chromeos::ErrorPtr* error, const std::string& json_state_fragment) {
   // TODO(wiley): Merge json state blobs intelligently.
-  properties_->state_.SetValue(json_state_fragment);
-
-  // Send back our response.
-  return dbus::Response::FromMethodCall(method_call);
+  state_.SetValue(json_state_fragment);
 }
 
-scoped_ptr<dbus::Response> Manager::HandleTestMethod(
-    dbus::MethodCall* method_call) {
-  LOG(INFO) << "Received call to test method.";
-  return scoped_ptr<dbus::Response>();
+void Manager::HandleTestMethod(chromeos::ErrorPtr* error) {
+  LOG(INFO) << "Received call to test method";
 }
 
 }  // namespace buffet