1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file. 4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_manager_client.h" 6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/logging.h" 8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_characteristic_service_provider.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_descriptor_service_provider.h" 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_service_service_provider.h" 11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "third_party/cros_system_api/dbus/service_constants.h" 12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace chromeos { 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::FakeBluetoothGattManagerClient() { 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::~FakeBluetoothGattManagerClient() { 19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// DBusClient override. 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::Init(dbus::Bus* bus) { 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// BluetoothGattManagerClient overrides. 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterService( 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& service_path, 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Options& options, 29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const base::Closure& callback, 30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const ErrorCallback& error_callback) { 31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "Register GATT service: " << service_path.value(); 32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // If a service provider wasn't created before, return error. 34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::iterator iter = service_map_.find(service_path); 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == service_map_.end()) { 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments, 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch "GATT service doesn't exist: " + service_path.value()); 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Check to see if this GATT service was already registered. 42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceProvider* provider = &iter->second; 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (provider->first) { 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run( 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bluetooth_gatt_manager::kErrorAlreadyExists, 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch "GATT service already registered: " + service_path.value()); 47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Success! 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch provider->first = true; 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch callback.Run(); 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterService( 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& service_path, 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const base::Closure& callback, 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const ErrorCallback& error_callback) { 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "Unregister GATT service: " << service_path.value(); 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // If a service provider wasn't created before, return error. 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::iterator iter = service_map_.find(service_path); 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == service_map_.end()) { 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments, 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch "GATT service doesn't exist: " + service_path.value()); 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Return error if the GATT service wasn't registered before. 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceProvider* provider = &iter->second; 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!provider->first) { 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run( 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bluetooth_gatt_manager::kErrorDoesNotExist, 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch "GATT service not registered: " + service_path.value()); 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Success! 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch provider->first = false; 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch callback.Run(); 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterServiceServiceProvider( 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattServiceServiceProvider* provider) { 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ignore, if a service provider is already registered for the object path. 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::iterator iter = service_map_.find(provider->object_path()); 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter != service_map_.end()) { 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT service service provider already registered for " 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << "object path: " << provider->object_path().value(); 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service_map_[provider->object_path()] = std::make_pair(false, provider); 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterCharacteristicServiceProvider( 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattCharacteristicServiceProvider* provider) { 97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ignore, if a service provider is already registered for the object path. 98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch CharacteristicMap::iterator iter = 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch characteristic_map_.find(provider->object_path()); 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter != characteristic_map_.end()) { 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT characteristic service provider already registered for " 102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << "object path: " << provider->object_path().value(); 103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch characteristic_map_[provider->object_path()] = provider; 106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::RegisterDescriptorServiceProvider( 109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattDescriptorServiceProvider* provider) { 110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ignore, if a service provider is already registered for the object path. 111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DescriptorMap::iterator iter = 112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch descriptor_map_.find(provider->object_path()); 113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter != descriptor_map_.end()) { 114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT descriptor service provider already registered for " 115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << "object path: " << provider->object_path().value(); 116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch descriptor_map_[provider->object_path()] = provider; 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterServiceServiceProvider( 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattServiceServiceProvider* provider) { 123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::iterator iter = 124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service_map_.find(provider->object_path()); 125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter != service_map_.end() && iter->second.second == provider) 126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service_map_.erase(iter); 127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterCharacteristicServiceProvider( 130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattCharacteristicServiceProvider* provider) { 131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch characteristic_map_.erase(provider->object_path()); 132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattManagerClient::UnregisterDescriptorServiceProvider( 135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattDescriptorServiceProvider* provider) { 136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch descriptor_map_.erase(provider->object_path()); 137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattServiceServiceProvider* 140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetServiceServiceProvider( 141e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& object_path) const { 142e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::const_iterator iter = service_map_.find(object_path); 143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == service_map_.end()) 144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return NULL; 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return iter->second.second; 146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider* 149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetCharacteristicServiceProvider( 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& object_path) const { 151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch CharacteristicMap::const_iterator iter = 152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch characteristic_map_.find(object_path); 153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == characteristic_map_.end()) 154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return NULL; 155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return iter->second; 156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattDescriptorServiceProvider* 159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattManagerClient::GetDescriptorServiceProvider( 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& object_path) const { 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DescriptorMap::const_iterator iter = descriptor_map_.find(object_path); 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == descriptor_map_.end()) 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return NULL; 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return iter->second; 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool FakeBluetoothGattManagerClient::IsServiceRegistered( 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& object_path) const { 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ServiceMap::const_iterator iter = service_map_.find(object_path); 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (iter == service_map_.end()) 171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return iter->second.first; 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace chromeos 176