#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;
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;
std::string GetIdentifier() const override;
device::BluetoothUUID GetUUID() const override;
device::BluetoothGattCharacteristic::Permissions GetPermissions()
const override;
device::BluetoothLocalGattCharacteristic* GetCharacteristic() const override;
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);
GattDescriptor ToGattDescriptor();
void OnReadRequestCallback(
int32_t request_id,
std::optional<BluetoothGattServiceFloss::GattErrorCode> error_code,
const std::vector<uint8_t>& value);
void OnWriteRequestCallback(int32_t request_id,
std::vector<uint8_t>& value,
bool needs_response,
bool success);
GattStatus HandleCccDescriptor(std::string address,
std::vector<uint8_t>& value);
device::BluetoothGattCharacteristic::NotificationType cccd_type_ =
device::BluetoothGattCharacteristic::NotificationType::kNone;
std::optional<GattRequest> pending_request_;
base::OneShotTimer response_timer_;
device::BluetoothUUID uuid_;
device::BluetoothGattCharacteristic::Permissions permissions_;
raw_ref<BluetoothLocalGattCharacteristicFloss> characteristic_;
int32_t client_instance_id_;
int32_t floss_instance_id_ = -1;
int32_t index_;
base::WeakPtrFactory<BluetoothLocalGattDescriptorFloss> weak_ptr_factory_{
this};
};
}
#endif