Revision control

Copy as Markdown

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef BLUEZ_PERIPHERAL_OBJECTS_P_H
#define BLUEZ_PERIPHERAL_OBJECTS_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "bluez5_helper_p.h"
#include <QtBluetooth/qbluetooth.h>
#include <QtBluetooth/QBluetoothUuid>
#include <QtBluetooth/QLowEnergyDescriptorData>
#include <QtBluetooth/QLowEnergyCharacteristicData>
#include <QtBluetooth/QLowEnergyServiceData>
namespace QtBluetoothPrivate {
class OrgFreedesktopDBusPropertiesAdaptor;
class OrgBluezGattCharacteristic1Adaptor;
class OrgBluezGattDescriptor1Adaptor;
class OrgBluezGattService1Adaptor;
} // namespace QtBluetoothPrivate
QT_BEGIN_NAMESPACE
// The QtBluezPeripheralGattObject is the base class for services, characteristics, and descriptors
class QtBluezPeripheralGattObject : public QObject
{
Q_OBJECT
public:
QtBluezPeripheralGattObject(const QString& objectPath, const QString& uuid,
QLowEnergyHandle handle, QObject* parent = nullptr);
virtual ~QtBluezPeripheralGattObject();
// List of properties exposed by this object, used when Bluez inquiries details
virtual InterfaceList properties() const = 0;
bool registerObject();
void unregisterObject();
public:
// DBus object path
QString objectPath;
// UUID of the gatt object
QString uuid;
// QtBluetooth internal handle and reference to the application
// to read and write values towards the Qt API
QLowEnergyHandle handle;
// Bluez DBus Gatt objects need to provide this
QtBluetoothPrivate::OrgFreedesktopDBusPropertiesAdaptor* propertiesAdaptor{};
signals:
void remoteDeviceAccessEvent(const QString& remoteDeviceObjectPath, quint16 mtu);
protected:
void accessEvent(const QVariantMap& options);
private:
bool m_registered = false;
};
class QtBluezPeripheralDescriptor : public QtBluezPeripheralGattObject
{
Q_OBJECT
public:
QtBluezPeripheralDescriptor(const QLowEnergyDescriptorData& descriptorData,
const QString& characteristicPath, quint16 ordinal,
QLowEnergyHandle handle, QLowEnergyHandle characteristicHandle,
QObject* parent);
InterfaceList properties() const final;
// org.bluez.GattDescriptor1
// This function is invoked when remote device reads the value. Sets error if any
Q_INVOKABLE QByteArray ReadValue(const QVariantMap &options, QString &error);
// org.bluez.GattDescriptor1
// This function is invoked when remote device writes a value. Returns Bluez DBus error if any
Q_INVOKABLE QString WriteValue(const QByteArray &value, const QVariantMap &options);
// Call this function when value has been updated locally (server/user application side)
bool localValueUpdate(const QByteArray& value);
signals:
void valueUpdatedByRemote(QLowEnergyHandle characteristicHandle,
QLowEnergyHandle descriptorHandle, const QByteArray& value);
private:
void initializeFlags(const QLowEnergyDescriptorData& data);
QtBluetoothPrivate::OrgBluezGattDescriptor1Adaptor* m_adaptor{};
QString m_characteristicPath;
QByteArray m_value;
QStringList m_flags;
QLowEnergyHandle m_characteristicHandle;
};
class QtBluezPeripheralCharacteristic : public QtBluezPeripheralGattObject
{
Q_OBJECT
public:
QtBluezPeripheralCharacteristic(const QLowEnergyCharacteristicData& characteristicData,
const QString& servicePath, quint16 ordinal,
QLowEnergyHandle handle, QObject* parent);
InterfaceList properties() const final;
// org.bluez.GattCharacteristic1
// This function is invoked when remote device reads the value. Sets error if any
Q_INVOKABLE QByteArray ReadValue(const QVariantMap &options, QString& error);
// org.bluez.GattCharacteristic1
// This function is invoked when remote device writes a value. Returns Bluez DBus error if any
Q_INVOKABLE QString WriteValue(const QByteArray &value, const QVariantMap &options);
// org.bluez.GattCharacteristic1
// These are called when remote client enables or disables NTF/IND
Q_INVOKABLE void StartNotify();
Q_INVOKABLE void StopNotify();
// Call this function when value has been updated locally (server/user application side)
bool localValueUpdate(const QByteArray& value);
signals:
void valueUpdatedByRemote(QLowEnergyHandle handle, const QByteArray& value);
private:
void initializeValue(const QByteArray& value);
void initializeFlags(const QLowEnergyCharacteristicData& data);
QtBluetoothPrivate::OrgBluezGattCharacteristic1Adaptor* m_adaptor{};
QString m_servicePath;
bool m_notifying{false};
QByteArray m_value;
QStringList m_flags;
int m_minimumValueLength;
int m_maximumValueLength;
};
class QtBluezPeripheralService : public QtBluezPeripheralGattObject
{
Q_OBJECT
public:
QtBluezPeripheralService(const QLowEnergyServiceData &serviceData,
const QString& applicationPath, quint16 ordinal,
QLowEnergyHandle handle, QObject* parent);
InterfaceList properties() const final;
void addIncludedService(const QString& objectPath);
private:
const bool m_isPrimary;
QtBluetoothPrivate::OrgBluezGattService1Adaptor* m_adaptor{};
QList<QDBusObjectPath> m_includedServices;
};
QT_END_NAMESPACE
#endif