buffet: Add generic DBus object implementation framework

Added a DBusObject class that significantly simplifies
implementation of DBus objects in C++ by abstracting
method dispatch and property registration.

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

Change-Id: Ieef0d520e2649d53db2b5034cdd74fd2a094f252
Reviewed-on: https://chromium-review.googlesource.com/212681
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index 6ec8c85..52a131f 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -29,7 +29,6 @@
         'commands/schema_utils.cc',
         'data_encoding.cc',
         'dbus_constants.cc',
-        'dbus_utils.cc',
         'device_registration_info.cc',
         'http_request.cc',
         'http_connection_curl.cc',
diff --git a/buffet/dbus_utils.cc b/buffet/dbus_utils.cc
deleted file mode 100644
index ecb2f74..0000000
--- a/buffet/dbus_utils.cc
+++ /dev/null
@@ -1,57 +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_utils.h"
-
-#include <string>
-
-#include <base/bind.h>
-#include <base/logging.h>
-
-namespace buffet {
-
-namespace dbus_utils {
-
-namespace {
-
-// Passes |method_call| to |handler| and passes the response to
-// |response_sender|. If |handler| returns NULL, an empty response is created
-// and sent.
-void HandleSynchronousDBusMethodCall(
-    base::Callback<scoped_ptr<dbus::Response>(dbus::MethodCall*)> handler,
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  auto response = handler.Run(method_call);
-  if (!response)
-    response = dbus::Response::FromMethodCall(method_call);
-
-  response_sender.Run(response.Pass());
-}
-
-}  // namespace
-
-scoped_ptr<dbus::Response> GetDBusError(dbus::MethodCall* method_call,
-                                        const chromeos::Error* error) {
-  std::string message;
-  while (error) {
-    // Format error string as "domain/code:message".
-    if (!message.empty())
-      message += ';';
-    message += error->GetDomain() + '/' + error->GetCode() + ':' +
-               error->GetMessage();
-    error = error->GetInnerError();
-  }
-  scoped_ptr<dbus::ErrorResponse> resp(dbus::ErrorResponse::FromMethodCall(
-    method_call, "org.freedesktop.DBus.Error.Failed", message));
-  return scoped_ptr<dbus::Response>(resp.release());
-}
-
-dbus::ExportedObject::MethodCallCallback GetExportableDBusMethod(
-    base::Callback<scoped_ptr<dbus::Response>(dbus::MethodCall*)> handler) {
-  return base::Bind(&HandleSynchronousDBusMethodCall, handler);
-}
-
-}  // namespace dbus_utils
-
-}  // namespace buffet
diff --git a/buffet/dbus_utils.h b/buffet/dbus_utils.h
deleted file mode 100644
index 9a2851c..0000000
--- a/buffet/dbus_utils.h
+++ /dev/null
@@ -1,28 +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_UTILS_H_
-#define BUFFET_DBUS_UTILS_H_
-
-#include <base/memory/scoped_ptr.h>
-#include <chromeos/error.h>
-#include <dbus/exported_object.h>
-#include <dbus/message.h>
-
-namespace buffet {
-
-namespace dbus_utils {
-
-scoped_ptr<dbus::Response> GetDBusError(dbus::MethodCall* method_call,
-                                        const chromeos::Error* error);
-
-dbus::ExportedObject::MethodCallCallback GetExportableDBusMethod(
-    base::Callback<scoped_ptr<dbus::Response>(dbus::MethodCall*)> handler);
-
-}  // namespace dbus_utils
-
-}  // namespace buffet
-
-#endif  // BUFFET_DBUS_UTILS_H_
-
diff --git a/buffet/manager.cc b/buffet/manager.cc
index a039ae8..6c258ba 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -20,12 +20,11 @@
 
 #include "buffet/commands/command_manager.h"
 #include "buffet/dbus_constants.h"
-#include "buffet/dbus_utils.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
 using chromeos::dbus_utils::GetBadArgsError;
 using chromeos::dbus_utils::ExportedObjectManager;
