diff options
Diffstat (limited to 'device/bluetooth/bluetooth_gatt_notify_session_chromeos.cc')
-rw-r--r-- | device/bluetooth/bluetooth_gatt_notify_session_chromeos.cc | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/device/bluetooth/bluetooth_gatt_notify_session_chromeos.cc b/device/bluetooth/bluetooth_gatt_notify_session_chromeos.cc new file mode 100644 index 0000000..02f7ed8 --- /dev/null +++ b/device/bluetooth/bluetooth_gatt_notify_session_chromeos.cc @@ -0,0 +1,134 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/bluetooth_gatt_notify_session_chromeos.h" + +#include "base/bind.h" +#include "base/logging.h" +#include "device/bluetooth/bluetooth_adapter.h" +#include "device/bluetooth/bluetooth_device.h" +#include "device/bluetooth/bluetooth_gatt_service.h" +#include "device/bluetooth/bluetooth_remote_gatt_characteristic_chromeos.h" +#include "device/bluetooth/dbus/bluez_dbus_manager.h" + +namespace chromeos { + +BluetoothGattNotifySessionChromeOS::BluetoothGattNotifySessionChromeOS( + scoped_refptr<device::BluetoothAdapter> adapter, + const std::string& device_address, + const std::string& service_identifier, + const std::string& characteristic_identifier, + const dbus::ObjectPath& characteristic_path) + : active_(true), + adapter_(adapter), + device_address_(device_address), + service_id_(service_identifier), + characteristic_id_(characteristic_identifier), + object_path_(characteristic_path) { + DCHECK(adapter_.get()); + DCHECK(!device_address_.empty()); + DCHECK(!service_id_.empty()); + DCHECK(!characteristic_id_.empty()); + DCHECK(object_path_.IsValid()); + + bluez::BluezDBusManager::Get() + ->GetBluetoothGattCharacteristicClient() + ->AddObserver(this); +} + +BluetoothGattNotifySessionChromeOS::~BluetoothGattNotifySessionChromeOS() { + bluez::BluezDBusManager::Get() + ->GetBluetoothGattCharacteristicClient() + ->RemoveObserver(this); + Stop(base::Bind(&base::DoNothing)); +} + +std::string BluetoothGattNotifySessionChromeOS::GetCharacteristicIdentifier() + const { + return characteristic_id_; +} + +bool BluetoothGattNotifySessionChromeOS::IsActive() { + // Determine if the session is active. If |active_| is false, then it's + // been explicitly marked, so return false. + if (!active_) + return false; + + // The fact that |active_| is true doesn't mean that the session is + // actually active, since the characteristic might have stopped sending + // notifications yet this method was called before we processed the + // observer event (e.g. because somebody else called this method in their + // bluez::BluetoothGattCharacteristicClient::Observer implementation, which + // was + // called before ours). Check the client to see if notifications are still + // being sent. + bluez::BluetoothGattCharacteristicClient::Properties* properties = + bluez::BluezDBusManager::Get() + ->GetBluetoothGattCharacteristicClient() + ->GetProperties(object_path_); + if (!properties || !properties->notifying.value()) + active_ = false; + + return active_; +} + +void BluetoothGattNotifySessionChromeOS::Stop(const base::Closure& callback) { + if (!active_) { + VLOG(1) << "Notify session already inactive."; + callback.Run(); + return; + } + + // Mark this session as inactive no matter what. + active_ = false; + + device::BluetoothDevice* device = adapter_->GetDevice(device_address_); + if (!device) + return; + + device::BluetoothGattService* service = device->GetGattService(service_id_); + if (!service) + return; + + BluetoothRemoteGattCharacteristicChromeOS* chrc = + static_cast<BluetoothRemoteGattCharacteristicChromeOS*>( + service->GetCharacteristic(characteristic_id_)); + if (!chrc) + return; + + chrc->RemoveNotifySession(callback); +} + +void BluetoothGattNotifySessionChromeOS::GattCharacteristicRemoved( + const dbus::ObjectPath& object_path) { + if (object_path != object_path_) + return; + + active_ = false; +} + +void BluetoothGattNotifySessionChromeOS::GattCharacteristicPropertyChanged( + const dbus::ObjectPath& object_path, + const std::string& property_name) { + if (object_path != object_path_) + return; + + if (!active_) + return; + + bluez::BluetoothGattCharacteristicClient::Properties* properties = + bluez::BluezDBusManager::Get() + ->GetBluetoothGattCharacteristicClient() + ->GetProperties(object_path_); + if (!properties) { + active_ = false; + return; + } + + if (property_name == properties->notifying.name() && + !properties->notifying.value()) + active_ = false; +} + +} // namespace chromeos |