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 138 139 140 141 142 143 144 145 146 147 148 149
|
// 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_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;
// The BluetoothLocalGattCharacteristicFloss class implements
// BluetoothLocalGattCharacteristic for local GATT characteristics for
// platforms that use Floss.
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;
// device::BluetoothGattCharacteristic overrides:
std::string GetIdentifier() const override;
device::BluetoothUUID GetUUID() const override;
Properties GetProperties() const override;
Permissions GetPermissions() const override;
// device::BluetoothLocalGattCharacteristic overrides:
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;
// floss::FlossGattServerObserver overrides.
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);
// Convert this characteristic to DBUS |GattCharacteristic| struct.
GattCharacteristic ToGattCharacteristic();
// Adds a descriptor to this characteristic. Returns the index of the
// descriptor.
int32_t AddDescriptor(
std::unique_ptr<BluetoothLocalGattDescriptorFloss> descriptor);
// 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);
// 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 characteristic.
device::BluetoothUUID uuid_;
// Properties of this characteristic.
Properties properties_;
// Permissions of this characteristic.
Permissions permissions_;
// Service that contains this characteristic.
raw_ref<BluetoothLocalGattServiceFloss> service_;
// Client and Floss-assigned instance ids.
int32_t client_instance_id_;
int32_t floss_instance_id_ = -1;
// Index of this characteristic within the containing service.
int32_t index_;
// Descriptors contained by this characteristic.
std::vector<std::unique_ptr<BluetoothLocalGattDescriptorFloss>> descriptors_;
// 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<BluetoothLocalGattCharacteristicFloss> weak_ptr_factory_{
this};
};
} // namespace floss
#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_LOCAL_GATT_CHARACTERISTIC_FLOSS_H_
|