blob: 976b24b945088ac415f62b73a0793c31f7a48e9c [file] [log] [blame]
// Copyright 2022 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_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_
#define DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_
#include <tuple>
#include "device/bluetooth/bluetooth_export.h"
#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
#include "device/bluetooth/floss/bluetooth_gatt_characteristic_floss.h"
#include "device/bluetooth/floss/floss_dbus_client.h"
#include "device/bluetooth/floss/floss_gatt_manager_client.h"
namespace device {
class BluetoothRemoteGattDescriptor;
}
namespace floss {
class BluetoothRemoteGattServiceFloss;
class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattCharacteristicFloss
: public BluetoothGattCharacteristicFloss,
public device::BluetoothRemoteGattCharacteristic,
public FlossGattClientObserver {
public:
// Construct remote characteristic.
static std::unique_ptr<BluetoothRemoteGattCharacteristicFloss> Create(
BluetoothRemoteGattServiceFloss* service,
GattCharacteristic* characteristic);
BluetoothRemoteGattCharacteristicFloss(
const BluetoothRemoteGattCharacteristicFloss&) = delete;
BluetoothRemoteGattCharacteristicFloss& operator=(
const BluetoothRemoteGattCharacteristicFloss&) = delete;
~BluetoothRemoteGattCharacteristicFloss() override;
// device::BluetoothGattCharacteristic overrides.
std::string GetIdentifier() const override;
device::BluetoothUUID GetUUID() const override;
Properties GetProperties() const override;
Permissions GetPermissions() const override;
// device::BluetoothRemoteGattCharacteristic overrides.
const std::vector<uint8_t>& GetValue() const override;
device::BluetoothRemoteGattService* GetService() const override;
void ReadRemoteCharacteristic(ValueCallback callback) override;
void WriteRemoteCharacteristic(
base::span<const uint8_t> value,
device::BluetoothRemoteGattCharacteristic::WriteType write_type,
base::OnceClosure callback,
ErrorCallback error_callback) override;
// While this function should be deprecated, it is still called in many
// places. This simply calls |WriteRemoteCharacteristic| with a default value
// for |WriteType| to make it easy to remove in the future.
void DeprecatedWriteRemoteCharacteristic(
base::span<const uint8_t> value,
base::OnceClosure callback,
ErrorCallback error_callback) override;
#if BUILDFLAG(IS_CHROMEOS)
void PrepareWriteRemoteCharacteristic(base::span<const uint8_t> value,
base::OnceClosure callback,
ErrorCallback error_callback) override;
#endif // BUILDFLAG(IS_CHROMEOS)
// floss::FlossGattClientObserver overrides.
void GattCharacteristicRead(std::string address,
GattStatus status,
int32_t handle,
const std::vector<uint8_t>& data) override;
void GattCharacteristicWrite(std::string address,
GattStatus status,
int32_t handle) override;
void GattNotify(std::string address,
int32_t handle,
const std::vector<uint8_t>& data) override;
// Authentication required to read this characteristic and its descriptors.
AuthRequired GetAuthForRead() const;
// Authentication required to write to this characteristic and its
// descriptors.
AuthRequired GetAuthForWrite() const;
protected:
// Additional BluetoothRemoteGattCharacteristic overrides.
#if BUILDFLAG(IS_CHROMEOS)
void SubscribeToNotifications(
device::BluetoothRemoteGattDescriptor* ccc_descriptor,
NotificationType notification_type,
base::OnceClosure callback,
ErrorCallback error_callback) override;
#else
void SubscribeToNotifications(
device::BluetoothRemoteGattDescriptor* ccc_descriptor,
base::OnceClosure callback,
ErrorCallback error_callback) override;
#endif // BUILDFLAG(IS_CHROMEOS)
void UnsubscribeFromNotifications(
device::BluetoothRemoteGattDescriptor* ccc_descriptor,
base::OnceClosure callback,
ErrorCallback error_callback) override;
// Common impl for various writes calls.
void WriteRemoteCharacteristicImpl(base::span<const uint8_t> value,
floss::WriteType write_type,
base::OnceClosure callback,
ErrorCallback error_callback);
// Handle result of calling |ReadRemoteCharacteristic|.
void OnReadCharacteristic(ValueCallback callback, DBusResult<Void> result);
// Handle result of calling |WriteRemoteCharacteristic|.
void OnWriteCharacteristic(base::OnceClosure callback,
ErrorCallback error_callback,
std::vector<uint8_t> data,
DBusResult<GattWriteRequestStatus> result);
private:
friend class BluetoothRemoteGattServiceFloss;
BluetoothRemoteGattCharacteristicFloss(
BluetoothRemoteGattServiceFloss* service,
GattCharacteristic* characteristic);
// Handles response to |RegisterForNotification| and
// |UnregisterForNotification|.
void OnRegisterForNotification(
device::BluetoothRemoteGattDescriptor* ccc_descriptor,
const std::vector<uint8_t>& value,
base::OnceClosure callback,
ErrorCallback error_callback,
DBusResult<GattStatus> result);
// Send notifications to observer on adapter.
void NotifyValueChanged();
// Cached data from the last read that was done.
std::vector<uint8_t> cached_data_;
// Characteristic represented by this class. The contents are owned by the
// |service_| so we keep a pointer to it only here.
raw_ptr<GattCharacteristic> characteristic_;
// Number of gatt read requests in progress.
int num_of_reads_in_progress_ = 0;
// Callback for pending |ReadRemoteCharacteristic|.
ValueCallback pending_read_callback_;
// Callback for pending |WriteRemoteCharacteristic|.
std::tuple<base::OnceClosure, ErrorCallback, std::vector<uint8_t>>
pending_write_callbacks_;
// Service which this characteristic belongs to. We can keep a raw_ptr<> here
// because the Service linked here owns a unique_ptr<> to this class instance
// so the lifetime of the two objects are tied together.
raw_ptr<BluetoothRemoteGattServiceFloss> service_;
// Address of the device this characteristic and parent service belongs to.
std::string device_address_;
base::WeakPtrFactory<BluetoothRemoteGattCharacteristicFloss>
weak_ptr_factory_{this};
};
} // namespace floss
#endif // DEVICE_BLUETOOTH_FLOSS_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_FLOSS_H_