-using buffet::dbus_utils::GetDBusError;
+using chromeos::dbus_utils::GetDBusError;
 
 namespace buffet {
 
@@ -55,7 +54,7 @@
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface,
       dbus_constants::kManagerCheckDeviceRegistered,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleCheckDeviceRegistered,
           base::Unretained(this))),
       sequencer->GetExportHandler(
@@ -66,7 +65,7 @@
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface,
       dbus_constants::kManagerGetDeviceInfo,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleGetDeviceInfo,
           base::Unretained(this))),
       sequencer->GetExportHandler(
@@ -77,7 +76,7 @@
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface,
       dbus_constants::kManagerStartRegisterDevice,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleStartRegisterDevice,
           base::Unretained(this))),
       sequencer->GetExportHandler(
@@ -88,7 +87,7 @@
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface,
       dbus_constants::kManagerFinishRegisterDevice,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleFinishRegisterDevice,
           base::Unretained(this))),
       sequencer->GetExportHandler(
@@ -99,7 +98,7 @@
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface,
       dbus_constants::kManagerUpdateStateMethod,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleUpdateState,
           base::Unretained(this))),
       sequencer->GetExportHandler(
@@ -109,7 +108,7 @@
           true));
   exported_object_->ExportMethod(
       dbus_constants::kManagerInterface, dbus_constants::kManagerTestMethod,
-      dbus_utils::GetExportableDBusMethod(
+      chromeos::dbus_utils::GetExportableDBusMethod(
           base::Bind(&Manager::HandleTestMethod, base::Unretained(this))),
       sequencer->GetExportHandler(
           dbus_constants::kManagerInterface, dbus_constants::kManagerTestMethod,
@@ -153,14 +152,16 @@
   // treat it as a real error and report it to the caller.
   if (!registered &&
       !error->HasError(kErrorDomainGCD, "device_not_registered")) {
-    return GetDBusError(method_call, error.get());
+    return scoped_ptr<dbus::Response>(
+        GetDBusError(method_call, error.get()).release());
   }
 
   std::string device_id;
   if (registered) {
     device_id = device_info_->GetDeviceId(&error);
     if (device_id.empty())
-      return GetDBusError(method_call, error.get());
+      return scoped_ptr<dbus::Response>(
+          GetDBusError(method_call, error.get()).release());
   }
   // Send back our response.
   scoped_ptr<dbus::Response> response(
@@ -185,7 +186,8 @@
   chromeos::ErrorPtr error;
   auto device_info = device_info_->GetDeviceInfo(&error);
   if (!device_info)
-    return GetDBusError(method_call, error.get());
+    return scoped_ptr<dbus::Response>(
+        GetDBusError(method_call, error.get()).release());
 
   base::JSONWriter::Write(device_info.get(), &device_info_str);
 
@@ -230,7 +232,8 @@
   chromeos::ErrorPtr error;
   std::string id = device_info_->StartRegistration(params, &error);
   if (id.empty())
-    return GetDBusError(method_call, error.get());
+    return scoped_ptr<dbus::Response>(
+        GetDBusError(method_call, error.get()).release());
 
   // Send back our response.
   scoped_ptr<dbus::Response> response(
@@ -260,11 +263,13 @@
   LOG(INFO) << "Received call to Manager.FinishRegisterDevice()";
   chromeos::ErrorPtr error;
   if (!device_info_->FinishRegistration(user_auth_code, &error))
-    return GetDBusError(method_call, error.get());
+    return scoped_ptr<dbus::Response>(
+        GetDBusError(method_call, error.get()).release());
 
   std::string device_id = device_info_->GetDeviceId(&error);
   if (device_id.empty())
-    return GetDBusError(method_call, error.get());
+    return scoped_ptr<dbus::Response>(
+        GetDBusError(method_call, error.get()).release());
 
   // Send back our response.
   scoped_ptr<dbus::Response> response(