blob: 796aac12bce87b2ab1044481551d8ff641f8e7b8 [file] [log] [blame]
// Copyright 2020 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/arc/arc_data_snapshotd_client.h"
#include <memory>
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_task_runner_handle.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "third_party/cros_system_api/dbus/arc-data-snapshotd/dbus-constants.h"
namespace chromeos {
namespace {
void OnBoolMethodCallback(VoidDBusMethodCallback callback,
dbus::Response* response) {
if (!response) {
std::move(callback).Run(false /* success */);
return;
}
dbus::MessageReader reader(response);
bool success;
if (!reader.PopBool(&success)) {
std::move(callback).Run(false /* success */);
return;
}
std::move(callback).Run(success);
}
void OnLoadSnapshotMethodCallback(
ArcDataSnapshotdClient::LoadSnapshotMethodCallback callback,
dbus::Response* response) {
if (!response) {
std::move(callback).Run(false /* success */, false /* last */);
return;
}
dbus::MessageReader reader(response);
bool success;
if (!reader.PopBool(&success)) {
std::move(callback).Run(false /* success */, false /* last */);
return;
}
bool last;
if (!reader.PopBool(&last)) {
std::move(callback).Run(success, false /* last */);
return;
}
std::move(callback).Run(success, last);
}
class ArcDataSnapshotdClientImpl : public ArcDataSnapshotdClient {
public:
ArcDataSnapshotdClientImpl() {}
~ArcDataSnapshotdClientImpl() override = default;
ArcDataSnapshotdClientImpl(const ArcDataSnapshotdClientImpl&) = delete;
ArcDataSnapshotdClientImpl& operator=(const ArcDataSnapshotdClientImpl&) =
delete;
void GenerateKeyPair(VoidDBusMethodCallback callback) override {
dbus::MethodCall method_call(
arc::data_snapshotd::kArcDataSnapshotdServiceInterface,
arc::data_snapshotd::kGenerateKeyPairMethod);
dbus::MessageWriter writer(&method_call);
proxy_->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&OnBoolMethodCallback, std::move(callback)));
}
void ClearSnapshot(bool last, VoidDBusMethodCallback callback) override {
dbus::MethodCall method_call(
arc::data_snapshotd::kArcDataSnapshotdServiceInterface,
arc::data_snapshotd::kClearSnapshotMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendBool(last);
proxy_->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&OnBoolMethodCallback, std::move(callback)));
}
void TakeSnapshot(const std::string& account_id,
VoidDBusMethodCallback callback) override {
dbus::MethodCall method_call(
arc::data_snapshotd::kArcDataSnapshotdServiceInterface,
arc::data_snapshotd::kTakeSnapshotMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendString(account_id);
proxy_->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&OnBoolMethodCallback, std::move(callback)));
}
void LoadSnapshot(const std::string& account_id,
base::OnceCallback<void(bool, bool)> callback) override {
dbus::MethodCall method_call(
arc::data_snapshotd::kArcDataSnapshotdServiceInterface,
arc::data_snapshotd::kLoadSnapshotMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendString(account_id);
proxy_->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&OnLoadSnapshotMethodCallback, std::move(callback)));
}
void Update(int percent, VoidDBusMethodCallback callback) override {
dbus::MethodCall method_call(
arc::data_snapshotd::kArcDataSnapshotdServiceInterface,
arc::data_snapshotd::kUpdateMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendInt32(percent);
proxy_->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&OnBoolMethodCallback, std::move(callback)));
}
void WaitForServiceToBeAvailable(
dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback)
override {
proxy_->WaitForServiceToBeAvailable(std::move(callback));
}
protected:
void Init(dbus::Bus* bus) override {
proxy_ = bus->GetObjectProxy(
arc::data_snapshotd::kArcDataSnapshotdServiceName,
dbus::ObjectPath(arc::data_snapshotd::kArcDataSnapshotdServicePath));
}
private:
// Owned by the D-Bus implementation, who outlives this class.
dbus::ObjectProxy* proxy_ = nullptr;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<ArcDataSnapshotdClientImpl> weak_ptr_factory_{this};
};
} // namespace
ArcDataSnapshotdClient::ArcDataSnapshotdClient() = default;
ArcDataSnapshotdClient::~ArcDataSnapshotdClient() = default;
std::unique_ptr<ArcDataSnapshotdClient> ArcDataSnapshotdClient::Create() {
return std::make_unique<ArcDataSnapshotdClientImpl>();
}
} // namespace chromeos