blob: db455c327e13af680ae022f5102bdb4ba73ca20c [file] [log] [blame]
// Copyright 2017 The Chromium 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 "chromeos/dbus/services/component_updater_service_provider.h"
#include <utility>
#include "base/bind.h"
#include "base/files/file_path.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
namespace {
const char kErrorInvalidArgs[] = "org.freedesktop.DBus.Error.InvalidArgs";
const char kErrorInternalError[] = "org.freedesktop.DBus.Error.InternalError";
} // namespace
ComponentUpdaterServiceProvider::ComponentUpdaterServiceProvider(
std::unique_ptr<Delegate> delegate)
: delegate_(std::move(delegate)), weak_ptr_factory_(this) {}
ComponentUpdaterServiceProvider::~ComponentUpdaterServiceProvider() = default;
void ComponentUpdaterServiceProvider::Start(
scoped_refptr<dbus::ExportedObject> exported_object) {
exported_object->ExportMethod(
kComponentUpdaterServiceInterface,
kComponentUpdaterServiceLoadComponentMethod,
base::Bind(&ComponentUpdaterServiceProvider::LoadComponent,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&ComponentUpdaterServiceProvider::OnExported,
weak_ptr_factory_.GetWeakPtr()));
exported_object->ExportMethod(
kComponentUpdaterServiceInterface,
kComponentUpdaterServiceUnloadComponentMethod,
base::Bind(&ComponentUpdaterServiceProvider::UnloadComponent,
weak_ptr_factory_.GetWeakPtr()),
base::Bind(&ComponentUpdaterServiceProvider::OnExported,
weak_ptr_factory_.GetWeakPtr()));
}
void ComponentUpdaterServiceProvider::OnExported(
const std::string& interface_name,
const std::string& method_name,
bool success) {
if (!success) {
LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
}
}
void ComponentUpdaterServiceProvider::LoadComponent(
dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string component_name;
// |mount| is an optional parameter, and by default is true.
bool mount = true;
if (reader.PopString(&component_name)) {
reader.PopBool(&mount);
delegate_->LoadComponent(
component_name, mount,
base::Bind(&ComponentUpdaterServiceProvider::OnLoadComponent,
weak_ptr_factory_.GetWeakPtr(), method_call,
response_sender));
} else {
std::unique_ptr<dbus::ErrorResponse> error_response =
dbus::ErrorResponse::FromMethodCall(
method_call, kErrorInvalidArgs,
"Need a string and a boolean parameter.");
response_sender.Run(std::move(error_response));
}
}
void ComponentUpdaterServiceProvider::OnLoadComponent(
dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender,
const base::FilePath& result) {
std::unique_ptr<dbus::Response> response =
dbus::Response::FromMethodCall(method_call);
dbus::MessageWriter writer(response.get());
writer.AppendString(result.value());
response_sender.Run(std::move(response));
}
void ComponentUpdaterServiceProvider::UnloadComponent(
dbus::MethodCall* method_call,
dbus::ExportedObject::ResponseSender response_sender) {
dbus::MessageReader reader(method_call);
std::string component_name;
if (reader.PopString(&component_name)) {
if (delegate_->UnloadComponent(component_name)) {
response_sender.Run(dbus::Response::FromMethodCall(method_call));
} else {
response_sender.Run(dbus::ErrorResponse::FromMethodCall(
method_call, kErrorInternalError, "Failed to unload component"));
}
} else {
response_sender.Run(dbus::ErrorResponse::FromMethodCall(
method_call, kErrorInvalidArgs,
"Missing component name string argument."));
}
}
} // namespace chromeos