1// Copyright 2013 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 "chromeos/dbus/bluetooth_input_client.h"
6
7#include <map>
8
9#include "base/logging.h"
10#include "base/stl_util.h"
11#include "dbus/bus.h"
12#include "dbus/message.h"
13#include "dbus/object_manager.h"
14#include "dbus/object_path.h"
15#include "dbus/object_proxy.h"
16#include "third_party/cros_system_api/dbus/service_constants.h"
17
18namespace chromeos {
19
20BluetoothInputClient::Properties::Properties(
21    dbus::ObjectProxy* object_proxy,
22    const std::string& interface_name,
23    const PropertyChangedCallback& callback)
24    : dbus::PropertySet(object_proxy, interface_name, callback) {
25  RegisterProperty(bluetooth_input::kReconnectModeProperty, &reconnect_mode);
26}
27
28BluetoothInputClient::Properties::~Properties() {
29}
30
31
32// The BluetoothInputClient implementation used in production.
33class BluetoothInputClientImpl
34    : public BluetoothInputClient,
35      public dbus::ObjectManager::Interface {
36 public:
37  BluetoothInputClientImpl() : object_manager_(NULL), weak_ptr_factory_(this) {}
38
39  virtual ~BluetoothInputClientImpl() {
40    object_manager_->UnregisterInterface(
41        bluetooth_input::kBluetoothInputInterface);
42  }
43
44  // BluetoothInputClient override.
45  virtual void AddObserver(BluetoothInputClient::Observer* observer)
46      OVERRIDE {
47    DCHECK(observer);
48    observers_.AddObserver(observer);
49  }
50
51  // BluetoothInputClient override.
52  virtual void RemoveObserver(BluetoothInputClient::Observer* observer)
53      OVERRIDE {
54    DCHECK(observer);
55    observers_.RemoveObserver(observer);
56  }
57
58  // dbus::ObjectManager::Interface override.
59  virtual dbus::PropertySet* CreateProperties(
60      dbus::ObjectProxy* object_proxy,
61      const dbus::ObjectPath& object_path,
62      const std::string& interface_name) OVERRIDE {
63    Properties* properties = new Properties(
64        object_proxy,
65        interface_name,
66        base::Bind(&BluetoothInputClientImpl::OnPropertyChanged,
67                   weak_ptr_factory_.GetWeakPtr(),
68                   object_path));
69    return static_cast<dbus::PropertySet*>(properties);
70  }
71
72  // BluetoothInputClient override.
73  virtual Properties* GetProperties(const dbus::ObjectPath& object_path)
74      OVERRIDE {
75    return static_cast<Properties*>(
76        object_manager_->GetProperties(
77            object_path,
78            bluetooth_input::kBluetoothInputInterface));
79  }
80
81 protected:
82  virtual void Init(dbus::Bus* bus) OVERRIDE {
83    object_manager_ = bus->GetObjectManager(
84        bluetooth_object_manager::kBluetoothObjectManagerServiceName,
85        dbus::ObjectPath(
86            bluetooth_object_manager::kBluetoothObjectManagerServicePath));
87    object_manager_->RegisterInterface(
88        bluetooth_input::kBluetoothInputInterface, this);
89  }
90
91 private:
92  // Called by dbus::ObjectManager when an object with the input interface
93  // is created. Informs observers.
94  virtual void ObjectAdded(const dbus::ObjectPath& object_path,
95                           const std::string& interface_name) OVERRIDE {
96    FOR_EACH_OBSERVER(BluetoothInputClient::Observer, observers_,
97                      InputAdded(object_path));
98  }
99
100  // Called by dbus::ObjectManager when an object with the input interface
101  // is removed. Informs observers.
102  virtual void ObjectRemoved(const dbus::ObjectPath& object_path,
103                             const std::string& interface_name) OVERRIDE {
104    FOR_EACH_OBSERVER(BluetoothInputClient::Observer, observers_,
105                      InputRemoved(object_path));
106  }
107
108  // Called by BluetoothPropertySet when a property value is changed,
109  // either by result of a signal or response to a GetAll() or Get()
110  // call. Informs observers.
111  void OnPropertyChanged(const dbus::ObjectPath& object_path,
112                         const std::string& property_name) {
113    FOR_EACH_OBSERVER(BluetoothInputClient::Observer, observers_,
114                      InputPropertyChanged(object_path, property_name));
115  }
116
117  dbus::ObjectManager* object_manager_;
118
119  // List of observers interested in event notifications from us.
120  ObserverList<BluetoothInputClient::Observer> observers_;
121
122  // Weak pointer factory for generating 'this' pointers that might live longer
123  // than we do.
124  // Note: This should remain the last member so it'll be destroyed and
125  // invalidate its weak pointers before any other members are destroyed.
126  base::WeakPtrFactory<BluetoothInputClientImpl> weak_ptr_factory_;
127
128  DISALLOW_COPY_AND_ASSIGN(BluetoothInputClientImpl);
129};
130
131BluetoothInputClient::BluetoothInputClient() {
132}
133
134BluetoothInputClient::~BluetoothInputClient() {
135}
136
137BluetoothInputClient* BluetoothInputClient::Create() {
138  return new BluetoothInputClientImpl();
139}
140
141}  // namespace chromeos
142