diff options
Diffstat (limited to 'src/bluetoothsettings')
-rw-r--r-- | src/bluetoothsettings/bluetoothdevice.cpp | 169 | ||||
-rw-r--r-- | src/bluetoothsettings/bluetoothdevice.h | 85 | ||||
-rw-r--r-- | src/bluetoothsettings/bluetoothsettings.pro | 19 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/bluetoothdevice_p.cpp | 98 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/bluetoothdevice_p.h | 55 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/bluez.pri | 15 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/datatypes.h | 53 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/device1.xml | 31 | ||||
-rw-r--r-- | src/bluetoothsettings/bluez/objectmanager.xml | 20 | ||||
-rw-r--r-- | src/bluetoothsettings/discoverymodel.cpp | 246 | ||||
-rw-r--r-- | src/bluetoothsettings/discoverymodel.h | 126 |
11 files changed, 917 insertions, 0 deletions
diff --git a/src/bluetoothsettings/bluetoothdevice.cpp b/src/bluetoothsettings/bluetoothdevice.cpp new file mode 100644 index 0000000..65a7422 --- /dev/null +++ b/src/bluetoothsettings/bluetoothdevice.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <discoverymodel.h> +#include "bluetoothdevice.h" +#include "bluez/bluetoothdevice_p.h" + +BluetoothDevice::BluetoothDevice(QObject *parent) : QObject(parent) + ,m_localDevice(new QBluetoothLocalDevice(this)) + ,m_deviceModel(new DiscoveryModel(this)) + ,m_powered(false) + ,m_scanning(true) +{ + m_powered = m_localDevice->hostMode() != QBluetoothLocalDevice::HostPoweredOff; + + connect(m_localDevice, &QBluetoothLocalDevice::hostModeStateChanged, this, &BluetoothDevice::deviceStateChanged); + connect(m_localDevice, &QBluetoothLocalDevice::deviceConnected, this, &BluetoothDevice::deviceConnected); + connect(m_localDevice, &QBluetoothLocalDevice::deviceDisconnected, this, &BluetoothDevice::deviceDisconnected); + connect(m_deviceModel, &DiscoveryModel::scanFinished, this, &BluetoothDevice::scanFinished); + + if (m_powered) { + m_deviceModel->scanDevices(); + } + +} + +void BluetoothDevice::deviceStateChanged(QBluetoothLocalDevice::HostMode state) +{ + m_powered = state != QBluetoothLocalDevice::HostPoweredOff; + emit poweredChanged(); +} + +bool BluetoothDevice::powered() const +{ + return m_powered; +} + +void BluetoothDevice::setPowered(const bool& aPowered) +{ + if (aPowered) { + m_localDevice->powerOn(); + } + else { + m_localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff); + } +} + +QObject* BluetoothDevice::deviceModel() const +{ + return static_cast<QObject*>(m_deviceModel); +} + +void BluetoothDevice::scanFinished() +{ + m_scanning = false; + emit scanningChanged(); + updateConnectionStatuses(); +} + +bool BluetoothDevice::scanning() const +{ + return m_scanning; +} + +void BluetoothDevice::setScanning(const bool& aScan) +{ + if (m_scanning && !aScan) { + //TODO m_deviceModel->cancel(); + } + else if (aScan && !m_scanning) { + m_deviceModel->scanDevices(); + m_scanning = true; + emit scanningChanged(); + } +} + +void BluetoothDevice::updateConnectionStatuses() +{ + QList<QBluetoothAddress> connectedDevices = + m_localDevice->connectedDevices(); + + foreach (QBluetoothAddress addr, connectedDevices) { + m_deviceModel->setConnected(addr.toString(), true); + } +} + +void BluetoothDevice::requestPairing(const QString& address) +{ + QBluetoothAddress addr(address); + m_localDevice->requestPairing(addr, QBluetoothLocalDevice::Paired); + connect(m_localDevice, &QBluetoothLocalDevice::pairingDisplayConfirmation, this, &BluetoothDevice::pairingDisplayConfirmation); + + connect(m_localDevice, &QBluetoothLocalDevice::pairingDisplayPinCode, this, &BluetoothDevice::pairingDisplayPinCode); + + connect(m_localDevice, &QBluetoothLocalDevice::pairingFinished, this, &BluetoothDevice::pairingFinished); +} + +void BluetoothDevice::requestConnect(const QString &address) +{ + QScopedPointer<BluetoothDevicePrivate> connectionHandler(new BluetoothDevicePrivate(address)); + connectionHandler->connectDevice(); +} + +void BluetoothDevice::requestDisconnect(const QString& address) +{ + QScopedPointer<BluetoothDevicePrivate> connectionHandler(new BluetoothDevicePrivate(address)); + connectionHandler->disconnectDevice(); +} + +void BluetoothDevice::pairingDisplayConfirmation(const QBluetoothAddress & address, QString pin) +{ + Q_UNUSED(address); + Q_UNUSED(pin); +} + +void BluetoothDevice::pairingDisplayPinCode(const QBluetoothAddress & address, QString pin) +{ + Q_UNUSED(address); + Q_UNUSED(pin); +} + +void BluetoothDevice::pairingFinished(const QBluetoothAddress & address, QBluetoothLocalDevice::Pairing pairing) +{ + if (pairing == QBluetoothLocalDevice::Paired) { + requestConnect(address.toString()); + } +} + +void BluetoothDevice::deviceConnected(const QBluetoothAddress & address) +{ + m_deviceModel->setConnected(address.toString(), true); +} + +void BluetoothDevice::deviceDisconnected(const QBluetoothAddress & address) +{ + m_deviceModel->setConnected(address.toString(), false); +} diff --git a/src/bluetoothsettings/bluetoothdevice.h b/src/bluetoothsettings/bluetoothdevice.h new file mode 100644 index 0000000..30bd3a4 --- /dev/null +++ b/src/bluetoothsettings/bluetoothdevice.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDEVICE_H +#define BLUETOOTHDEVICE_H + +#include <QObject> +#include <QBluetoothLocalDevice> + +class DiscoveryModel; + +class Q_DECL_EXPORT BluetoothDevice : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool scanning READ scanning WRITE setScanning NOTIFY scanningChanged) + Q_PROPERTY(bool powered READ powered WRITE setPowered NOTIFY poweredChanged) + Q_PROPERTY(QObject* deviceModel READ deviceModel CONSTANT) +public: + explicit BluetoothDevice(QObject *parent = 0); + bool powered() const; + void setPowered(const bool& aPowered); + QObject* deviceModel() const; + bool scanning() const; + void setScanning(const bool& aScan); + Q_INVOKABLE void requestPairing(const QString& address); + Q_INVOKABLE void requestConnect(const QString& address); + Q_INVOKABLE void requestDisconnect(const QString& address); +signals: + void poweredChanged(); + void scanningChanged(); + +public slots: + void deviceStateChanged(QBluetoothLocalDevice::HostMode state); + void scanFinished(); + //These are not yet signaled + //See bug https://bugreports.qt.io/browse/QTBUG-38401 + void pairingDisplayConfirmation(const QBluetoothAddress & address, QString pin); + void pairingDisplayPinCode(const QBluetoothAddress & address, QString pin); + void pairingFinished(const QBluetoothAddress & address, QBluetoothLocalDevice::Pairing pairing); + void deviceConnected(const QBluetoothAddress & address); + void deviceDisconnected(const QBluetoothAddress & address); + +private: + void updateConnectionStatuses(); + +private: + QBluetoothLocalDevice* m_localDevice; + DiscoveryModel *m_deviceModel; + bool m_powered; + bool m_scanning; +}; + +#endif // BLUETOOTHDEVICE_H diff --git a/src/bluetoothsettings/bluetoothsettings.pro b/src/bluetoothsettings/bluetoothsettings.pro new file mode 100644 index 0000000..cb98ccb --- /dev/null +++ b/src/bluetoothsettings/bluetoothsettings.pro @@ -0,0 +1,19 @@ +load(qt_build_config) + +TARGET = QtBluetoothSettings +VERSION = 1.0 +CONFIG += dll warn_on + +QT += core bluetooth + +MODULE = bluetoothsettings +load(qt_module) + +include(bluez/bluez.pri) + +HEADERS += \ + bluetoothdevice.h \ + discoverymodel.h + +SOURCES += bluetoothdevice.cpp \ + discoverymodel.cpp diff --git a/src/bluetoothsettings/bluez/bluetoothdevice_p.cpp b/src/bluetoothsettings/bluez/bluetoothdevice_p.cpp new file mode 100644 index 0000000..ded84f2 --- /dev/null +++ b/src/bluetoothsettings/bluez/bluetoothdevice_p.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "bluetoothdevice_p.h" +#include "datatypes.h" +#include "objectmanager_interface.cpp" +#include "moc_objectmanager_interface.cpp" +#include "device1_interface.h" + + +BluetoothDevicePrivate::BluetoothDevicePrivate(const QString& address, QObject *parent) + :QObject(parent) + ,m_address(address) +{ + +} + +OrgBluezDevice1Interface* BluetoothDevicePrivate::findDevice() +{ + OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"), + QStringLiteral("/"), + QDBusConnection::systemBus()); + QDBusPendingReply<ManagedObjectList> reply = manager.GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) { + qWarning() << "Failed to get objects"; + return NULL; + } + + ManagedObjectList managedObjectList = reply.value(); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const QDBusObjectPath &path = it.key(); + + const InterfaceList &ifaceList = it.value(); + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + const QVariantMap &ifaceValues = jt.value(); + if (iface == QStringLiteral("org.bluez.Device1")) { + if (ifaceValues["Address"] == m_address) { + OrgBluezDevice1Interface *devIf = new OrgBluezDevice1Interface("org.bluez", path.path(), QDBusConnection::systemBus()); + return devIf; + } + } + } + } + return NULL; +} + + +void BluetoothDevicePrivate::connectDevice() +{ + OrgBluezDevice1Interface *dev = findDevice(); + if (dev) { + dev->Connect(); + dev->deleteLater(); + } +} + +void BluetoothDevicePrivate::disconnectDevice() +{ + OrgBluezDevice1Interface *dev = findDevice(); + if (dev) { + dev->Disconnect(); + dev->deleteLater(); + } +} diff --git a/src/bluetoothsettings/bluez/bluetoothdevice_p.h b/src/bluetoothsettings/bluez/bluetoothdevice_p.h new file mode 100644 index 0000000..1c28161 --- /dev/null +++ b/src/bluetoothsettings/bluez/bluetoothdevice_p.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utils module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef BLUETOOTHDEVICE__P_H +#define BLUETOOTHDEVICE__P_H + +#include <QObject> + +class OrgBluezDevice1Interface; + +class BluetoothDevicePrivate : public QObject +{ +public: + explicit BluetoothDevicePrivate(const QString& address, QObject *parent=0); + void connectDevice(); + void disconnectDevice(); + +private: + OrgBluezDevice1Interface* findDevice(); + QString m_address; +}; + +#endif // BLUETOOTHDEVICE__P_H diff --git a/src/bluetoothsettings/bluez/bluez.pri b/src/bluetoothsettings/bluez/bluez.pri new file mode 100644 index 0000000..ea4929c --- /dev/null +++ b/src/bluetoothsettings/bluez/bluez.pri @@ -0,0 +1,15 @@ +QT += core dbus + +INCLUDEPATH += $${PWD} +INCLUDEPATH += $${PWD}/bluez + +DBUS_INTERFACES = \ + $${PWD}/objectmanager.xml \ + $${PWD}/device1.xml \ + +HEADERS += \ + $$PWD/bluetoothdevice_p.h \ + $$PWD/datatypes.h + +SOURCES += \ + $$PWD/bluetoothdevice_p.cpp diff --git a/src/bluetoothsettings/bluez/datatypes.h b/src/bluetoothsettings/bluez/datatypes.h new file mode 100644 index 0000000..b794c47 --- /dev/null +++ b/src/bluetoothsettings/bluez/datatypes.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utils module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DATATYPES_H +#define DATATYPES_H + +#include <QObject> +#include <QtDBus> +#include <QMap> +#include <QVariantMap> +#include <QtDBus/QDBusObjectPath> +#include <QtCore/QMetaType> + +typedef QMap<QString, QVariantMap> InterfaceList; +typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList; + +Q_DECLARE_METATYPE(InterfaceList) +Q_DECLARE_METATYPE(ManagedObjectList) + + +#endif // DATATYPES_H diff --git a/src/bluetoothsettings/bluez/device1.xml b/src/bluetoothsettings/bluez/device1.xml new file mode 100644 index 0000000..5b16992 --- /dev/null +++ b/src/bluetoothsettings/bluez/device1.xml @@ -0,0 +1,31 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node> + <interface name="org.bluez.Device1"> + <method name="Disconnect"></method> + <method name="Connect"></method> + <method name="ConnectProfile"> + <arg name="UUID" type="s" direction="in"/> + </method> + <method name="DisconnectProfile"> + <arg name="UUID" type="s" direction="in"/> + </method> + <method name="Pair"></method> + <method name="CancelPairing"></method> + <property name="Address" type="s" access="read"></property> + <property name="Name" type="s" access="read"></property> + <property name="Alias" type="s" access="readwrite"></property> + <property name="Appearance" type="q" access="read"></property> + <property name="Icon" type="s" access="read"></property> + <property name="Paired" type="b" access="read"></property> + <property name="Trusted" type="b" access="readwrite"></property> + <property name="Blocked" type="b" access="readwrite"></property> + <property name="LegacyPairing" type="b" access="read"></property> + <property name="RSSI" type="n" access="read"></property> + <property name="Connected" type="b" access="read"></property> + <property name="UUIDs" type="as" access="read"></property> + <property name="Modalias" type="s" access="read"></property> + <property name="Adapter" type="o" access="read"></property> + </interface> +</node> + diff --git a/src/bluetoothsettings/bluez/objectmanager.xml b/src/bluetoothsettings/bluez/objectmanager.xml new file mode 100644 index 0000000..e52d6fe --- /dev/null +++ b/src/bluetoothsettings/bluez/objectmanager.xml @@ -0,0 +1,20 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> + <interface name="org.freedesktop.DBus.ObjectManager"> + <method name="GetManagedObjects"> + <arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/> + </method> + <signal name="InterfacesAdded"> + <arg type="o" name="object_path"/> + <arg type="a{sa{sv}}" name="interfaces_and_properties"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InterfaceList"/> + </signal> + <signal name="InterfacesRemoved"> + <arg type="o" name="object_path"/> + <arg type="as" name="interfaces"/> + </signal> + </interface> +</node> + diff --git a/src/bluetoothsettings/discoverymodel.cpp b/src/bluetoothsettings/discoverymodel.cpp new file mode 100644 index 0000000..36d3a2e --- /dev/null +++ b/src/bluetoothsettings/discoverymodel.cpp @@ -0,0 +1,246 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QBluetoothAddress> +#include "discoverymodel.h" + +BtDeviceItem::BtDeviceItem(const QBluetoothDeviceInfo& bt, QObject *parent) + : QObject(parent) + ,m_name(bt.name()) + ,m_address(bt.address().toString()) + ,m_connected(false) +{ + m_type = getDeviceType(bt.majorDeviceClass(), bt.minorDeviceClass()); +} + +QString BtDeviceItem::name() const +{ + return m_name; +} + +QString BtDeviceItem::address() const +{ + return m_address; +} + +bool BtDeviceItem::connected() const +{ + return m_connected; +} + +void BtDeviceItem::setConnected(bool aConnected) +{ + m_connected = aConnected; + emit connectedChanged(); +} + +BtDeviceItem::DeviceType BtDeviceItem::type() const +{ + return m_type; +} + +BtDeviceItem::DeviceType BtDeviceItem::getDeviceType(const QBluetoothDeviceInfo::MajorDeviceClass major, const quint8 minor) const +{ + switch (major) { + case QBluetoothDeviceInfo::ComputerDevice: + return getComputerDeviceType(minor); + break; + case QBluetoothDeviceInfo::PhoneDevice: + return getPhoneDeviceType(minor); + break; + case QBluetoothDeviceInfo::AudioVideoDevice: + return getAudioDeviceType(minor); + break; + case QBluetoothDeviceInfo::PeripheralDevice: + return getPeripheralDeviceType(minor); + break; + case QBluetoothDeviceInfo::ImagingDevice: + return getImagingDeviceType(minor); + break; + default: + return GenericDevice; + } + return GenericDevice; +} + +BtDeviceItem::DeviceType BtDeviceItem::getComputerDeviceType(const quint8 minor) const +{ + Q_UNUSED(minor); + return Computer; +} + +BtDeviceItem::DeviceType BtDeviceItem::getAudioDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::Microphone: + return Microphone; + break; + case QBluetoothDeviceInfo::WearableHeadsetDevice: + case QBluetoothDeviceInfo::Headphones: + return Headphones; + break; + case QBluetoothDeviceInfo::Camcorder: + case QBluetoothDeviceInfo::VideoCamera: + return Camcorder; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getPeripheralDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::KeyboardPeripheral: + return Keyboard; + break; + case QBluetoothDeviceInfo::PointingDevicePeripheral: + return Mouse; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getImagingDeviceType(const quint8 minor) const +{ + switch (minor) { + case QBluetoothDeviceInfo::ImageCamera: + return Camera; + break; + default: + return GenericDevice; + break; + } +} + +BtDeviceItem::DeviceType BtDeviceItem::getPhoneDeviceType(const quint8 minor) const +{ + Q_UNUSED(minor); + return Phone; +} + + +DiscoveryModel::DiscoveryModel(QObject *parent) + : QAbstractListModel(parent) + ,m_discoveryAgent(new QBluetoothDeviceDiscoveryAgent(this)) +{ + m_roleNames.insert(Qt::UserRole, "modelData"); + m_roleNames.insert(Address, "address"); + m_roleNames.insert(Name, "name"); + m_roleNames.insert(Type, "type"); + m_roleNames.insert(Connected, "connected"); + + connect(m_discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), + this, SLOT(deviceDiscovered(QBluetoothDeviceInfo))); + + connect(m_discoveryAgent, SIGNAL(finished()), + this, SIGNAL(scanFinished())); + +} + +void DiscoveryModel::deviceDiscovered(const QBluetoothDeviceInfo &device) +{ + beginInsertRows(QModelIndex(), m_items.count(), m_items.count()); + BtDeviceItem *item = new BtDeviceItem(device); + m_items.append(item); + endInsertRows(); +} + +DiscoveryModel::~DiscoveryModel() +{ + +} + +void DiscoveryModel::scanDevices() +{ + m_discoveryAgent->start(); +} + +QHash<int, QByteArray> DiscoveryModel::roleNames() const +{ + return m_roleNames; +} + +int DiscoveryModel::rowCount(const QModelIndex & parent) const +{ + Q_UNUSED(parent); + return m_items.count(); +} + +QVariant DiscoveryModel::data(const QModelIndex & index, int role) const +{ + if (!index.isValid()) return QVariant(); + + BtDeviceItem *item = m_items[index.row()]; + + switch (role) { + case DiscoveryModel::Name: + return item->name(); + break; + case DiscoveryModel::Address: + return item->address(); + break; + case DiscoveryModel::Type: + return item->type(); + break; + case DiscoveryModel::Connected: + return item->connected(); + default: + return ""; + } +} + +void DiscoveryModel::setConnected(const QString &aAddress, bool connected) +{ + bool found = false; + int i = 0; + QVector<int> role; + role.append(DiscoveryModel::Connected); + foreach (BtDeviceItem *item, m_items) { + if (item->address() == aAddress) { + item->setConnected(connected); + found = true; + break; + } + i++; + } + + if (found) + emit dataChanged(index(i, 0), index(i, 0), role); +} diff --git a/src/bluetoothsettings/discoverymodel.h b/src/bluetoothsettings/discoverymodel.h new file mode 100644 index 0000000..e939450 --- /dev/null +++ b/src/bluetoothsettings/discoverymodel.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Device Utilities module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef DISCOVERYMODEL_H +#define DISCOVERYMODEL_H + + +#include <QObject> +#include <QAbstractListModel> +#include <QBluetoothDeviceInfo> +#include <QBluetoothDeviceDiscoveryAgent> + +class Q_DECL_EXPORT BtDeviceItem : public QObject +{ + Q_OBJECT + Q_ENUMS(DeviceType) + Q_PROPERTY(QString address READ address CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) + Q_PROPERTY(DeviceType type READ type CONSTANT) +public: + explicit BtDeviceItem(const QBluetoothDeviceInfo& id, QObject *parent=0); + //The list of device type we want to show the icon + enum DeviceType { + Phone, + Computer, + Mouse, + Keyboard, + Headphones, + Microphone, + Camera, + Camcorder, + Clock, + HealthDevice, + GenericDevice=1000 + }; + QString name() const; + QString address() const; + DeviceType type() const; + bool connected() const; + void setConnected(bool aConnected); + +signals: + void connectedChanged(); + +protected: + DeviceType getDeviceType(const QBluetoothDeviceInfo::MajorDeviceClass major, + const quint8 minor) const; + DeviceType getComputerDeviceType(const quint8 minor) const; + DeviceType getAudioDeviceType(const quint8 minor) const; + DeviceType getPeripheralDeviceType(const quint8 minor) const; + DeviceType getImagingDeviceType(const quint8 minor) const; + DeviceType getHealthDeviceType(const quint8 minor) const; + DeviceType getPhoneDeviceType(const quint8 minor) const; + +private: + QString m_name; + QString m_address; + bool m_connected; + DeviceType m_type; +}; + +class Q_DECL_EXPORT DiscoveryModel : public QAbstractListModel +{ + Q_OBJECT + Q_ENUMS(DeviceType) +public: + explicit DiscoveryModel(QObject *parent=0); + virtual ~DiscoveryModel(); + // from QAbstractItemModel + int rowCount(const QModelIndex & parent = QModelIndex()) const; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; + QHash<int, QByteArray> roleNames() const; + void setConnected(const QString& aAddress, bool connected); + void scanDevices(); + + enum Roles { + Name = Qt::UserRole, + Address, + Type, + Connected + }; + +signals: + void scanFinished(); + +private slots: + void deviceDiscovered(const QBluetoothDeviceInfo &device); +private: + QList<BtDeviceItem*> m_items; + QHash<int, QByteArray> m_roleNames; + QBluetoothDeviceDiscoveryAgent *m_discoveryAgent; +}; +#endif // DISCOVERYMODEL_H |