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