blob: d9f08c63386b40ac02a93da190c9302448c7a23e [file] [log] [blame]
// Copyright 2018 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 "components/arc/arc_container_client_adapter.h"
#include <string>
#include <utility>
#include "base/logging.h"
#include "base/macros.h"
#include "chromeos/dbus/dbus_method_call_status.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/login_manager/arc.pb.h"
#include "chromeos/dbus/session_manager_client.h"
namespace arc {
namespace {
chromeos::SessionManagerClient* GetSessionManagerClient() {
// If the DBusThreadManager or the SessionManagerClient aren't available,
// there isn't much we can do. This should only happen when running tests.
if (!chromeos::DBusThreadManager::IsInitialized() ||
!chromeos::DBusThreadManager::Get() ||
!chromeos::DBusThreadManager::Get()->GetSessionManagerClient()) {
return nullptr;
}
return chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
}
} // namespace
class ArcContainerClientAdapter
: public ArcClientAdapter,
public chromeos::SessionManagerClient::Observer {
public:
ArcContainerClientAdapter() {
chromeos::SessionManagerClient* client = GetSessionManagerClient();
if (client)
client->AddObserver(this);
}
~ArcContainerClientAdapter() override {
chromeos::SessionManagerClient* client = GetSessionManagerClient();
if (client)
client->RemoveObserver(this);
}
// ArcClientAdapter overrides:
void StartMiniArc(const StartArcMiniContainerRequest& request,
StartMiniArcCallback callback) override {
GetSessionManagerClient()->StartArcMiniContainer(request,
std::move(callback));
}
void UpgradeArc(const UpgradeArcContainerRequest& request,
base::OnceClosure success_callback,
UpgradeErrorCallback error_callback) override {
GetSessionManagerClient()->UpgradeArcContainer(
request, std::move(success_callback), std::move(error_callback));
}
void StopArcInstance() override {
// Since we have the ArcInstanceStopped() callback, we don't need to do
// anything when StopArcInstance completes.
GetSessionManagerClient()->StopArcInstance(
chromeos::EmptyVoidDBusMethodCallback());
}
// chromeos::SessionManagerClient::Observer overrides:
void ArcInstanceStopped(login_manager::ArcContainerStopReason stop_reason,
const std::string& container_instance_id) override {
for (auto& observer : observer_list_)
observer.ArcInstanceStopped(stop_reason, container_instance_id);
}
private:
DISALLOW_COPY_AND_ASSIGN(ArcContainerClientAdapter);
};
std::unique_ptr<ArcClientAdapter> CreateArcContainerClientAdapter() {
return std::make_unique<ArcContainerClientAdapter>();
}
} // namespace arc