blob: d9f08c63386b40ac02a93da190c9302448c7a23e [file] [log] [blame]
Yusuke Sato6bc6a9fa2018-12-05 17:55:001// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/arc/arc_container_client_adapter.h"
6
7#include <string>
8#include <utility>
9
10#include "base/logging.h"
11#include "base/macros.h"
12#include "chromeos/dbus/dbus_method_call_status.h"
13#include "chromeos/dbus/dbus_thread_manager.h"
14#include "chromeos/dbus/login_manager/arc.pb.h"
15#include "chromeos/dbus/session_manager_client.h"
16
17namespace arc {
18
19namespace {
20
21chromeos::SessionManagerClient* GetSessionManagerClient() {
22 // If the DBusThreadManager or the SessionManagerClient aren't available,
23 // there isn't much we can do. This should only happen when running tests.
24 if (!chromeos::DBusThreadManager::IsInitialized() ||
25 !chromeos::DBusThreadManager::Get() ||
26 !chromeos::DBusThreadManager::Get()->GetSessionManagerClient()) {
27 return nullptr;
28 }
29 return chromeos::DBusThreadManager::Get()->GetSessionManagerClient();
30}
31
32} // namespace
33
34class ArcContainerClientAdapter
35 : public ArcClientAdapter,
36 public chromeos::SessionManagerClient::Observer {
37 public:
38 ArcContainerClientAdapter() {
39 chromeos::SessionManagerClient* client = GetSessionManagerClient();
40 if (client)
41 client->AddObserver(this);
42 }
43
44 ~ArcContainerClientAdapter() override {
45 chromeos::SessionManagerClient* client = GetSessionManagerClient();
46 if (client)
47 client->RemoveObserver(this);
48 }
49
50 // ArcClientAdapter overrides:
51 void StartMiniArc(const StartArcMiniContainerRequest& request,
52 StartMiniArcCallback callback) override {
53 GetSessionManagerClient()->StartArcMiniContainer(request,
54 std::move(callback));
55 }
56
57 void UpgradeArc(const UpgradeArcContainerRequest& request,
58 base::OnceClosure success_callback,
59 UpgradeErrorCallback error_callback) override {
60 GetSessionManagerClient()->UpgradeArcContainer(
61 request, std::move(success_callback), std::move(error_callback));
62 }
63
64 void StopArcInstance() override {
65 // Since we have the ArcInstanceStopped() callback, we don't need to do
66 // anything when StopArcInstance completes.
67 GetSessionManagerClient()->StopArcInstance(
68 chromeos::EmptyVoidDBusMethodCallback());
69 }
70
71 // chromeos::SessionManagerClient::Observer overrides:
72 void ArcInstanceStopped(login_manager::ArcContainerStopReason stop_reason,
73 const std::string& container_instance_id) override {
74 for (auto& observer : observer_list_)
75 observer.ArcInstanceStopped(stop_reason, container_instance_id);
76 }
77
78 private:
79 DISALLOW_COPY_AND_ASSIGN(ArcContainerClientAdapter);
80};
81
82std::unique_ptr<ArcClientAdapter> CreateArcContainerClientAdapter() {
83 return std::make_unique<ArcContainerClientAdapter>();
84}
85
86} // namespace arc