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(