summaryrefslogtreecommitdiffstats
path: root/src/bluetoothsettings
diff options
context:
space:
mode:
authorTeemu Holappa <teemu.holappa@theqtcompany.com>2016-02-11 11:50:55 +0200
committerTeemu Holappa <teemu.holappa@theqtcompany.com>2016-02-17 11:57:20 +0000
commitf1d884b6dad5a93d7a3077b6b05d3ec7fcd9a6ea (patch)
tree9d48669bdf1e8877b19c3a98cd8bbd8c90df5290 /src/bluetoothsettings
parentb4088adc7f2666d468a478e379b94c5cb4494c1b (diff)
Refactored Qml plugins into modules.
Separated C++ and Qml interfaces. All the UI's from plugins are moved to the settingsui folder. Change-Id: Id6a6623346b18321357bc42d24121c4d9cdfd098 Reviewed-by: Kimmo Ollila <kimmo.ollila@theqtcompany.com>
Diffstat (limited to 'src/bluetoothsettings')
-rw-r--r--src/bluetoothsettings/bluetoothdevice.cpp169
-rw-r--r--src/bluetoothsettings/bluetoothdevice.h85
-rw-r--r--src/bluetoothsettings/bluetoothsettings.pro19
-rw-r--r--src/bluetoothsettings/bluez/bluetoothdevice_p.cpp98
-rw-r--r--src/bluetoothsettings/bluez/bluetoothdevice_p.h55
-rw-r--r--src/bluetoothsettings/bluez/bluez.pri15
-rw-r--r--src/bluetoothsettings/bluez/datatypes.h53
-rw-r--r--src/bluetoothsettings/bluez/device1.xml31
-rw-r--r--src/bluetoothsettings/bluez/objectmanager.xml20
-rw-r--r--src/bluetoothsettings/discoverymodel.cpp246
-rw-r--r--src/bluetoothsettings/discoverymodel.h126
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