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/device_registration_info.cc b/buffet/device_registration_info.cc
index c6aef06..800cfa0 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -53,7 +53,7 @@
FILE_PATH_LITERAL("/var/lib/buffet/device_reg_info");
bool GetParamValue(
- const std::map<std::string, std::shared_ptr<base::Value>>& params,
+ const std::map<std::string, std::unique_ptr<base::Value>>& params,
const std::string& param_name,
std::string* param_value) {
auto p = params.find(param_name);
@@ -335,7 +335,7 @@
}
std::string DeviceRegistrationInfo::StartRegistration(
- const std::map<std::string, std::shared_ptr<base::Value>>& params,
+ const std::map<std::string, std::unique_ptr<base::Value>>& params,
chromeos::ErrorPtr* error) {
GetParamValue(params, storage_keys::kClientId, &client_id_);
GetParamValue(params, storage_keys::kClientSecret, &client_secret_);
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index df23e36..1985bb6 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -96,7 +96,7 @@
// and so on. If a particular key-value pair is omitted, a default value
// is used when possible. Returns a device claim ID on success.
std::string StartRegistration(
- const std::map<std::string, std::shared_ptr<base::Value>>& params,
+ const std::map<std::string, std::unique_ptr<base::Value>>& params,
chromeos::ErrorPtr* error);
// Finalizes the device registration. If |user_auth_code| is provided, then
diff --git a/buffet/device_registration_info_unittest.cc b/buffet/device_registration_info_unittest.cc
index 553a118..635b539 100644
--- a/buffet/device_registration_info_unittest.cc
+++ b/buffet/device_registration_info_unittest.cc
@@ -325,7 +325,7 @@
transport_->AddHandler(dev_reg_->GetServiceURL("registrationTickets"),
request_type::kPost,
base::Bind(create_ticket));
- std::map<std::string, std::shared_ptr<base::Value>> params;
+ std::map<std::string, std::unique_ptr<base::Value>> params;
std::string json_resp = dev_reg_->StartRegistration(params, nullptr);
auto json = std::unique_ptr<base::Value>(base::JSONReader::Read(json_resp));
EXPECT_NE(nullptr, json.get());
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
diff --git a/buffet/manager.h b/buffet/manager.h
index 2bb9d5f..73ed8aa 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -5,19 +5,17 @@
#ifndef BUFFET_MANAGER_H_
#define BUFFET_MANAGER_H_
+#include <map>
#include <memory>
#include <string>
#include <base/basictypes.h>
-#include <base/memory/scoped_ptr.h>
#include <base/memory/weak_ptr.h>
#include <base/values.h>
+#include <chromeos/dbus/dbus_object.h>
+#include <chromeos/error.h>
#include <chromeos/exported_property_set.h>
-#include <dbus/bus.h>
-#include <dbus/message.h>
-#include <dbus/object_path.h>
-#include "buffet/dbus_constants.h"
#include "buffet/device_registration_info.h"
namespace chromeos {
@@ -33,49 +31,37 @@
// The Manager is responsible for global state of Buffet. It exposes
// interfaces which affect the entire device such as device registration and
// device state.
-class Manager {
+class Manager final {
public:
- typedef base::Callback<void(bool success)> OnInitFinish;
-
- Manager(const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
- object_manager);
- ~Manager();
- void Init(const OnInitFinish& cb);
+ explicit Manager(
+ const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
+ object_manager);
+ void Init(
+ const chromeos::dbus_utils::AsyncEventSequencer::CompletionAction& cb);
private:
- struct Properties: public chromeos::dbus_utils::ExportedPropertySet {
- public:
- chromeos::dbus_utils::ExportedProperty<std::string> state_;
- explicit Properties(dbus::Bus* bus)
- : chromeos::dbus_utils::ExportedPropertySet(
- bus, dbus::ObjectPath(dbus_constants::kManagerServicePath)) {
- RegisterProperty(dbus_constants::kManagerInterface, "State", &state_);
- }
- virtual ~Properties() {}
- };
+ // DBus properties:
+ chromeos::dbus_utils::ExportedProperty<std::string> state_;
+ // DBus methods:
// Handles calls to org.chromium.Buffet.Manager.CheckDeviceRegistered().
- scoped_ptr<dbus::Response> HandleCheckDeviceRegistered(
- dbus::MethodCall* method_call);
+ std::string HandleCheckDeviceRegistered(chromeos::ErrorPtr* error);
// Handles calls to org.chromium.Buffet.Manager.GetDeviceInfo().
- scoped_ptr<dbus::Response> HandleGetDeviceInfo(
- dbus::MethodCall* method_call);
+ std::string HandleGetDeviceInfo(chromeos::ErrorPtr* error);
// Handles calls to org.chromium.Buffet.Manager.StartRegisterDevice().
- scoped_ptr<dbus::Response> HandleStartRegisterDevice(
- dbus::MethodCall* method_call);
+ std::string HandleStartRegisterDevice(chromeos::ErrorPtr* error,
+ const std::map<std::string,
+ std::unique_ptr<base::Value>>& params);
// Handles calls to org.chromium.Buffet.Manager.FinishRegisterDevice().
- scoped_ptr<dbus::Response> HandleFinishRegisterDevice(
- dbus::MethodCall* method_call);
+ std::string HandleFinishRegisterDevice(chromeos::ErrorPtr* error,
+ const std::string& user_auth_code);
// Handles calls to org.chromium.Buffet.Manager.UpdateState().
- scoped_ptr<dbus::Response> HandleUpdateState(
- dbus::MethodCall* method_call);
+ void HandleUpdateState(chromeos::ErrorPtr* error,
+ const std::string& json_state_fragment);
// Handles calls to org.chromium.Buffet.Manager.Test()
- scoped_ptr<::dbus::Response> HandleTestMethod(
- ::dbus::MethodCall* method_call);
+ void HandleTestMethod(chromeos::ErrorPtr* error);
- dbus::ExportedObject* exported_object_; // weak; owned by the Bus object.
- base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager> object_manager_;
- scoped_ptr<Properties> properties_;
+ chromeos::dbus_utils::DBusObject dbus_object_;
std::shared_ptr<CommandManager> command_manager_;
std::unique_ptr<DeviceRegistrationInfo> device_info_;