#ifndef DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_CHARACTERISTIC_FLOSS_H_
#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_CHARACTERISTIC_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/floss/bluetooth_local_gatt_descriptor_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 BluetoothLocalGattDescriptorFloss;
class DEVICE_BLUETOOTH_EXPORT BluetoothLocalGattCharacteristicFloss
: public device::BluetoothLocalGattCharacteristic,
public FlossGattServerObserver {
public:
static base::WeakPtr<BluetoothLocalGattCharacteristicFloss> Create(
const device::BluetoothUUID& uuid,
Properties properties,
Permissions permissions,
BluetoothLocalGattServiceFloss* service);
BluetoothLocalGattCharacteristicFloss(
const BluetoothLocalGattCharacteristicFloss&) = delete;
BluetoothLocalGattCharacteristicFloss& operator=(
const BluetoothLocalGattCharacteristicFloss&) = delete;
~BluetoothLocalGattCharacteristicFloss() override;
std::string GetIdentifier() const override;
device::BluetoothUUID GetUUID() const override;
Properties GetProperties() const override;
Permissions GetPermissions() const override;
NotificationStatus NotifyValueChanged(const device::BluetoothDevice* device,
const std::vector<uint8_t>& new_value,
bool indicate) override;
device::BluetoothLocalGattService* GetService() const override;
std::vector<device::BluetoothLocalGattDescriptor*> GetDescriptors()
const override;
void GattServerCharacteristicReadRequest(std::string address,
int32_t request_id,
int32_t offset,
bool is_long,
int32_t handle) override;
void GattServerCharacteristicWriteRequest(
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 GattServerExecuteWrite(std::string address,
int32_t request_id,
bool execute_write) override;
void ResolveInstanceId(const GattService& service);
int32_t InstanceId() const { return floss_instance_id_; }
NotificationType CccdNotificationType();
private:
friend class BluetoothLocalGattServiceFloss;
friend class BluetoothLocalGattDescriptorFloss;
friend class BluetoothLocalGattServiceFlossTest;
BluetoothLocalGattCharacteristicFloss(
const device::BluetoothUUID& uuid,
Properties properties,
Permissions permissions,
BluetoothLocalGattServiceFloss* service);
GattCharacteristic ToGattCharacteristic();
int32_t AddDescriptor(
std::unique_ptr<BluetoothLocalGattDescriptorFloss> descriptor);
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);
std::optional<GattRequest> pending_request_;
base::OneShotTimer response_timer_;
device::BluetoothUUID uuid_;
Properties properties_;
Permissions permissions_;
raw_ref<BluetoothLocalGattServiceFloss> service_;
int32_t client_instance_id_;
int32_t floss_instance_id_ = -1;
int32_t index_;
std::vector<std::unique_ptr<BluetoothLocalGattDescriptorFloss>> descriptors_;
base::WeakPtrFactory<BluetoothLocalGattCharacteristicFloss> weak_ptr_factory_{
this};
};
}
#endif