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

Unified Diff: device/bluetooth/bluetooth_device.h

Issue 2244693002: bluetooth: Refactor how we update based on Advertising Data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix arc 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_device.h
diff --git a/device/bluetooth/bluetooth_device.h b/device/bluetooth/bluetooth_device.h
index bc346e835ae91e6842a660fbda33dd751aa432b7..5c7bf095348349390bb5351d65cd6d82ce4d1e33 100644
--- a/device/bluetooth/bluetooth_device.h
+++ b/device/bluetooth/bluetooth_device.h
@@ -11,6 +11,7 @@
#include <memory>
#include <set>
#include <string>
+#include <unordered_set>
#include <vector>
#include "base/callback.h"
@@ -117,6 +118,17 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
};
typedef std::vector<BluetoothUUID> UUIDList;
+ typedef std::unordered_set<BluetoothUUID, BluetoothUUIDHash> UUIDSet;
Jeffrey Yasskin 2016/08/18 19:56:31 This is where I'd really like to have a vector-bac
ortuno 2016/08/19 20:50:33 Is that so that we would always return the uuids i
Jeffrey Yasskin 2016/08/19 22:08:09 No, I'm thinking of the implementation guts of an
+ typedef std::unordered_map<BluetoothUUID,
+ std::vector<uint8_t>,
+ BluetoothUUIDHash>
+ ServiceDataMap;
+
+ // Mapping from the platform-specific GATT service identifiers to
+ // BluetoothRemoteGattService objects.
+ typedef base::ScopedPtrHashMap<std::string,
Jeffrey Yasskin 2016/08/18 19:56:31 Use unordered_map instead: https://cs.chromium.org
ortuno 2016/08/19 20:50:33 I had to fight the urge to convert this to an unor
Jeffrey Yasskin 2016/08/19 22:08:09 Oh, ok.
+ std::unique_ptr<BluetoothRemoteGattService>>
+ GattServiceMap;
// Interface for negotiating pairing of bluetooth devices.
class PairingDelegate {
@@ -302,7 +314,20 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
// Note: On ChromeOS and Linux, Bluez persists all services meaning if
// a device stops advertising a service this function will still return
// its UUID.
- virtual UUIDList GetUUIDs() const;
+ virtual UUIDSet GetUUIDs() const;
+
+ // Returns the last advertised Service Data. Returns nullptr if the adapter
+ // is not discoverying.
Jeffrey Yasskin 2016/08/18 19:56:31 sp: discoverying->discovering
ortuno 2016/08/19 20:50:33 Done.
+ const ServiceDataMap* GetServiceData() const;
+
+ // Returns the UUIDs of services for which the device advertises Service Data.
+ // Returns an empty set if the adapter is not discoverying.
Jeffrey Yasskin 2016/08/18 19:56:31 I think I'd rather return something consistent bet
ortuno 2016/08/19 20:50:33 An empty array means that the service just has no
Jeffrey Yasskin 2016/08/19 22:08:09 I think that's for GetServiceDataForUUID()? I was
ortuno 2016/08/23 00:38:04 Ah right. Changed GetServiceData to return an empt
+ UUIDSet GetServiceDataUUIDs() const;
+
+ // Returns a pointer to the Service Data for Service with |uuid|. Returns
+ // nullptr if |uuid| has no Service Data.
+ const std::vector<uint8_t>* GetServiceDataForUUID(
+ const BluetoothUUID& uuid) const;
// The received signal strength, in dBm. This field is avaliable and valid
// only during discovery.
@@ -477,12 +502,6 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
virtual BluetoothRemoteGattService* GetGattService(
const std::string& identifier) const;
- // Returns service data of a service given its UUID.
- virtual base::BinaryValue* GetServiceData(BluetoothUUID serviceUUID) const;
-
- // Returns the list UUIDs of services that have service data.
- virtual UUIDList GetServiceDataUUIDs() const;
-
// Returns the |address| in the canonical format: XX:XX:XX:XX:XX:XX, where
// each 'X' is a hex digit. If the input |address| is invalid, returns an
// empty string.
@@ -491,8 +510,14 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
// Return the timestamp for when this device was last seen.
base::Time GetLastUpdateTime() const { return last_update_time_; }
- // Update the last time this device was seen.
- void UpdateTimestamp();
+ // Called by BluetoothAdapter when a new Advertisement is seen for this
+ // device. This replaces previously seen Advertisement Data.
+ void UpdateAdvertisementData(
+ std::vector<std::string> advertised_uuids,
+ std::unordered_map<std::string, std::vector<uint8_t>> service_data);
+
+ // Called by BluetoothAdapter when it stops discoverying.
+ void ClearAdvertisementData();
// Return associated BluetoothAdapter.
BluetoothAdapter* GetAdapter() { return adapter_; }
@@ -500,7 +525,6 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
protected:
// BluetoothGattConnection is a friend to call Add/RemoveGattConnection.
friend BluetoothGattConnection;
- FRIEND_TEST_ALL_PREFIXES(BluetoothTest, GetUUIDs);
FRIEND_TEST_ALL_PREFIXES(
BluetoothTest,
BluetoothGattConnection_DisconnectGatt_SimulateConnect);
@@ -515,8 +539,40 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
FRIEND_TEST_ALL_PREFIXES(BluetoothTest, RemoveOutdatedDevices);
FRIEND_TEST_ALL_PREFIXES(BluetoothTest, RemoveOutdatedDeviceGattConnect);
+ // Helper class to easily update the sets of UUIDs and them in sycn with the
Jeffrey Yasskin 2016/08/18 19:56:31 sp: sycn
ortuno 2016/08/19 20:50:33 Done. Heh, I was also missing "keep".
+ // set of all the device's UUIDs
+ class DeviceUUIDs {
+ public:
+ DeviceUUIDs();
+ ~DeviceUUIDs();
+
+ // Advertised Service UUIDs functions
+ void ReplaceAdvertisedUUIDs(std::vector<std::string> new_advertised_uuids);
+
+ void ClearAdvertisedUUIDs();
+
+ // Service UUIDs functions
+ void ReplaceServiceUUIDs(
+ const BluetoothDevice::GattServiceMap& gatt_services);
+
+ void ClearServiceUUIDs();
+
+ // Returns the union of Advertised UUIDs and Service UUIDs.
+ UUIDSet GetUUIDs() const;
+
+ private:
+ void UpdateDeviceUUIDs();
+
+ BluetoothDevice::UUIDSet advertised_uuids_;
+ BluetoothDevice::UUIDSet service_uuids_;
+ BluetoothDevice::UUIDSet device_uuids_;
+ };
+
BluetoothDevice(BluetoothAdapter* adapter);
+ // Update the last time this device was seen.
+ void UpdateTimestamp();
+
// Implements platform specific operations to initiate a GATT connection.
// Subclasses must also call DidConnectGatt, DidFailToConnectGatt, or
// DidDisconnectGatt immediately or asynchronously as the connection state
@@ -545,15 +601,6 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
void AddGattConnection(BluetoothGattConnection*);
void RemoveGattConnection(BluetoothGattConnection*);
- void UpdateServiceUUIDs();
-
- // Clears the list of service data.
- void ClearServiceData();
-
- // Set the data of a given service designated by its UUID.
- void SetServiceData(BluetoothUUID serviceUUID, const char* buffer,
- size_t size);
-
// Update last_update_time_ so that the device appears as expired.
void SetAsExpiredForTesting();
@@ -568,24 +615,14 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothDevice {
// BluetoothGattConnection objects keeping the GATT connection alive.
std::set<BluetoothGattConnection*> gatt_connections_;
- // Mapping from the platform-specific GATT service identifiers to
- // BluetoothRemoteGattService objects.
- typedef base::ScopedPtrHashMap<std::string,
- std::unique_ptr<BluetoothRemoteGattService>>
- GattServiceMap;
GattServiceMap gatt_services_;
bool gatt_services_discovery_complete_;
- // Last advertised service UUIDs. Should be empty if the device is connected.
- UUIDList advertised_uuids_;
- // UUIDs of the device's services. Should be empty if the device is not
- // connected or it's services have not been discovered yet.
- UUIDList service_uuids_;
+ // Class that holds the union of Advertised UUIDs and Service UUIDs.
+ DeviceUUIDs device_uuids_;
- // Mapping from service UUID represented as a std::string of a bluetooth
- // service to
- // the specific data. The data is stored as BinaryValue.
- std::unique_ptr<base::DictionaryValue> services_data_;
+ // Map of BluetoothUUIDs to their advertised Service Data.
+ ServiceDataMap service_data_;
// Timestamp for when an advertisement was last seen.
base::Time last_update_time_;

Powered by Google App Engine
This is Rietveld 408576698