1685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//
2685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// Copyright (C) 2015 The Android Open Source Project
3685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//
4685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// you may not use this file except in compliance with the License.
6685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// You may obtain a copy of the License at
7685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//
8685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//
10685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// Unless required by applicable law or agreed to in writing, software
11685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// See the License for the specific language governing permissions and
14685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu// limitations under the License.
15685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu//
16685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
17685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#ifndef APMANAGER_DBUS_MANAGER_DBUS_ADAPTOR_H_
18685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#define APMANAGER_DBUS_MANAGER_DBUS_ADAPTOR_H_
19685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
207758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu#include <map>
217758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu
22685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#include <base/macros.h>
237758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu#include <brillo/dbus/dbus_service_watcher.h>
24685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#include <dbus_bindings/org.chromium.apmanager.Manager.h>
25685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
26685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#include "apmanager/manager_adaptor_interface.h"
27685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
28685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiunamespace apmanager {
29685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
30685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiuclass Manager;
317758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiuclass Service;
32685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
33685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiuclass ManagerDBusAdaptor : public org::chromium::apmanager::ManagerInterface,
34685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                           public ManagerAdaptorInterface {
35685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu public:
36685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  ManagerDBusAdaptor(const scoped_refptr<dbus::Bus>& bus,
37685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     brillo::dbus_utils::ExportedObjectManager* object_manager,
38685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     Manager* manager);
39685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  ~ManagerDBusAdaptor() override;
40685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
41685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  // Implementation of org::chromium::apmanager::ManagerInterface.
427758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  bool CreateService(brillo::ErrorPtr* dbus_error,
43685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     dbus::Message* message,
44685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     dbus::ObjectPath* out_service) override;
457758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  bool RemoveService(brillo::ErrorPtr* dbus_error,
46685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     dbus::Message* message,
47685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu                     const dbus::ObjectPath& in_service) override;
48685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
49685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  // Implementation of ManagerAdaptorInterface.
50685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  void RegisterAsync(
51685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu      const base::Callback<void(bool)>& completion_callback) override;
52685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
53685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu private:
547758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  using DBusServiceWatcher = brillo::dbus_utils::DBusServiceWatcher;
557758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  // Context for service owner watcher.
567758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  struct ServiceOwnerWatcherContext {
577758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    ServiceOwnerWatcherContext() {}
587758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    ServiceOwnerWatcherContext(const scoped_refptr<Service>& in_service,
597758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu                               std::unique_ptr<DBusServiceWatcher> in_watcher)
607758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu        : service(in_service),
617758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu          watcher(std::move(in_watcher)) {}
627758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    scoped_refptr<Service> service;
637758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu    std::unique_ptr<DBusServiceWatcher> watcher;
647758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  };
657758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu
667758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  // Invoked when the owner of a Service vanished.
677758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  void OnServiceOwnerVanished(const dbus::ObjectPath& service_path);
687758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu
69685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  org::chromium::apmanager::ManagerAdaptor adaptor_;
70685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  brillo::dbus_utils::DBusObject dbus_object_;
717758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  scoped_refptr<dbus::Bus> bus_;
72685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  Manager* manager_;
737758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  // Map of service path to owner monitor context.
747758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu  std::map<dbus::ObjectPath, ServiceOwnerWatcherContext>
757758d8db3ddb2582fb57bda4a26c9f6f6bd20316Peter Qiu      service_owner_watchers_;
76685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
77685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu  DISALLOW_COPY_AND_ASSIGN(ManagerDBusAdaptor);
78685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu};
79685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
80685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu}  // namespace apmanager
81685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu
82685dd4acea083dc74105edbdf8a06e539c291a45Peter Qiu#endif  // APMANAGER_DBUS_MANAGER_DBUS_ADAPTOR_H_
83