File indexing completed on 2024-12-08 12:15:32

0001 /*
0002  * BluezQt - Asynchronous BlueZ wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #ifndef BLUEZQT_ADAPTER_H
0010 #define BLUEZQT_ADAPTER_H
0011 
0012 #include <QList>
0013 #include <QObject>
0014 #include <QStringList>
0015 
0016 #include "bluezqt_export.h"
0017 #include "device.h"
0018 #include "leadvertisingmanager.h"
0019 #include "media.h"
0020 
0021 namespace BluezQt
0022 {
0023 class PendingCall;
0024 
0025 /**
0026  * @class BluezQt::Adapter adapter.h <BluezQt/Adapter>
0027  *
0028  * Bluetooth adapter.
0029  *
0030  * This class represents a Bluetooth adapter.
0031  */
0032 class BLUEZQT_EXPORT Adapter : public QObject
0033 {
0034     Q_OBJECT
0035 
0036     Q_PROPERTY(QString ubi READ ubi)
0037     Q_PROPERTY(QString address READ address)
0038     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
0039     Q_PROPERTY(QString systemName READ systemName NOTIFY systemNameChanged)
0040     Q_PROPERTY(quint32 adapterClass READ adapterClass NOTIFY adapterClassChanged)
0041     Q_PROPERTY(bool powered READ isPowered WRITE setPowered NOTIFY poweredChanged)
0042     Q_PROPERTY(bool discoverable READ isDiscoverable WRITE setDiscoverable NOTIFY discoverableChanged)
0043     Q_PROPERTY(quint32 discoverableTimeout READ discoverableTimeout WRITE setDiscoverableTimeout NOTIFY discoverableTimeoutChanged)
0044     Q_PROPERTY(bool pairable READ isPairable WRITE setPairable NOTIFY pairableChanged)
0045     Q_PROPERTY(quint32 pairableTimeout READ pairableTimeout WRITE setPairableTimeout NOTIFY pairableTimeoutChanged)
0046     Q_PROPERTY(bool discovering READ isDiscovering NOTIFY discoveringChanged)
0047     Q_PROPERTY(QStringList uuids READ uuids NOTIFY uuidsChanged)
0048     Q_PROPERTY(QString modalias READ modalias NOTIFY modaliasChanged)
0049     Q_PROPERTY(LEAdvertisingManagerPtr leAdvertisingManager READ leAdvertisingManager NOTIFY leAdvertisingManagerChanged)
0050     Q_PROPERTY(MediaPtr media READ media NOTIFY mediaChanged)
0051     Q_PROPERTY(QList<DevicePtr> devices READ devices)
0052 
0053 public:
0054     /**
0055      * Destroys an Adapter object.
0056      */
0057     ~Adapter() override;
0058 
0059     /**
0060      * Returns a shared pointer from this.
0061      *
0062      * @return AdapterPtr
0063      */
0064     AdapterPtr toSharedPtr() const;
0065 
0066     /**
0067      * Returns an UBI of the adapter.
0068      *
0069      * Example UBI: "/org/bluez/hci0"
0070      *
0071      * @return UBI of adapter
0072      */
0073     QString ubi() const;
0074 
0075     /**
0076      * Returns an address of the adapter.
0077      *
0078      * Example address: "1C:E5:C3:BC:94:7E"
0079      *
0080      * @return address of adapter
0081      */
0082     QString address() const;
0083 
0084     /**
0085      * Returns a name of the adapter.
0086      *
0087      * @return name of adapter
0088      */
0089     QString name() const;
0090 
0091     /**
0092      * Sets the name of the adapter.
0093      *
0094      * @param name name of adapter
0095      * @return void pending call
0096      */
0097     PendingCall *setName(const QString &name);
0098 
0099     /**
0100      * Returns a system name (hostname) of the adapter.
0101      *
0102      * @return system name of adapter
0103      */
0104     QString systemName() const;
0105 
0106     /**
0107      * Returns a class of the adapter.
0108      *
0109      * @return class of adapter
0110      */
0111     quint32 adapterClass() const;
0112 
0113     /**
0114      * Returns whether the adapter is powered on.
0115      *
0116      * @return true if adapter is powered on
0117      */
0118     bool isPowered() const;
0119 
0120     /**
0121      * Sets the powered state of the adapter.
0122      *
0123      * @param powered powered state
0124      * @return void pending call
0125      */
0126     PendingCall *setPowered(bool powered);
0127 
0128     /**
0129      * Returns whether the adapter is discoverable by other devices.
0130      *
0131      * @return true if adapter is discoverable
0132      */
0133     bool isDiscoverable() const;
0134 
0135     /**
0136      * Sets the discoverable state of the adapter.
0137      *
0138      * @param discoverable discoverable state
0139      * @return void pending call
0140      */
0141     PendingCall *setDiscoverable(bool discoverable);
0142 
0143     /**
0144      * Returns the discoverable timeout in seconds of the adapter.
0145      *
0146      * Discoverable timeout defines how long the adapter stays in
0147      * discoverable state after calling setDiscoverable(true).
0148      *
0149      * Timeout 0 means infinitely.
0150      *
0151      * @return discoverable timeout of adapter
0152      */
0153     quint32 discoverableTimeout() const;
0154 
0155     /**
0156      * Sets the discoverable timeout of the adapter.
0157      *
0158      * @param timeout timeout in seconds
0159      * @return void pending call
0160      */
0161     PendingCall *setDiscoverableTimeout(quint32 timeout);
0162 
0163     /**
0164      * Returns whether the adapter is pairable with other devices.
0165      *
0166      * @return true if adapter is pairable
0167      */
0168     bool isPairable() const;
0169 
0170     /**
0171      * Sets the pairable state of the adapter.
0172      *
0173      * @param pairable pairable state
0174      * @return void pending call
0175      */
0176     PendingCall *setPairable(bool pairable);
0177 
0178     /**
0179      * Returns the pairable timeout in seconds of the adapter.
0180      *
0181      * Pairable timeout defines how long the adapter stays in
0182      * pairable state after calling setPairable(true).
0183      *
0184      * Timeout 0 means infinitely.
0185      *
0186      * @return pairable timeout of adapter
0187      */
0188     quint32 pairableTimeout() const;
0189 
0190     /**
0191      * Sets the pairable timeout of the adapter.
0192      *
0193      * @param timeout timeout in seconds
0194      * @return void pending call
0195      */
0196     PendingCall *setPairableTimeout(quint32 timeout);
0197 
0198     /**
0199      * Returns whether the adapter is discovering for other devices
0200      *
0201      * @return true if adapter is discovering
0202      */
0203     bool isDiscovering();
0204 
0205     /**
0206      * Returns UUIDs of supported services by the adapter.
0207      *
0208      * UUIDs will always be returned in uppercase.
0209      *
0210      * @return UUIDs of supported services
0211      */
0212     QStringList uuids() const;
0213 
0214     /**
0215      * Returns local device ID in modalias format.
0216      *
0217      * @return adapter modalias
0218      */
0219     QString modalias() const;
0220 
0221     /**
0222      * Returns the GATT manager interface for the adapter.
0223      *
0224      * @return null if adapter have no GATT manager
0225      */
0226     GattManagerPtr gattManager() const;
0227 
0228     /**
0229      * Returns the LE advertising manager interface for the adapter.
0230      *
0231      * @return null if adapter have no Bluetooth LE
0232      */
0233     LEAdvertisingManagerPtr leAdvertisingManager() const;
0234 
0235     /**
0236      * Returns the media interface for the adapter.
0237      *
0238      * @return null if adapter have no media
0239      */
0240     MediaPtr media() const;
0241 
0242     /**
0243      * Returns list of devices known by the adapter.
0244      *
0245      * @return list of devices
0246      */
0247     QList<DevicePtr> devices() const;
0248 
0249     /**
0250      * Returns a device for specified address.
0251      *
0252      * @param address address of device (eg. "40:79:6A:0C:39:75")
0253      * @return null if there is no device with specified address
0254      */
0255     DevicePtr deviceForAddress(const QString &address) const;
0256 
0257     /**
0258      * Starts device discovery.
0259      *
0260      * Possible errors: PendingCall::NotReady, PendingCall::Failed
0261      *
0262      * @return void pending call
0263      * @see discoverableTimeout() const
0264      */
0265     PendingCall *startDiscovery();
0266 
0267     /**
0268      * Stops device discovery.
0269      *
0270      * Possible errors: PendingCall::NotReady, PendingCall::Failed, PendingCall::NotAuthorized
0271      *
0272      * @return void pending call
0273      */
0274     PendingCall *stopDiscovery();
0275 
0276     /**
0277      * Removes the specified device.
0278      *
0279      * It will also remove the pairing information.
0280      *
0281      * Possible errors: PendingCall::InvalidArguments, PendingCall::Failed
0282      *
0283      * @param device device to be removed
0284      * @return void pending call
0285      */
0286     PendingCall *removeDevice(DevicePtr device);
0287 
0288     /**
0289      * Set the discovery filter for the caller.
0290      *
0291      * When this method is called with no filter parameter, the filter is removed.
0292      *
0293      * For details and available filter options, see [Bluez documentation for Adapter object](https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt)
0294      *
0295      * Possible errors: PendingCall::InvalidArguments, PendingCall::Failed
0296      *
0297      * @param filter options dictionary
0298      * @return void pending call
0299      */
0300      PendingCall *setDiscoveryFilter(const QVariantMap& filter);
0301 
0302     /**
0303      * Get the discovery filters for the caller.
0304      *
0305      * This returns the available filters that can be given to setDiscoveryFilter, for details see [Bluez documentation for Adapter object](https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt)
0306      *
0307      * Possible errors: PendingCall::Failed
0308      *
0309      * @return string list pending call
0310      */
0311      PendingCall *getDiscoveryFilters();
0312 
0313 Q_SIGNALS:
0314     /**
0315      * Indicates that the adapter was removed.
0316      */
0317     void adapterRemoved(AdapterPtr adapter);
0318 
0319     /**
0320      * Indicates that at least one of the adapter's properties have changed.
0321      */
0322     void adapterChanged(AdapterPtr adapter);
0323 
0324     /**
0325      * Indicates that adapter's name have changed.
0326      */
0327     void nameChanged(const QString &name);
0328 
0329     /**
0330      * Indicates that adapter's system name have changed.
0331      */
0332     void systemNameChanged(const QString &systemName);
0333 
0334     /**
0335      * Indicates that adapter's class have changed.
0336      */
0337     void adapterClassChanged(quint32 adapterClass);
0338 
0339     /**
0340      * Indicates that adapter's powered state have changed.
0341      */
0342     void poweredChanged(bool powered);
0343 
0344     /**
0345      * Indicates that adapter's discoverable state have changed.
0346      */
0347     void discoverableChanged(bool discoverable);
0348 
0349     /**
0350      * Indicates that adapter's discoverable timeout have changed.
0351      */
0352     void discoverableTimeoutChanged(quint32 timeout);
0353 
0354     /**
0355      * Indicates that adapter's pairable state have changed.
0356      */
0357     void pairableChanged(bool pairable);
0358 
0359     /**
0360      * Indicates that adapter's pairable timeout have changed.
0361      */
0362     void pairableTimeoutChanged(quint32 timeout);
0363 
0364     /**
0365      * Indicates that adapter's discovering state have changed.
0366      */
0367     void discoveringChanged(bool discovering);
0368 
0369     /**
0370      * Indicates that adapter's UUIDs have changed.
0371      */
0372     void uuidsChanged(const QStringList &uuids);
0373 
0374     /**
0375      * Indicates that adapter's modalias have changed.
0376      */
0377     void modaliasChanged(const QString &modalias);
0378 
0379     /**
0380      * Indicates that adapter's GATT manager have changed.
0381      */
0382     void gattManagerChanged(GattManagerPtr gattManager);
0383 
0384     /**
0385      * Indicates that adapter's LE advertising manager have changed.
0386      */
0387     void leAdvertisingManagerChanged(LEAdvertisingManagerPtr leAdvertisingManager);
0388 
0389     /**
0390      * Indicates that adapter's media have changed.
0391      */
0392     void mediaChanged(MediaPtr media);
0393 
0394     /**
0395      * Indicates that a new device was added (eg. found by discovery).
0396      */
0397     void deviceAdded(DevicePtr device);
0398 
0399     /**
0400      * Indicates that a device was removed.
0401      */
0402     void deviceRemoved(DevicePtr device);
0403 
0404     /**
0405      * Indicates that at least one of the device's properties have changed.
0406      */
0407     void deviceChanged(DevicePtr device);
0408 
0409 private:
0410     BLUEZQT_NO_EXPORT explicit Adapter(const QString &path, const QVariantMap &properties);
0411 
0412     class AdapterPrivate *const d;
0413 
0414     friend class AdapterPrivate;
0415     friend class ManagerPrivate;
0416     friend class InitAdaptersJobPrivate;
0417 };
0418 
0419 } // namespace BluezQt
0420 
0421 #endif // BLUEZQT_ADAPTER_H