1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_DESCRIPTOR_FLOSS_H_
#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_DESCRIPTOR_FLOSS_H_
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
#include "device/bluetooth/floss/bluetooth_local_gatt_characteristic_floss.h"
#include "device/bluetooth/floss/bluetooth_local_gatt_service_floss.h"
#include "device/bluetooth/floss/floss_gatt_manager_client.h"
#include "device/bluetooth/public/cpp/bluetooth_uuid.h"
namespace floss {
class BluetoothLocalGattCharacteristicFloss;
// The BluetoothLocalGattDescriptorFloss class implements
// BluetoothRemoteGattDescriptor for remote and local GATT characteristic
// descriptors for platforms that use Floss.
class DEVICE_BLUETOOTH_EXPORT BluetoothLocalGattDescriptorFloss
: public device::BluetoothLocalGattDescriptor,
public FlossGattServerObserver {
public:
static base::WeakPtr<BluetoothLocalGattDescriptorFloss> Create(
const device::BluetoothUUID& uuid,
device::BluetoothGattCharacteristic::Permissions permissions,
BluetoothLocalGattCharacteristicFloss* characteristic);
BluetoothLocalGattDescriptorFloss(const BluetoothLocalGattDescriptorFloss&) =
delete;
BluetoothLocalGattDescriptorFloss& operator=(
const BluetoothLocalGattDescriptorFloss&) = delete;
~BluetoothLocalGattDescriptorFloss() override;
// device::BluetoothGattDescriptor overrides.
std::string GetIdentifier() const override;
// device::BluetoothLocalGattDescriptor overrides.
device::BluetoothUUID GetUUID() const override;
device::BluetoothGattCharacteristic::Permissions GetPermissions()
const override;
device::BluetoothLocalGattCharacteristic* GetCharacteristic() const override;
// floss::FlossGattServerObserver overrides.
void GattServerDescriptorReadRequest(std::string address,
int32_t request_id,
int32_t offset,
bool is_long,
int32_t handle) override;
void GattServerDescriptorWriteRequest(std::string address,
int32_t request_id,
int32_t offset,
int32_t length,
bool is_prepared_write,
bool needs_response,
int32_t handle,
std::vector<uint8_t> value) override;
void ResolveInstanceId(const GattCharacteristic& characteristic);
int32_t InstanceId() const { return floss_instance_id_; }
device::BluetoothGattCharacteristic::NotificationType CccdNotificationType() {
return cccd_type_;
}
private:
friend class BluetoothLocalGattCharacteristicFloss;
friend class BluetoothLocalGattServiceFlossTest;
BluetoothLocalGattDescriptorFloss(
const device::BluetoothUUID& uuid,
device::BluetoothGattCharacteristic::Permissions permissions,
BluetoothLocalGattCharacteristicFloss* characteristic);
// Convert this descriptor to DBUS |GattDescriptor| struct.
GattDescriptor ToGattDescriptor();
// Runs after the browser client has processed the read request and has sent a
// response.
void OnReadRequestCallback(
int32_t request_id,
std::optional<BluetoothGattServiceFloss::GattErrorCode> error_code,
const std::vector<uint8_t>& value);
// Runs after the browser client has processed the write request and has sent
// a response.
void OnWriteRequestCallback(int32_t request_id,
std::vector<uint8_t>& value,
bool needs_response,
bool success);
// Notify browser clients if there was a change to the CCCD.
GattStatus HandleCccDescriptor(std::string address,
std::vector<uint8_t>& value);
// Notification type of the CCCD.
device::BluetoothGattCharacteristic::NotificationType cccd_type_ =
device::BluetoothGattCharacteristic::NotificationType::kNone;
// Cached instance of the latest pending read/write request, if one exists.
std::optional<GattRequest> pending_request_;
// Timer to stop waiting for a callback response.
base::OneShotTimer response_timer_;
// UUID of this descriptor.
device::BluetoothUUID uuid_;
// Permissions of this descriptor.
device::BluetoothGattCharacteristic::Permissions permissions_;
// Characteristic that contains this descriptor.
raw_ref<BluetoothLocalGattCharacteristicFloss> characteristic_;
// Client and Floss-assigned instance id.
int32_t client_instance_id_;
int32_t floss_instance_id_ = -1;
// Index of this descriptor within the containing characteristic.
int32_t index_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<BluetoothLocalGattDescriptorFloss> weak_ptr_factory_{
this};
};
} // namespace floss
#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_DESCRIPTOR_FLOSS_H_
|