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_characteristic_service_provider.h" 6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/logging.h" 8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/strings/string_util.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/dbus_thread_manager.h" 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chromeos/dbus/fake_bluetooth_gatt_manager_client.h" 11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace chromeos { 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider:: 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattCharacteristicServiceProvider( 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& object_path, 17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Delegate* delegate, 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string& uuid, 19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::vector<std::string>& flags, 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::vector<std::string>& permissions, 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const dbus::ObjectPath& service_path) 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : object_path_(object_path), 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch uuid_(uuid), 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service_path_(service_path), 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_(delegate) { 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "Creating Bluetooth GATT characteristic: " << object_path_.value(); 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(object_path_.IsValid()); 29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(service_path_.IsValid()); 30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!uuid.empty()); 31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(delegate_); 32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(StartsWithASCII( 33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch object_path_.value(), service_path_.value() + "/", true)); 34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // TODO(armansito): Do something with |flags| and |permissions|. 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client = 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static_cast<FakeBluetoothGattManagerClient*>( 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DBusThreadManager::Get()->GetBluetoothGattManagerClient()); 40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch fake_bluetooth_gatt_manager_client-> 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RegisterCharacteristicServiceProvider(this); 42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochFakeBluetoothGattCharacteristicServiceProvider:: 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ~FakeBluetoothGattCharacteristicServiceProvider() { 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "Cleaning up Bluetooth GATT characteristic: " 47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << object_path_.value(); 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client = 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static_cast<FakeBluetoothGattManagerClient*>( 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DBusThreadManager::Get()->GetBluetoothGattManagerClient()); 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch fake_bluetooth_gatt_manager_client-> 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UnregisterCharacteristicServiceProvider(this); 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::SendValueChanged( 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::vector<uint8>& value) { 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "Sent characteristic value changed: " << object_path_.value() 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << " UUID: " << uuid_; 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::GetValue( 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Delegate::ValueCallback& callback, 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Delegate::ErrorCallback& error_callback) { 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT characteristic value Get request: " << object_path_.value() 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << " UUID: " << uuid_; 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Check if this characteristic is registered. 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client = 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static_cast<FakeBluetoothGattManagerClient*>( 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DBusThreadManager::Get()->GetBluetoothGattManagerClient()); 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!fake_bluetooth_gatt_manager_client->IsServiceRegistered(service_path_)) { 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT characteristic not registered."; 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run(); 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Pass on to the delegate. 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(delegate_); 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_->GetCharacteristicValue(callback, error_callback); 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid FakeBluetoothGattCharacteristicServiceProvider::SetValue( 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::vector<uint8>& value, 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const base::Closure& callback, 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Delegate::ErrorCallback& error_callback) { 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT characteristic value Set request: " << object_path_.value() 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch << " UUID: " << uuid_; 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Check if this characteristic is registered. 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client = 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static_cast<FakeBluetoothGattManagerClient*>( 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DBusThreadManager::Get()->GetBluetoothGattManagerClient()); 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!fake_bluetooth_gatt_manager_client->IsServiceRegistered(service_path_)) { 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "GATT characteristic not registered."; 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch error_callback.Run(); 97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Pass on to the delegate. 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(delegate_); 102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch delegate_->SetCharacteristicValue(value, callback, error_callback); 103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace chromeos 106