Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: device/bluetooth/bluetooth_remote_gatt_characteristic.h

Issue 2051333004: Implement BluetoothGattNotifySession::Stop on Android, 2nd attempt (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile error on windows Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/bluetooth_remote_gatt_characteristic.h
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.h b/device/bluetooth/bluetooth_remote_gatt_characteristic.h
index d8f9ff6dbdb8d0d9d0340d6bc37d60558e6fa8ab..f7035bab7e95d4bf2dde0efa84ebf79391ee3664 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic.h
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.h
@@ -6,14 +6,19 @@
#define DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_H_
#include <stdint.h>
+
+#include <queue>
+#include <set>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/callback_forward.h"
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
#include "device/bluetooth/bluetooth_export.h"
#include "device/bluetooth/bluetooth_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_remote_gatt_service.h"
#include "device/bluetooth/bluetooth_uuid.h"
namespace device {
@@ -52,10 +57,6 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattCharacteristic
// Returns a pointer to the GATT service this characteristic belongs to.
virtual BluetoothRemoteGattService* GetService() const = 0;
- // Returns whether or not this characteristic is currently sending value
- // updates in the form of a notification or indication.
- virtual bool IsNotifying() const = 0;
-
// Returns the list of GATT characteristic descriptors that provide more
// information about this characteristic.
virtual std::vector<BluetoothRemoteGattDescriptor*> GetDescriptors()
@@ -70,20 +71,50 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattCharacteristic
// multiple, as illustrated by Core Bluetooth Specification [V4.2 Vol 3 Part G
// 3.3.3.5 Characteristic Presentation Format].
std::vector<BluetoothRemoteGattDescriptor*> GetDescriptorsByUUID(
- const BluetoothUUID& uuid);
+ const BluetoothUUID& uuid) const;
+
+ // Get a weak pointer to the characteristic.
+ base::WeakPtr<BluetoothRemoteGattCharacteristic> GetWeakPtr();
+
+ // Returns whether or not this characteristic is currently sending value
+ // updates in the form of a notification or indication.
+ //
+ // If your code wants to receive notifications, you MUST call
+ // StartNotifySession and hold on to the resulting session object for as long
+ // as you want to keep receiving notifications. Even if this method returns
+ // true, and you are able to see the notifications coming in, you have no
+ // guarantee that the notifications will keep flowing for as long as you
+ // need, unless you open your own session.
+ virtual bool IsNotifying() const;
// Starts a notify session for the remote characteristic, if it supports
// notifications/indications. On success, the characteristic starts sending
// value notifications and |callback| is called with a session object whose
// ownership belongs to the caller. |error_callback| is called on errors.
//
- // Writes to the Client Characteristic Configuration descriptor to enable
- // notifications/indications. Core Bluetooth Specification [V4.2 Vol 3 Part G
- // Section 3.3.1.1. Characteristic Properties] requires this descriptor to be
- // present when notifications/indications are supported. If the descriptor is
- // not present |error_callback| will be run.
+ // This method handles all logic regarding multiple sessions so that
+ // specific platform implementations of the remote characteristic class
+ // do not have to. Rather than overriding this method, it is recommended
+ // to override the SubscribeToNotifications method below.
+ //
+ // The code in SubscribeToNotifications writes to the Client Characteristic
+ // Configuration descriptor to enable notifications/indications. Core
+ // Bluetooth Specification [V4.2 Vol 3 Part G Section 3.3.1.1. Characteristic
+ // Properties] requires this descriptor to be present when
+ // notifications/indications are supported. If the descriptor is not present
+ // |error_callback| will be run.
+ //
+ // Writing a non-zero value to the remote characteristic's Client
+ // Characteristic Configuration descriptor, causes the remote characteristic
+ // to start sending us notifications whenever the characteristic's value
+ // changes. When a new notification is received,
+ // BluetoothAdapterObserver::GattCharacteristicValueChanged is called with
+ // the characteristic's new value.
+ //
+ // To stop the flow of notifications, simply call the Stop method on the
+ // BluetoothGattNotifySession object that you received in |callback|.
virtual void StartNotifySession(const NotifySessionCallback& callback,
- const ErrorCallback& error_callback) = 0;
+ const ErrorCallback& error_callback);
// Sends a read request to a remote characteristic to read its value.
// |callback| is called to return the read value on success and
@@ -106,7 +137,101 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattCharacteristic
BluetoothRemoteGattCharacteristic();
~BluetoothRemoteGattCharacteristic() override;
+ // Writes to the Client Characteristic Configuration descriptor to enable
+ // notifications/indications. This method is meant to be called from
+ // StartNotifySession and should contain only the code necessary to start
+ // listening to characteristic notifications on a particular platform.
+ virtual void SubscribeToNotifications(
+ BluetoothRemoteGattDescriptor* ccc_descriptor,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) = 0;
+
+ // Writes to the Client Characteristic Configuration descriptor to disable
+ // notifications/indications. This method is meant to be called from
+ // StopNotifySession and should contain only the code necessary to stop
+ // listening to characteristic notifications on a particular platform.
+ virtual void UnsubscribeFromNotifications(
+ BluetoothRemoteGattDescriptor* ccc_descriptor,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) = 0;
+
private:
+ friend class BluetoothGattNotifySession;
+
+ // Stops an active notify session for the remote characteristic. On success,
+ // the characteristic removes this session from the list of active sessions.
+ // If there are no more active sessions, notifications/indications are
+ // turned off.
+ //
+ // This method is, and should only be, called from
+ // BluetoothGattNotifySession::Stop().
+ //
+ // The code in UnsubscribeFromNotifications writes to the Client
+ // Characteristic Configuration descriptor to disable
+ // notifications/indications. Core Bluetooth Specification [V4.2 Vol 3 Part G
+ // Section 3.3.1.1. Characteristic Properties] requires this descriptor to be
+ // present when notifications/indications are supported.
+ virtual void StopNotifySession(BluetoothGattNotifySession* session,
+ const base::Closure& callback);
+
+ class NotifySessionCommand {
+ public:
+ enum Type { COMMAND_NONE, COMMAND_START, COMMAND_STOP };
+ enum Result { RESULT_SUCCESS, RESULT_ERROR };
+
+ typedef base::Callback<
+ void(Type, Result, BluetoothRemoteGattService::GattErrorCode)>
+ ExecuteCallback;
+
+ ExecuteCallback execute_callback_;
+ base::Closure cancel_callback_;
+
+ NotifySessionCommand(const ExecuteCallback& execute_callback,
+ const base::Closure& cancel_callback);
+ ~NotifySessionCommand();
+
+ void Execute();
+ void Execute(
+ Type previous_command_type,
+ Result previous_command_result,
+ BluetoothRemoteGattService::GattErrorCode previous_command_error_code);
+ void Cancel();
+ };
+
+ void ExecuteStartNotifySession(
+ NotifySessionCallback callback,
+ ErrorCallback error_callback,
+ NotifySessionCommand::Type previous_command_type,
+ NotifySessionCommand::Result previous_command_result,
+ BluetoothRemoteGattService::GattErrorCode previous_command_error_code);
+ void CancelStartNotifySession(base::Closure callback);
+ void OnStartNotifySessionSuccess(NotifySessionCallback callback);
+ void OnStartNotifySessionError(
+ ErrorCallback error_callback,
+ BluetoothRemoteGattService::GattErrorCode error);
+
+ void ExecuteStopNotifySession(
+ BluetoothGattNotifySession* session,
+ base::Closure callback,
+ NotifySessionCommand::Type previous_command_type,
+ NotifySessionCommand::Result previous_command_result,
+ BluetoothRemoteGattService::GattErrorCode previous_command_error_code);
+ void CancelStopNotifySession(base::Closure callback);
+ void OnStopNotifySessionSuccess(BluetoothGattNotifySession* session,
+ base::Closure callback);
+ void OnStopNotifySessionError(
+ BluetoothGattNotifySession* session,
+ base::Closure callback,
+ BluetoothRemoteGattService::GattErrorCode error);
+
+ // Pending StartNotifySession / StopNotifySession calls.
+ std::queue<std::unique_ptr<NotifySessionCommand>> pending_notify_commands_;
+
+ // Set of active notify sessions.
+ std::set<BluetoothGattNotifySession*> notify_sessions_;
+
+ base::WeakPtrFactory<BluetoothRemoteGattCharacteristic> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattCharacteristic);
};

Powered by Google App Engine
This is Rietveld 408576698