From 1249c58af8d31fe13395dddf7c8572a5ff95016e Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Thu, 19 Jun 2014 11:08:20 +0200 Subject: Add Neard dbus xml interfaces Change-Id: Ie3661fe2b35735e22613e1c7ce0a408652b69970 Reviewed-by: Alex Blasche --- src/nfc/neard/org.neard.Adapter.xml | 26 +++++++++++++++++++++++++ src/nfc/neard/org.neard.Manager.xml | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/nfc/neard/org.neard.Adapter.xml create mode 100644 src/nfc/neard/org.neard.Manager.xml diff --git a/src/nfc/neard/org.neard.Adapter.xml b/src/nfc/neard/org.neard.Adapter.xml new file mode 100644 index 00000000..0697b5cd --- /dev/null +++ b/src/nfc/neard/org.neard.Adapter.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/org.neard.Manager.xml b/src/nfc/neard/org.neard.Manager.xml new file mode 100644 index 00000000..068fc880 --- /dev/null +++ b/src/nfc/neard/org.neard.Manager.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From c86882a9d1969613811204109ffd263ef69048ec Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Thu, 19 Jun 2014 11:09:16 +0200 Subject: Add C++ Dbus neard interfaces Change-Id: Ice6343bf486f4a908704de14772e8d4464106f4a Reviewed-by: Alex Blasche --- src/nfc/neard/adapter.cpp | 26 ++++++++++++++ src/nfc/neard/adapter_p.h | 76 +++++++++++++++++++++++++++++++++++++++ src/nfc/neard/manager.cpp | 26 ++++++++++++++ src/nfc/neard/manager_p.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++ src/nfc/neard/neard.pri | 5 +++ 5 files changed, 224 insertions(+) create mode 100644 src/nfc/neard/adapter.cpp create mode 100644 src/nfc/neard/adapter_p.h create mode 100644 src/nfc/neard/manager.cpp create mode 100644 src/nfc/neard/manager_p.h create mode 100644 src/nfc/neard/neard.pri diff --git a/src/nfc/neard/adapter.cpp b/src/nfc/neard/adapter.cpp new file mode 100644 index 00000000..4944a921 --- /dev/null +++ b/src/nfc/neard/adapter.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "adapter.h" + +/* + * Implementation of interface class OrgNeardAdapterInterface + */ + +OrgNeardAdapterInterface::OrgNeardAdapterInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardAdapterInterface::~OrgNeardAdapterInterface() +{ +} + diff --git a/src/nfc/neard/adapter_p.h b/src/nfc/neard/adapter_p.h new file mode 100644 index 00000000..0539b3b4 --- /dev/null +++ b/src/nfc/neard/adapter_p.h @@ -0,0 +1,76 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef ADAPTER_H_1403168174 +#define ADAPTER_H_1403168174 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.neard.Adapter + */ +class OrgNeardAdapterInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.Adapter"; } + +public: + OrgNeardAdapterInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardAdapterInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply GetProperties() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + } + + inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) + { + QList argumentList; + argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); + return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + } + + inline QDBusPendingReply<> StartPollLoop(const QString &name) + { + QList argumentList; + argumentList << QVariant::fromValue(name); + return asyncCallWithArgumentList(QLatin1String("StartPollLoop"), argumentList); + } + + inline QDBusPendingReply<> StopPollLoop() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("StopPollLoop"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void PropertyChanged(const QString &name, const QDBusVariant &value); + void TagFound(const QDBusObjectPath &address); + void TagLost(const QDBusObjectPath &address); +}; + +namespace org { + namespace neard { + typedef ::OrgNeardAdapterInterface Adapter; + } +} +#endif diff --git a/src/nfc/neard/manager.cpp b/src/nfc/neard/manager.cpp new file mode 100644 index 00000000..d431f904 --- /dev/null +++ b/src/nfc/neard/manager.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "manager.h" + +/* + * Implementation of interface class OrgNeardManagerInterface + */ + +OrgNeardManagerInterface::OrgNeardManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardManagerInterface::~OrgNeardManagerInterface() +{ +} + diff --git a/src/nfc/neard/manager_p.h b/src/nfc/neard/manager_p.h new file mode 100644 index 00000000..86b8966f --- /dev/null +++ b/src/nfc/neard/manager_p.h @@ -0,0 +1,91 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef MANAGER_H_1403168371 +#define MANAGER_H_1403168371 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.neard.Manager + */ +class OrgNeardManagerInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.Manager"; } + +public: + OrgNeardManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardManagerInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply GetProperties() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + } + + inline QDBusPendingReply<> RegisterHandoverAgent(const QDBusObjectPath &path, const QString &type) + { + QList argumentList; + argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); + return asyncCallWithArgumentList(QLatin1String("RegisterHandoverAgent"), argumentList); + } + + inline QDBusPendingReply<> RegisterNDEFAgent(const QDBusObjectPath &path, const QString &type) + { + QList argumentList; + argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); + return asyncCallWithArgumentList(QLatin1String("RegisterNDEFAgent"), argumentList); + } + + inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) + { + QList argumentList; + argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); + return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + } + + inline QDBusPendingReply<> UnregisterHandoverAgent(const QDBusObjectPath &path, const QString &type) + { + QList argumentList; + argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); + return asyncCallWithArgumentList(QLatin1String("UnregisterHandoverAgent"), argumentList); + } + + inline QDBusPendingReply<> UnregisterNDEFAgent(const QDBusObjectPath &path, const QString &type) + { + QList argumentList; + argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); + return asyncCallWithArgumentList(QLatin1String("UnregisterNDEFAgent"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void AdapterAdded(const QDBusObjectPath &adapter); + void AdapterRemoved(const QDBusObjectPath &adapter); + void PropertyChanged(const QString &name, const QDBusVariant &value); +}; + +namespace org { + namespace neard { + typedef ::OrgNeardManagerInterface Manager; + } +} +#endif diff --git a/src/nfc/neard/neard.pri b/src/nfc/neard/neard.pri new file mode 100644 index 00000000..a82c7f5b --- /dev/null +++ b/src/nfc/neard/neard.pri @@ -0,0 +1,5 @@ +HEADERS += neard/adapter_p.h \ + neard/manager_p.h + +SOURCES += neard/adapter.cpp \ + neard/manager.cpp -- cgit v1.2.3 From 1727e5b732d3c6603bd12cf0839508cf267272e2 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Wed, 25 Jun 2014 13:52:48 +0200 Subject: Add neard Tag dbus interface Change-Id: Id4152a5c6d622d8a0195d30d28b9ac8714491b92 Reviewed-by: Alex Blasche --- src/nfc/neard/neard.pri | 6 ++-- src/nfc/neard/org.neard.Tag.xml | 22 +++++++++++++ src/nfc/neard/tag.cpp | 26 ++++++++++++++++ src/nfc/neard/tag_p.h | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 src/nfc/neard/org.neard.Tag.xml create mode 100644 src/nfc/neard/tag.cpp create mode 100644 src/nfc/neard/tag_p.h diff --git a/src/nfc/neard/neard.pri b/src/nfc/neard/neard.pri index a82c7f5b..5330fd05 100644 --- a/src/nfc/neard/neard.pri +++ b/src/nfc/neard/neard.pri @@ -1,5 +1,7 @@ HEADERS += neard/adapter_p.h \ - neard/manager_p.h + neard/manager_p.h \ + neard/tag_p.h SOURCES += neard/adapter.cpp \ - neard/manager.cpp + neard/manager.cpp \ + neard/tag.cpp diff --git a/src/nfc/neard/org.neard.Tag.xml b/src/nfc/neard/org.neard.Tag.xml new file mode 100644 index 00000000..ce92dff6 --- /dev/null +++ b/src/nfc/neard/org.neard.Tag.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/tag.cpp b/src/nfc/neard/tag.cpp new file mode 100644 index 00000000..a0c4e1ef --- /dev/null +++ b/src/nfc/neard/tag.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "tag_p.h" + +/* + * Implementation of interface class OrgNeardTagInterface + */ + +OrgNeardTagInterface::OrgNeardTagInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardTagInterface::~OrgNeardTagInterface() +{ +} + diff --git a/src/nfc/neard/tag_p.h b/src/nfc/neard/tag_p.h new file mode 100644 index 00000000..65cfd9b4 --- /dev/null +++ b/src/nfc/neard/tag_p.h @@ -0,0 +1,68 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag -v + * + * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef TAG_H_1403696363 +#define TAG_H_1403696363 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.neard.Tag + */ +class OrgNeardTagInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.Tag"; } + +public: + OrgNeardTagInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardTagInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply GetProperties() + { + QList argumentList; + return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + } + + inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) + { + QList argumentList; + argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); + return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + } + + inline QDBusPendingReply<> Write(const QVariantMap &attributes) + { + QList argumentList; + argumentList << QVariant::fromValue(attributes); + return asyncCallWithArgumentList(QLatin1String("Write"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void PropertyChanged(const QString &name, const QDBusVariant &value); +}; + +namespace org { + namespace neard { + typedef ::OrgNeardTagInterface Tag; + } +} +#endif -- cgit v1.2.3 From 9d09719e28e990f616c23dde9a3d6bcee7374e81 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Fri, 20 Jun 2014 08:14:39 +0200 Subject: Initial implementation of the QNearfieldmanager While the QNearFielManager is not functional yet, this commit contains a sceleton implementation on which the future implementation can be built on. Change-Id: I075b42bb74051db4629e7a93b2aaea89785807b9 Reviewed-by: Alex Blasche --- src/nfc/neard/adapter.cpp | 2 +- src/nfc/neard/manager.cpp | 2 +- src/nfc/nfc.pro | 27 ++++- src/nfc/qnearfieldmanager_neard.cpp | 222 ++++++++++++++++++++++++++++++++++++ src/nfc/qnearfieldmanager_neard.h | 89 +++++++++++++++ 5 files changed, 338 insertions(+), 4 deletions(-) create mode 100644 src/nfc/qnearfieldmanager_neard.cpp create mode 100644 src/nfc/qnearfieldmanager_neard.h diff --git a/src/nfc/neard/adapter.cpp b/src/nfc/neard/adapter.cpp index 4944a921..e2129ec4 100644 --- a/src/nfc/neard/adapter.cpp +++ b/src/nfc/neard/adapter.cpp @@ -9,7 +9,7 @@ * before re-generating it. */ -#include "adapter.h" +#include "adapter_p.h" // HAND-EDIT /* * Implementation of interface class OrgNeardAdapterInterface diff --git a/src/nfc/neard/manager.cpp b/src/nfc/neard/manager.cpp index d431f904..97c7075c 100644 --- a/src/nfc/neard/manager.cpp +++ b/src/nfc/neard/manager.cpp @@ -9,7 +9,7 @@ * before re-generating it. */ -#include "manager.h" +#include "manager_p.h" // HAND-EDIT /* * Implementation of interface class OrgNeardManagerInterface diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro index 7b88d4f0..b8c6e992 100644 --- a/src/nfc/nfc.pro +++ b/src/nfc/nfc.pro @@ -53,7 +53,8 @@ SOURCES += \ qqmlndefrecord.cpp \ qndefnfcsmartposterrecord.cpp \ qnearfieldsharemanager.cpp \ - qnearfieldsharetarget.cpp + qnearfieldsharetarget.cpp \ + qnearfieldmanager_neard.cpp CONFIG(blackberry) { NFC_BACKEND_AVAILABLE = yes @@ -99,6 +100,27 @@ CONFIG(blackberry) { } } +linux { + NFC_BACKEND_AVAILABLE = yes + + QT += dbus + + PRIVATE_HEADERS += \ + qllcpsocket_p_p.h \ + qllcpserver_p_p.h \ + qnearfieldmanager_neard.h \ + qnearfieldsharemanagerimpl_p.h \ + qnearfieldsharetargetimpl_p.h + + SOURCES += \ + qllcpsocket_p.cpp \ + qllcpserver_p.cpp \ + qnearfieldsharemanagerimpl_p.cpp \ + qnearfieldsharetargetimpl_p.cpp + + include(neard/neard.pri) +} + simulator { NFC_BACKEND_AVAILABLE = yes @@ -140,4 +162,5 @@ isEmpty(NFC_BACKEND_AVAILABLE) { qnearfieldsharetargetimpl_p.cpp } -HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS +HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS \ + qnearfieldmanager_neard.h diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp new file mode 100644 index 00000000..acd30405 --- /dev/null +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -0,0 +1,222 @@ +/*************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qnearfieldmanager_neard.h" +#include "neard/adapter_p.h" +#include "neard/manager_p.h" + +QT_BEGIN_NAMESPACE + +// TODO We need a constructor that lets us select a adapter +QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() + : m_adapter(0) +{ + // Look for a NFC adapter + OrgNeardManagerInterface manager(QStringLiteral("org.neard"), QStringLiteral("/"), + QDBusConnection::systemBus()); + QDBusPendingReply reply = manager.GetProperties(); + reply.waitForFinished(); + if (reply.isError()) + qDebug() << "Error getting manager properties." << "Neard daemon running?"; + + const QDBusArgument &paths = reply.value().value(QStringLiteral("Adapters")).value(); + + paths.beginArray(); + while (!paths.atEnd()) { + QDBusObjectPath path; + paths >> path; + m_adapterPath = path.path(); + //qDebug() << "path is" << m_adapterPath; + break; + } + paths.endArray(); +} + +QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() +{ + stopTargetDetection(); +} + +bool QNearFieldManagerPrivateImpl::isAvailable() const +{ + OrgNeardManagerInterface manager(QStringLiteral("org.neard"), QStringLiteral("/"), + QDBusConnection::systemBus()); + QDBusPendingReply reply = manager.GetProperties(); + reply.waitForFinished(); + if (reply.isError()) + qDebug() << "Error getting manager properties." << "Neard daemon running?"; + + QDBusArgument paths = reply.value().value(QStringLiteral("Adapters")).value(); + + paths.beginArray(); + while (!paths.atEnd()) { + QDBusObjectPath path; + paths >> path; + //Check if the adapter exists + if (path.path() == m_adapterPath) + return true; + } + return false; +} + +bool QNearFieldManagerPrivateImpl::startTargetDetection() +{ + if (!isAvailable()) + return false; + + // TODO define behavior when target detection is started again + if (m_adapter) + return false; + + //qDebug() << "Constructing interface with path" << m_adapterPath; + m_adapter = new OrgNeardAdapterInterface(QStringLiteral("org.neard"), m_adapterPath, + QDBusConnection::systemBus()); + + { + QDBusPendingReply reply = m_adapter->GetProperties(); + reply.waitForFinished(); + if (!reply.isError()) { + if (reply.value().value(QStringLiteral("Polling")) == true) { + //qDebug() << "Adapter" << m_adapterPath << "is busy"; + return false; // Should we return false or true? + } + } + } + + // Switch on the NFC adapter if it is not already + QDBusPendingReply<> reply = m_adapter->SetProperty(QStringLiteral("Powered"), QDBusVariant(true)); + reply.waitForFinished(); + + //qDebug() << (reply.isError() ? "Error setting up adapter" : "Adapter powered on"); + reply = m_adapter->StartPollLoop(QStringLiteral("Dual")); + reply.waitForFinished(); + //qDebug() << (reply.isError() ? "Error when starting polling" : "Successfully started to poll"); + + // TagFound and TagLost DBus signals don't work +// connect(m_adapter, SIGNAL(TagFound(const QDBusObjectPath&)), +// this, SLOT(tagFound(const QDBusObjectPath&))); +// connect(m_adapter, SIGNAL(TagLost(const QDBusObjectPath&)), +// this, SLOT(tagFound(const QDBusObjectPath&))); + connect(m_adapter, SIGNAL(PropertyChanged(QString,QDBusVariant)), + this, SLOT(propertyChanged(QString,QDBusVariant))); + return true; +} + +void QNearFieldManagerPrivateImpl::stopTargetDetection() +{ + //qDebug() << "Stop target detection"; + QDBusPendingReply<> reply = m_adapter->StopPollLoop(); + reply.waitForFinished(); + // TODO Should we really power down the adapter? + reply = m_adapter->SetProperty(QStringLiteral("Powered"), QDBusVariant(false)); + reply.waitForFinished(); + delete m_adapter; + m_adapter = 0; +} + +int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(QObject *object, const QMetaMethod &method) +{ + Q_UNUSED(object); + Q_UNUSED(method); + return 0; +} + +int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method) +{ + Q_UNUSED(filter); + Q_UNUSED(object); + Q_UNUSED(method); + return -1; +} + +bool QNearFieldManagerPrivateImpl::unregisterNdefMessageHandler(int handlerId) +{ + Q_UNUSED(handlerId); + return false; +} + +void QNearFieldManagerPrivateImpl::requestAccess(QNearFieldManager::TargetAccessModes accessModes) +{ + Q_UNUSED(accessModes); +} + +void QNearFieldManagerPrivateImpl::releaseAccess(QNearFieldManager::TargetAccessModes accessModes) +{ + Q_UNUSED(accessModes); +} + +void QNearFieldManagerPrivateImpl::tagFound(const QDBusObjectPath &path) +{ + qDebug() << "Tag found" << path.path(); +} + +void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVariant value) +{ + qDebug() << "Property changed" << property; + // New device detected + if (property == QStringLiteral("Devices")) { + const QDBusArgument &devices = value.variant().value(); + QStringList devicesList; + devices.beginArray(); + while (!devices.atEnd()) { + QDBusObjectPath path; + devices >> path; + devicesList.append(path.path()); + qDebug() << "New device" << devicesList; + } + devices.endArray(); + qDebug() << "Devices list changed" << devicesList; + } else if (property == QStringLiteral("Tags")) { + const QDBusArgument &tags = value.variant().value(); + QStringList tagList; + tags.beginArray(); + while (!tags.atEnd()) { + QDBusObjectPath path; + tags >> path; + tagList.append(path.path()); + qDebug() << "New tag" << path.path(); + } + tags.endArray(); + qDebug() << "Tag list changed" << tagList; + } +} + +QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldmanager_neard.h b/src/nfc/qnearfieldmanager_neard.h new file mode 100644 index 00000000..1848d16a --- /dev/null +++ b/src/nfc/qnearfieldmanager_neard.h @@ -0,0 +1,89 @@ +/*************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QNEARFIELDMANAGER_NEARD_H +#define QNEARFIELDMANAGER_NEARD_H + +#include "qnearfieldmanager_p.h" +#include "qnearfieldmanager.h" +#include "qnearfieldtarget.h" + +#include "neard/adapter_p.h" + +QT_BEGIN_NAMESPACE + +class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate +{ + Q_OBJECT + +public: + QNearFieldManagerPrivateImpl(); + ~QNearFieldManagerPrivateImpl(); + + bool isAvailable() const; + + bool startTargetDetection(); + + void stopTargetDetection(); + + int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); + + int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method); + + bool unregisterNdefMessageHandler(int handlerId); + + void requestAccess(QNearFieldManager::TargetAccessModes accessModes); + + void releaseAccess(QNearFieldManager::TargetAccessModes accessModes); + +private Q_SLOTS: + void tagFound(const QDBusObjectPath&); + void propertyChanged(QString,QDBusVariant); + +private: + QString m_adapterPath; + OrgNeardAdapterInterface *m_adapter; +}; + +QT_END_NAMESPACE + + +#endif // QNEARFIELDMANAGER_NEARD_H -- cgit v1.2.3 From de847406f71a1f5a8bf24b2b3fc99471e62c2901 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Wed, 25 Jun 2014 13:51:11 +0200 Subject: Add QNearfieldTarget neard implementation This is mostly a skeleton implementation. There is no support yet for reading records or ndef messages. Change-Id: Id521468517c04b088152e15a327cff9b26fa346f Reviewed-by: Alex Blasche --- src/nfc/nfc.pro | 3 +- src/nfc/qnearfieldmanager_neard.cpp | 4 + src/nfc/qnearfieldtarget_neard_p.h | 155 ++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/nfc/qnearfieldtarget_neard_p.h diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro index b8c6e992..3d445415 100644 --- a/src/nfc/nfc.pro +++ b/src/nfc/nfc.pro @@ -163,4 +163,5 @@ isEmpty(NFC_BACKEND_AVAILABLE) { } HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS \ - qnearfieldmanager_neard.h + qnearfieldmanager_neard.h \ + qnearfieldtarget_neard_p.h diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index acd30405..6bf82236 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -42,6 +42,7 @@ #include "qnearfieldmanager_neard.h" #include "neard/adapter_p.h" #include "neard/manager_p.h" +#include "qnearfieldtarget_neard_p.h" QT_BEGIN_NAMESPACE @@ -213,6 +214,9 @@ void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVarian tags >> path; tagList.append(path.path()); qDebug() << "New tag" << path.path(); + NearFieldTarget *nfTag = + new NearFieldTarget(this, path); + emit targetDetected(nfTag); } tags.endArray(); qDebug() << "Tag list changed" << tagList; diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h new file mode 100644 index 00000000..692fe5f4 --- /dev/null +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -0,0 +1,155 @@ +/*************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QNEARFIELDTARGET_NEARD_P_H +#define QNEARFIELDTARGET_NEARD_P_H + +#include +#include +#include + +#include "neard/tag_p.h" + +QT_BEGIN_NAMESPACE + +#define TAG_NAME_BUFFER 64 + +template +class NearFieldTarget : public T +{ +public: + + NearFieldTarget(QObject *parent, QDBusObjectPath interfacePath) + : T(parent) + { + m_tagInterface = new OrgNeardTagInterface(QStringLiteral("org.neard"), + interfacePath.path(), + QDBusConnection::systemBus()); + + if (!isValid()) + return; + + QVariantMap properties = m_tagInterface->GetProperties(); + QString type = properties.value(QStringLiteral("Type")).toString(); + m_type = QNearFieldTarget::ProprietaryTag; + + if (type == QStringLiteral("Type 1")) + m_type = QNearFieldTarget::NfcTagType1; + else if (type == QStringLiteral("Type 2")) + m_type = QNearFieldTarget::NfcTagType2; + else if (type == QStringLiteral("Type 3")) + m_type = QNearFieldTarget::NfcTagType3; + else if (type == QStringLiteral("Type 4")) + m_type = QNearFieldTarget::NfcTagType4; + + qDebug() << "Type" << type << m_type; + } + + ~NearFieldTarget() + { + delete m_tagInterface; + } + + bool isValid() + { + return m_tagInterface->isValid(); + } + + QByteArray uid() const + { + return QByteArray(); // TODO figure out a workaround because neard does not offer + // this property + } + + QNearFieldTarget::Type type() const + { + return m_type; + } + + QNearFieldTarget::AccessMethods accessMethods() const + { + QNearFieldTarget::AccessMethods result = QNearFieldTarget::NdefAccess; + return result; + } + + bool hasNdefMessage() + { + return false; + } + + QNearFieldTarget::RequestId readNdefMessages() + { +// QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); +// QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, +// Q_ARG(const QNearFieldTarget::RequestId, requestId)); +// return requestId; + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + QNearFieldTarget::RequestId sendCommand(const QByteArray &command) + { + Q_UNUSED(command); + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + QNearFieldTarget::RequestId sendCommands(const QList &commands) + { + Q_UNUSED(commands); + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) + { + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + +protected: + OrgNeardTagInterface *m_tagInterface; + QNearFieldTarget::Type m_type; +}; + +QT_END_NAMESPACE + +#endif // QNEARFIELDTARGET_NEARD_P_H -- cgit v1.2.3 From 0ea4cc4d1e84b01e589e5e19f0323a2c80503219 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Wed, 25 Jun 2014 22:56:56 +0200 Subject: Clean up neard implementation Besides some code cleanups this patch makes sure to only build the neard implementation if dbus is available. This patch also deals with the possibility that the neard daemon is not running on the system. Change-Id: I8546d34b808d8236e0434e00cf5950b31e20cb72 Reviewed-by: Alex Blasche --- src/nfc/nfc.pro | 19 ++++---- src/nfc/qnearfieldmanager.cpp | 2 + src/nfc/qnearfieldmanager_neard.cpp | 62 +++++++++++++++--------- src/nfc/qnearfieldmanager_neard.h | 89 ---------------------------------- src/nfc/qnearfieldmanager_neard_p.h | 95 +++++++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+), 120 deletions(-) delete mode 100644 src/nfc/qnearfieldmanager_neard.h create mode 100644 src/nfc/qnearfieldmanager_neard_p.h diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro index 3d445415..8342cf2a 100644 --- a/src/nfc/nfc.pro +++ b/src/nfc/nfc.pro @@ -53,8 +53,7 @@ SOURCES += \ qqmlndefrecord.cpp \ qndefnfcsmartposterrecord.cpp \ qnearfieldsharemanager.cpp \ - qnearfieldsharetarget.cpp \ - qnearfieldmanager_neard.cpp + qnearfieldsharetarget.cpp CONFIG(blackberry) { NFC_BACKEND_AVAILABLE = yes @@ -100,23 +99,27 @@ CONFIG(blackberry) { } } -linux { +linux:qtHaveModule(dbus) { NFC_BACKEND_AVAILABLE = yes QT += dbus + DEFINES += NEARD_NFC + PRIVATE_HEADERS += \ qllcpsocket_p_p.h \ qllcpserver_p_p.h \ - qnearfieldmanager_neard.h \ + qnearfieldmanager_neard_p.h \ qnearfieldsharemanagerimpl_p.h \ - qnearfieldsharetargetimpl_p.h + qnearfieldsharetargetimpl_p.h \ + qnearfieldtarget_neard_p.h SOURCES += \ qllcpsocket_p.cpp \ qllcpserver_p.cpp \ qnearfieldsharemanagerimpl_p.cpp \ - qnearfieldsharetargetimpl_p.cpp + qnearfieldsharetargetimpl_p.cpp \ + qnearfieldmanager_neard.cpp include(neard/neard.pri) } @@ -162,6 +165,4 @@ isEmpty(NFC_BACKEND_AVAILABLE) { qnearfieldsharetargetimpl_p.cpp } -HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS \ - qnearfieldmanager_neard.h \ - qnearfieldtarget_neard_p.h +HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 88656a6e..0f8c1a8f 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -46,6 +46,8 @@ #include "qnearfieldmanager_simulator_p.h" #elif defined(QNX_NFC) #include "qnearfieldmanager_qnx_p.h" +#elif defined(NEARD_NFC) +#include "qnearfieldmanager_neard_p.h" #else #include "qnearfieldmanagerimpl_p.h" #endif diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index 6bf82236..76ea6635 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -39,33 +39,41 @@ ** ****************************************************************************/ -#include "qnearfieldmanager_neard.h" -#include "neard/adapter_p.h" -#include "neard/manager_p.h" +#include "qnearfieldmanager_neard_p.h" #include "qnearfieldtarget_neard_p.h" +#include "neard/manager_p.h" +#include "neard/adapter_p.h" + QT_BEGIN_NAMESPACE -// TODO We need a constructor that lets us select a adapter +// TODO We need a constructor that lets us select an adapter QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() - : m_adapter(0) + : QNearFieldManagerPrivate(), m_adapter(0), m_manager(0) { - // Look for a NFC adapter - OrgNeardManagerInterface manager(QStringLiteral("org.neard"), QStringLiteral("/"), - QDBusConnection::systemBus()); - QDBusPendingReply reply = manager.GetProperties(); + m_manager = new OrgNeardManagerInterface(QStringLiteral("org.neard"), QStringLiteral("/"), + QDBusConnection::systemBus(), this); + if (!m_manager->isValid()) { + qDebug() << "Could not connect to manager" << "Neard daemon running?"; + return; + } + + QDBusPendingReply reply = m_manager->GetProperties(); reply.waitForFinished(); - if (reply.isError()) - qDebug() << "Error getting manager properties." << "Neard daemon running?"; + if (reply.isError()) { + qDebug() << "Error getting manager properties."; + return; + } + // Now we check if the adapter still exists (it might have been unplugged) const QDBusArgument &paths = reply.value().value(QStringLiteral("Adapters")).value(); paths.beginArray(); while (!paths.atEnd()) { QDBusObjectPath path; paths >> path; + // Select the first adapter m_adapterPath = path.path(); - //qDebug() << "path is" << m_adapterPath; break; } paths.endArray(); @@ -78,23 +86,31 @@ QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() bool QNearFieldManagerPrivateImpl::isAvailable() const { - OrgNeardManagerInterface manager(QStringLiteral("org.neard"), QStringLiteral("/"), - QDBusConnection::systemBus()); - QDBusPendingReply reply = manager.GetProperties(); + if (!m_manager->isValid() || m_adapterPath.isNull()) { + return false; + } + + QDBusPendingReply reply = m_manager->GetProperties(); reply.waitForFinished(); - if (reply.isError()) - qDebug() << "Error getting manager properties." << "Neard daemon running?"; + if (reply.isError()) { + qDebug() << "Error getting manager properties."; + return false; + } - QDBusArgument paths = reply.value().value(QStringLiteral("Adapters")).value(); + // Now we check if the adapter still exists (it might have been unplugged) + const QDBusArgument &paths = reply.value().value(QStringLiteral("Adapters")).value(); paths.beginArray(); while (!paths.atEnd()) { QDBusObjectPath path; paths >> path; - //Check if the adapter exists - if (path.path() == m_adapterPath) + // Check if the adapter exists + if (path.path() == m_adapterPath) { + paths.endArray(); return true; + } } + paths.endArray(); return false; } @@ -109,7 +125,7 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection() //qDebug() << "Constructing interface with path" << m_adapterPath; m_adapter = new OrgNeardAdapterInterface(QStringLiteral("org.neard"), m_adapterPath, - QDBusConnection::systemBus()); + QDBusConnection::systemBus(), this); { QDBusPendingReply reply = m_adapter->GetProperties(); @@ -143,7 +159,9 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection() void QNearFieldManagerPrivateImpl::stopTargetDetection() { - //qDebug() << "Stop target detection"; + if (!isAvailable()) + return; + QDBusPendingReply<> reply = m_adapter->StopPollLoop(); reply.waitForFinished(); // TODO Should we really power down the adapter? diff --git a/src/nfc/qnearfieldmanager_neard.h b/src/nfc/qnearfieldmanager_neard.h deleted file mode 100644 index 1848d16a..00000000 --- a/src/nfc/qnearfieldmanager_neard.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** -** -** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtNfc module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QNEARFIELDMANAGER_NEARD_H -#define QNEARFIELDMANAGER_NEARD_H - -#include "qnearfieldmanager_p.h" -#include "qnearfieldmanager.h" -#include "qnearfieldtarget.h" - -#include "neard/adapter_p.h" - -QT_BEGIN_NAMESPACE - -class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate -{ - Q_OBJECT - -public: - QNearFieldManagerPrivateImpl(); - ~QNearFieldManagerPrivateImpl(); - - bool isAvailable() const; - - bool startTargetDetection(); - - void stopTargetDetection(); - - int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); - - int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method); - - bool unregisterNdefMessageHandler(int handlerId); - - void requestAccess(QNearFieldManager::TargetAccessModes accessModes); - - void releaseAccess(QNearFieldManager::TargetAccessModes accessModes); - -private Q_SLOTS: - void tagFound(const QDBusObjectPath&); - void propertyChanged(QString,QDBusVariant); - -private: - QString m_adapterPath; - OrgNeardAdapterInterface *m_adapter; -}; - -QT_END_NAMESPACE - - -#endif // QNEARFIELDMANAGER_NEARD_H diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h new file mode 100644 index 00000000..4984a531 --- /dev/null +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -0,0 +1,95 @@ +/*************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QNEARFIELDMANAGER_NEARD_H +#define QNEARFIELDMANAGER_NEARD_H + +#include "qnearfieldmanager_p.h" +#include "qnearfieldmanager.h" +#include "qnearfieldtarget.h" + +#include +#include + +class OrgNeardAdapterInterface; +class OrgNeardManagerInterface; + +QT_BEGIN_NAMESPACE + +class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate +{ + Q_OBJECT + +public: + QNearFieldManagerPrivateImpl(); + ~QNearFieldManagerPrivateImpl(); + + bool isAvailable() const; + + bool startTargetDetection(); + + void stopTargetDetection(); + + int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); + + int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method); + + bool unregisterNdefMessageHandler(int handlerId); + + void requestAccess(QNearFieldManager::TargetAccessModes accessModes); + + void releaseAccess(QNearFieldManager::TargetAccessModes accessModes); + +private Q_SLOTS: + void tagFound(const QDBusObjectPath&); + void propertyChanged(QString,QDBusVariant); + +private: + QString m_adapterPath; + OrgNeardAdapterInterface *m_adapter; + OrgNeardManagerInterface *m_manager; + +}; + +QT_END_NAMESPACE + + +#endif // QNEARFIELDMANAGER_NEARD_H -- cgit v1.2.3 From 0477e01feb9b6620c911402bf7ed5ccf783195d2 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Wed, 25 Jun 2014 23:20:39 +0200 Subject: Introduce a logging category for the neard implementation Change-Id: I3bee8a5c2e3bee9a83ddcb6f3a5b2b42fdb24d89 Reviewed-by: Alex Blasche --- src/nfc/nfc.pro | 3 ++- src/nfc/qnearfieldmanager_neard.cpp | 18 ++++++++------ src/nfc/qnearfieldtarget_neard_p.h | 6 ++++- src/nfc/qnfc.cpp | 49 +++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 src/nfc/qnfc.cpp diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro index 8342cf2a..7c6b6ff7 100644 --- a/src/nfc/nfc.pro +++ b/src/nfc/nfc.pro @@ -53,7 +53,8 @@ SOURCES += \ qqmlndefrecord.cpp \ qndefnfcsmartposterrecord.cpp \ qnearfieldsharemanager.cpp \ - qnearfieldsharetarget.cpp + qnearfieldsharetarget.cpp \ + qnfc.cpp CONFIG(blackberry) { NFC_BACKEND_AVAILABLE = yes diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index 76ea6635..b91b6b04 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -47,6 +47,8 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) + // TODO We need a constructor that lets us select an adapter QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() : QNearFieldManagerPrivate(), m_adapter(0), m_manager(0) @@ -54,14 +56,14 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() m_manager = new OrgNeardManagerInterface(QStringLiteral("org.neard"), QStringLiteral("/"), QDBusConnection::systemBus(), this); if (!m_manager->isValid()) { - qDebug() << "Could not connect to manager" << "Neard daemon running?"; + qCWarning(QT_NFC_NEARD) << "Could not connect to manager" << "Neard daemon running?"; return; } QDBusPendingReply reply = m_manager->GetProperties(); reply.waitForFinished(); if (reply.isError()) { - qDebug() << "Error getting manager properties."; + qCWarning(QT_NFC_NEARD) << "Error getting manager properties."; return; } @@ -93,7 +95,7 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const QDBusPendingReply reply = m_manager->GetProperties(); reply.waitForFinished(); if (reply.isError()) { - qDebug() << "Error getting manager properties."; + qCDebug(QT_NFC_NEARD) << "Error getting manager properties."; return false; } @@ -204,12 +206,12 @@ void QNearFieldManagerPrivateImpl::releaseAccess(QNearFieldManager::TargetAccess void QNearFieldManagerPrivateImpl::tagFound(const QDBusObjectPath &path) { - qDebug() << "Tag found" << path.path(); + qCDebug(QT_NFC_NEARD) << "Tag found" << path.path(); } void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVariant value) { - qDebug() << "Property changed" << property; + qCDebug(QT_NFC_NEARD) << "Property changed" << property; // New device detected if (property == QStringLiteral("Devices")) { const QDBusArgument &devices = value.variant().value(); @@ -219,7 +221,7 @@ void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVarian QDBusObjectPath path; devices >> path; devicesList.append(path.path()); - qDebug() << "New device" << devicesList; + qCDebug(QT_NFC_NEARD) << "New device" << devicesList; } devices.endArray(); qDebug() << "Devices list changed" << devicesList; @@ -231,13 +233,13 @@ void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVarian QDBusObjectPath path; tags >> path; tagList.append(path.path()); - qDebug() << "New tag" << path.path(); + qCDebug(QT_NFC_NEARD) << "New tag" << path.path(); NearFieldTarget *nfTag = new NearFieldTarget(this, path); emit targetDetected(nfTag); } tags.endArray(); - qDebug() << "Tag list changed" << tagList; + qCDebug(QT_NFC_NEARD) << "Tag list changed" << tagList; } } diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 692fe5f4..ba57c044 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) + #define TAG_NAME_BUFFER 64 template @@ -80,7 +82,9 @@ public: else if (type == QStringLiteral("Type 4")) m_type = QNearFieldTarget::NfcTagType4; - qDebug() << "Type" << type << m_type; + qCDebug(QT_NFC_NEARD) << "Type" << type << m_type; + + } ~NearFieldTarget() diff --git a/src/nfc/qnfc.cpp b/src/nfc/qnfc.cpp new file mode 100644 index 00000000..30c363c4 --- /dev/null +++ b/src/nfc/qnfc.cpp @@ -0,0 +1,49 @@ +/*************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +QT_BEGIN_NAMESPACE + +Q_LOGGING_CATEGORY(QT_NFC_NEARD, "qt.nfc.neard") + +QT_END_NAMESPACE -- cgit v1.2.3 From 5eec86183c1d2b593be7485b8a301882d29b2600 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Thu, 26 Jun 2014 00:53:48 +0200 Subject: Implement tag detected and tag lost signals This patch also implements reading the record pathes from the tag. Change-Id: Ia19ff235149cb91d3cbf7ae7c043d07d6aeae429 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager_neard.cpp | 31 +++++++++++++++++++--- src/nfc/qnearfieldmanager_neard_p.h | 4 ++- src/nfc/qnearfieldtarget_neard_p.h | 52 ++++++++++++++++++++++++++++++------- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index b91b6b04..faa3c9aa 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -233,14 +233,37 @@ void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVarian QDBusObjectPath path; tags >> path; tagList.append(path.path()); - qCDebug(QT_NFC_NEARD) << "New tag" << path.path(); - NearFieldTarget *nfTag = - new NearFieldTarget(this, path); - emit targetDetected(nfTag); + + // If a tag is not in the tags list we detected a new tag + if (!m_activeTags.value(path.path())) { + NearFieldTarget *nfTag = + new NearFieldTarget(this, path); + connect(nfTag, SIGNAL(destroyed(QObject*)), this, SLOT(tagDeleted(QObject*))); + emit targetDetected(nfTag); + m_activeTags.insert(path.path(), nfTag); + } } + //Look if a tag was lost + foreach (const QString &target, m_activeTags.keys()) { + if (!tagList.contains(target)) { + emit targetLost(m_activeTags.value(target)); + m_activeTags.remove(target); + } + } + tags.endArray(); qCDebug(QT_NFC_NEARD) << "Tag list changed" << tagList; } } +void QNearFieldManagerPrivateImpl::tagDeleted(QObject *obj) +{ + if (obj == 0) + return; + + const QString key = m_activeTags.key(static_cast(obj)); + if (!key.isEmpty()) + m_activeTags.remove(key); +} + QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index 4984a531..a7433c8f 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -48,6 +48,7 @@ #include #include +#include class OrgNeardAdapterInterface; class OrgNeardManagerInterface; @@ -81,12 +82,13 @@ public: private Q_SLOTS: void tagFound(const QDBusObjectPath&); void propertyChanged(QString,QDBusVariant); + void tagDeleted(QObject*); private: QString m_adapterPath; OrgNeardAdapterInterface *m_adapter; OrgNeardManagerInterface *m_manager; - + QMap m_activeTags; }; QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index ba57c044..4ed596a0 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -42,8 +42,12 @@ #ifndef QNEARFIELDTARGET_NEARD_P_H #define QNEARFIELDTARGET_NEARD_P_H +#include +#include + #include #include +#include #include #include "neard/tag_p.h" @@ -52,8 +56,6 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) -#define TAG_NAME_BUFFER 64 - template class NearFieldTarget : public T { @@ -83,8 +85,6 @@ public: m_type = QNearFieldTarget::NfcTagType4; qCDebug(QT_NFC_NEARD) << "Type" << type << m_type; - - } ~NearFieldTarget() @@ -121,12 +121,35 @@ public: QNearFieldTarget::RequestId readNdefMessages() { -// QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); -// QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, -// Q_ARG(const QNearFieldTarget::RequestId, requestId)); -// return requestId; - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); + if (isValid()) { + QDBusPendingReply reply = m_tagInterface->GetProperties(); + reply.waitForFinished(); + if (reply.isError()) { + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + const QDBusArgument &recordPaths = qvariant_cast(reply.value().value(QStringLiteral("Records"))); + + QNdefMessage newNdefMessage; + recordPaths.beginArray(); + while (!recordPaths.atEnd()) { + QDBusObjectPath path; + recordPaths >> path; + newNdefMessage.append(readRecord(path)); + } + recordPaths.endArray(); + + emit QNearFieldTarget::ndefMessageRead(newNdefMessage); + + QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, requestId)); + return requestId; + } else { + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } } QNearFieldTarget::RequestId sendCommand(const QByteArray &command) @@ -145,10 +168,19 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) { + Q_UNUSED(messages); emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } +private: + QNdefRecord readRecord(QDBusObjectPath path) + { + Q_UNUSED(path); + // TODO + return QNdefRecord(); + } + protected: OrgNeardTagInterface *m_tagInterface; QNearFieldTarget::Type m_type; -- cgit v1.2.3 From fdc3a1702218657a965a0b820fdf8756d37919c8 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Thu, 26 Jun 2014 15:33:11 +0200 Subject: Add neard ndef record parsing This patch adds the neard dbus interface and provides logic to parse data from this interface. Change-Id: Id9a5df88d75c71cf6f2b320afed644a38d03c38d Reviewed-by: Alex Blasche --- src/nfc/neard/neard.pri | 6 ++- src/nfc/neard/org.neard.Record.xml | 10 +++++ src/nfc/neard/record.cpp | 26 ++++++++++++ src/nfc/neard/record_p.h | 53 ++++++++++++++++++++++++ src/nfc/qnearfieldtarget_neard_p.h | 85 ++++++++++++++++++++++++++++++++++---- 5 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 src/nfc/neard/org.neard.Record.xml create mode 100644 src/nfc/neard/record.cpp create mode 100644 src/nfc/neard/record_p.h diff --git a/src/nfc/neard/neard.pri b/src/nfc/neard/neard.pri index 5330fd05..7aade77f 100644 --- a/src/nfc/neard/neard.pri +++ b/src/nfc/neard/neard.pri @@ -1,7 +1,9 @@ HEADERS += neard/adapter_p.h \ neard/manager_p.h \ - neard/tag_p.h + neard/tag_p.h \ + neard/record_p.h SOURCES += neard/adapter.cpp \ neard/manager.cpp \ - neard/tag.cpp + neard/tag.cpp \ + neard/record.cpp diff --git a/src/nfc/neard/org.neard.Record.xml b/src/nfc/neard/org.neard.Record.xml new file mode 100644 index 00000000..39374d83 --- /dev/null +++ b/src/nfc/neard/org.neard.Record.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/nfc/neard/record.cpp b/src/nfc/neard/record.cpp new file mode 100644 index 00000000..9b3fe93f --- /dev/null +++ b/src/nfc/neard/record.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p record org.neard.Record.xml + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "record_p.h" + +/* + * Implementation of interface class OrgNeardRecordInterface + */ + +OrgNeardRecordInterface::OrgNeardRecordInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardRecordInterface::~OrgNeardRecordInterface() +{ +} + diff --git a/src/nfc/neard/record_p.h b/src/nfc/neard/record_p.h new file mode 100644 index 00000000..975b0cd5 --- /dev/null +++ b/src/nfc/neard/record_p.h @@ -0,0 +1,53 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p record org.neard.Record.xml + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef RECORD_H_1403789294 +#define RECORD_H_1403789294 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.neard.Record + */ +class OrgNeardRecordInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.Record"; } + +public: + OrgNeardRecordInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardRecordInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply GetProperties() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace org { + namespace neard { + typedef ::OrgNeardRecordInterface Record; + } +} +#endif diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 4ed596a0..f11f7158 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -51,6 +51,11 @@ #include #include "neard/tag_p.h" +#include "neard/record_p.h" + +#include +#include +#include QT_BEGIN_NAMESPACE @@ -66,13 +71,23 @@ public: { m_tagInterface = new OrgNeardTagInterface(QStringLiteral("org.neard"), interfacePath.path(), - QDBusConnection::systemBus()); + QDBusConnection::systemBus(), this); - if (!isValid()) + if (!isValid()) { + qCWarning(QT_NFC_NEARD) << "Could not connect to org.neard.Tag dbus interface" + << interfacePath.path(); return; + } + + QDBusPendingReply reply = m_tagInterface->GetProperties(); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_NFC_NEARD) << "Could not get properties of org.neard.Tag dbus interface" + << interfacePath.path(); + return; + } - QVariantMap properties = m_tagInterface->GetProperties(); - QString type = properties.value(QStringLiteral("Type")).toString(); + const QString &type = reply.value().value(QStringLiteral("Type")).toString(); m_type = QNearFieldTarget::ProprietaryTag; if (type == QStringLiteral("Type 1")) @@ -89,7 +104,6 @@ public: ~NearFieldTarget() { - delete m_tagInterface; } bool isValid() @@ -174,10 +188,65 @@ public: } private: - QNdefRecord readRecord(QDBusObjectPath path) + QNdefRecord readRecord(const QDBusObjectPath &path) { - Q_UNUSED(path); - // TODO + OrgNeardRecordInterface recordInterface(QStringLiteral("org.neard"), + path.path(), + QDBusConnection::systemBus()); + if (!recordInterface.isValid()) + return QNdefRecord(); + + QDBusPendingReply reply = recordInterface.GetProperties(); + reply.waitForFinished(); + if (reply.isError()) + return QNdefRecord(); + + const QString &value = reply.value().value(QStringLiteral("Representation")).toString(); + const QString &locale = reply.value().value(QStringLiteral("Language")).toString(); + const QString &encoding = reply.value().value(QStringLiteral("Encoding")).toString(); + const QString &uri = reply.value().value(QStringLiteral("URI")).toString(); +// const QString &mimetype = reply.value().value(QStringLiteral("MIMEType")).toString(); +// const QString &mime = reply.value().value(QStringLiteral("MIME")).toString(); +// const QString &arr = reply.value().value(QStringLiteral("ARR")).toString(); +// const QString &size = reply.value().value(QStringLiteral("Size")).toString(); + + const QString type = reply.value().value(QStringLiteral("Type")).toString(); + if (type == QStringLiteral("Text")) { + QNdefNfcTextRecord textRecord; + textRecord.setText(value); + textRecord.setLocale(locale); + textRecord.setEncoding((encoding == QStringLiteral("UTF-8")) ? QNdefNfcTextRecord::Utf8 + : QNdefNfcTextRecord::Utf16); + return textRecord; + } else if (type == QStringLiteral("SmartPoster")) { + QNdefNfcSmartPosterRecord spRecord; + if (!value.isEmpty()) { + spRecord.addTitle(value, locale, (encoding == QStringLiteral("UTF-8")) + ? QNdefNfcTextRecord::Utf8 + : QNdefNfcTextRecord::Utf16); + } + + if (!uri.isEmpty()) + spRecord.setUri(QUrl(uri)); + +// const QString &actionString = reply.value().value(QStringLiteral("Action")).toString(); +// if (!action.isEmpty()) { +// QNdefNfcSmartPosterRecord::Action action; + +// spRecord.setAction(acti); +// } + + return spRecord; + } else if (type == QStringLiteral("URI")) { + QNdefNfcUriRecord uriRecord; + uriRecord.setUri(QUrl(uri)); + return uriRecord; + } else if (type == QStringLiteral("MIME")) { + + } else if (type == QStringLiteral("AAR")) { + + } + return QNdefRecord(); } -- cgit v1.2.3 From 249741c0ec267bbb21cca9a2873cb068bdae6db7 Mon Sep 17 00:00:00 2001 From: Fabian Bumberger Date: Tue, 1 Jul 2014 17:29:34 +0200 Subject: Neard: Implement tag write Change-Id: I423658f5365ed51ccb117f5e388b93cc3ab2b8f9 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_neard_p.h | 78 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index f11f7158..cb489498 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -130,6 +130,25 @@ public: bool hasNdefMessage() { + if (isValid()) { + QDBusPendingReply reply = m_tagInterface->GetProperties(); + reply.waitForFinished(); + if (reply.isError()) + return false; + + const QDBusArgument &recordPaths = qvariant_cast(reply.value().value(QStringLiteral("Records"))); + + recordPaths.beginArray(); + while (!recordPaths.atEnd()) { + QDBusObjectPath path; + recordPaths >> path; + if (!path.path().isEmpty()) { + recordPaths.endArray(); + return true; + } + } + recordPaths.endArray(); + } return false; } @@ -182,9 +201,62 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) { - Q_UNUSED(messages); - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); + if (messages.isEmpty() || messages.first().isEmpty()) { + qCWarning(QT_NFC_NEARD) << "No record specified"; + //TODO + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + if (messages.count() > 1 || messages.first().count() > 1) { + // neard only supports one ndef record per tag + qCWarning(QT_NFC_NEARD) << "Writing of only one NDEF record and message is supported"; + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + QNdefRecord record = messages.first().first(); + + QDBusPendingReply<> reply; + if (record.typeNameFormat() == QNdefRecord::NfcRtd) { + QVariantMap recordProperties; + if (record.isRecordType()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("URI")); + QNdefNfcUriRecord uriRecord = static_cast(record); + recordProperties.insert(QStringLiteral("URI"), uriRecord.uri().path()); + } else if (record.isRecordType()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("SmartPoster")); + QNdefNfcSmartPosterRecord spRecord = static_cast(record); + recordProperties.insert(QStringLiteral("URI"), spRecord.uri().path()); + // Currently neard only supports the uri property for writing + } else if (record.isRecordType()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("Text")); + QNdefNfcTextRecord textRecord = static_cast(record); + recordProperties.insert(QStringLiteral("Representation"), textRecord.text()); + recordProperties.insert(QStringLiteral("Encoding"), + textRecord.encoding() == QNdefNfcTextRecord::Utf8 ? + QStringLiteral("UTF-8") : QStringLiteral("UTF-16") ); + recordProperties.insert(QStringLiteral("Language"), textRecord.locale()); + } else { + qCWarning(QT_NFC_NEARD) << "Record type not supported for writing"; + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + reply = m_tagInterface->Write(recordProperties); + } + + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + emit QNearFieldTarget::ndefMessagesWritten(); + + QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, requestId)); + return requestId; } private: -- cgit v1.2.3 From 6a069e14f50fb0e553405547d6b5123ea72854d1 Mon Sep 17 00:00:00 2001 From: Martin Leutelt Date: Thu, 11 Sep 2014 15:25:48 +0200 Subject: Neard: porting to neard v0.14 The dbus interfaces have been adapted to the state of neard v0.14. Reading from the supported tags works, writing to them works to a limited extent. Change-Id: Ib0704c6d951baa31ad58484e0c11534aaad359be Reviewed-by: Alex Blasche --- src/nfc/neard/adapter.cpp | 7 +- src/nfc/neard/adapter_p.h | 28 +-- src/nfc/neard/agent.cpp | 38 ++++ src/nfc/neard/agent_p.h | 100 +++++++++ src/nfc/neard/dbusobjectmanager.cpp | 26 +++ src/nfc/neard/dbusobjectmanager_p.h | 58 +++++ src/nfc/neard/dbusproperties.cpp | 26 +++ src/nfc/neard/dbusproperties_p.h | 71 ++++++ src/nfc/neard/manager.cpp | 7 +- src/nfc/neard/manager_p.h | 28 +-- src/nfc/neard/neard.pri | 25 ++- src/nfc/neard/neard_helper.cpp | 108 +++++++++ src/nfc/neard/neard_helper_p.h | 84 +++++++ .../neard/org.freedesktop.dbus.objectmanager.xml | 19 ++ src/nfc/neard/org.freedesktop.dbus.properties.xml | 27 +++ src/nfc/neard/org.neard.Adapter.xml | 33 +-- src/nfc/neard/org.neard.Agent.xml | 26 +++ src/nfc/neard/org.neard.Manager.xml | 73 +++--- src/nfc/neard/org.neard.Record.xml | 10 - src/nfc/neard/org.neard.Tag.xml | 27 +-- src/nfc/neard/record.cpp | 26 --- src/nfc/neard/record_p.h | 53 ----- src/nfc/neard/tag.cpp | 5 +- src/nfc/neard/tag_p.h | 22 +- src/nfc/qnearfieldmanager_neard.cpp | 248 ++++++++++----------- src/nfc/qnearfieldmanager_neard_p.h | 12 +- src/nfc/qnearfieldtarget.cpp | 1 + src/nfc/qnearfieldtarget_neard_p.h | 207 ++++++++++------- 28 files changed, 948 insertions(+), 447 deletions(-) create mode 100644 src/nfc/neard/agent.cpp create mode 100644 src/nfc/neard/agent_p.h create mode 100644 src/nfc/neard/dbusobjectmanager.cpp create mode 100644 src/nfc/neard/dbusobjectmanager_p.h create mode 100644 src/nfc/neard/dbusproperties.cpp create mode 100644 src/nfc/neard/dbusproperties_p.h create mode 100644 src/nfc/neard/neard_helper.cpp create mode 100644 src/nfc/neard/neard_helper_p.h create mode 100644 src/nfc/neard/org.freedesktop.dbus.objectmanager.xml create mode 100644 src/nfc/neard/org.freedesktop.dbus.properties.xml create mode 100644 src/nfc/neard/org.neard.Agent.xml delete mode 100644 src/nfc/neard/org.neard.Record.xml delete mode 100644 src/nfc/neard/record.cpp delete mode 100644 src/nfc/neard/record_p.h diff --git a/src/nfc/neard/adapter.cpp b/src/nfc/neard/adapter.cpp index e2129ec4..4663db42 100644 --- a/src/nfc/neard/adapter.cpp +++ b/src/nfc/neard/adapter.cpp @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter -v + * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ -#include "adapter_p.h" // HAND-EDIT +#include "adapter_p.h" /* * Implementation of interface class OrgNeardAdapterInterface @@ -23,4 +23,3 @@ OrgNeardAdapterInterface::OrgNeardAdapterInterface(const QString &service, const OrgNeardAdapterInterface::~OrgNeardAdapterInterface() { } - diff --git a/src/nfc/neard/adapter_p.h b/src/nfc/neard/adapter_p.h index 0539b3b4..4e0d2771 100644 --- a/src/nfc/neard/adapter_p.h +++ b/src/nfc/neard/adapter_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter -v + * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef ADAPTER_H_1403168174 -#define ADAPTER_H_1403168174 +#ifndef ADAPTER_P_H_1410940487 +#define ADAPTER_P_H_1410940487 #include #include @@ -36,36 +36,20 @@ public: ~OrgNeardAdapterInterface(); public Q_SLOTS: // METHODS - inline QDBusPendingReply GetProperties() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); - } - - inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) - { - QList argumentList; - argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); - return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); - } - inline QDBusPendingReply<> StartPollLoop(const QString &name) { QList argumentList; argumentList << QVariant::fromValue(name); - return asyncCallWithArgumentList(QLatin1String("StartPollLoop"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("StartPollLoop"), argumentList); } inline QDBusPendingReply<> StopPollLoop() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("StopPollLoop"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("StopPollLoop"), argumentList); } Q_SIGNALS: // SIGNALS - void PropertyChanged(const QString &name, const QDBusVariant &value); - void TagFound(const QDBusObjectPath &address); - void TagLost(const QDBusObjectPath &address); }; namespace org { diff --git a/src/nfc/neard/agent.cpp b/src/nfc/neard/agent.cpp new file mode 100644 index 00000000..f969d8d3 --- /dev/null +++ b/src/nfc/neard/agent.cpp @@ -0,0 +1,38 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Agent.xml -p agent_p -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "agent_p.h" + +/* + * Implementation of interface class OrgNeardHandoverAgentInterface + */ + +OrgNeardHandoverAgentInterface::OrgNeardHandoverAgentInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardHandoverAgentInterface::~OrgNeardHandoverAgentInterface() +{ +} + +/* + * Implementation of interface class OrgNeardNDEFAgentInterface + */ + +OrgNeardNDEFAgentInterface::OrgNeardNDEFAgentInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgNeardNDEFAgentInterface::~OrgNeardNDEFAgentInterface() +{ +} diff --git a/src/nfc/neard/agent_p.h b/src/nfc/neard/agent_p.h new file mode 100644 index 00000000..9f5199aa --- /dev/null +++ b/src/nfc/neard/agent_p.h @@ -0,0 +1,100 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.neard.Agent.xml -p agent_p -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef AGENT_P_H_1410442485 +#define AGENT_P_H_1410442485 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.neard.HandoverAgent + */ +class OrgNeardHandoverAgentInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.HandoverAgent"; } + +public: + OrgNeardHandoverAgentInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardHandoverAgentInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> PushOOB(const QVariantMap &values) + { + QList argumentList; + argumentList << QVariant::fromValue(values); + return asyncCallWithArgumentList(QStringLiteral("PushOOB"), argumentList); + } + + inline QDBusPendingReply<> Release() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Release"), argumentList); + } + + inline QDBusPendingReply RequestOOB(const QVariantMap &values) + { + QList argumentList; + argumentList << QVariant::fromValue(values); + return asyncCallWithArgumentList(QStringLiteral("RequestOOB"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +/* + * Proxy class for interface org.neard.NDEFAgent + */ +class OrgNeardNDEFAgentInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.neard.NDEFAgent"; } + +public: + OrgNeardNDEFAgentInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgNeardNDEFAgentInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply<> GetNDEF(const QVariantMap &values) + { + QList argumentList; + argumentList << QVariant::fromValue(values); + return asyncCallWithArgumentList(QStringLiteral("GetNDEF"), argumentList); + } + + inline QDBusPendingReply<> Release() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("Release"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace org { + namespace neard { + typedef ::OrgNeardHandoverAgentInterface HandoverAgent; + typedef ::OrgNeardNDEFAgentInterface NDEFAgent; + } +} +#endif diff --git a/src/nfc/neard/dbusobjectmanager.cpp b/src/nfc/neard/dbusobjectmanager.cpp new file mode 100644 index 00000000..4f17db05 --- /dev/null +++ b/src/nfc/neard/dbusobjectmanager.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v dbus-object-manager.xml -p dbusobjectmanager -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusobjectmanager_p.h" + +/* + * Implementation of interface class OrgFreedesktopDBusObjectManagerInterface + */ + +OrgFreedesktopDBusObjectManagerInterface::OrgFreedesktopDBusObjectManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgFreedesktopDBusObjectManagerInterface::~OrgFreedesktopDBusObjectManagerInterface() +{ +} + diff --git a/src/nfc/neard/dbusobjectmanager_p.h b/src/nfc/neard/dbusobjectmanager_p.h new file mode 100644 index 00000000..b61a438f --- /dev/null +++ b/src/nfc/neard/dbusobjectmanager_p.h @@ -0,0 +1,58 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v -i neard_helper_p.h org.freedesktop.dbus.objectmanager.xml -p dbusobjectmanager_p -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSOBJECTMANAGER_H_1409928664 +#define DBUSOBJECTMANAGER_H_1409928664 + +#include +#include +#include +#include +#include +#include +#include +#include +#include "neard_helper_p.h" + +/* + * Proxy class for interface org.freedesktop.DBus.ObjectManager + */ +class OrgFreedesktopDBusObjectManagerInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.freedesktop.DBus.ObjectManager"; } + +public: + OrgFreedesktopDBusObjectManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgFreedesktopDBusObjectManagerInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply GetManagedObjects() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("GetManagedObjects"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void InterfacesAdded(const QDBusObjectPath &object, InterfaceList interfaces); + void InterfacesRemoved(const QDBusObjectPath &object, const QStringList &interfaces); +}; + +namespace org { + namespace freedesktop { + namespace DBus { + typedef ::OrgFreedesktopDBusObjectManagerInterface ObjectManager; + } + } +} +#endif diff --git a/src/nfc/neard/dbusproperties.cpp b/src/nfc/neard/dbusproperties.cpp new file mode 100644 index 00000000..4ec3226b --- /dev/null +++ b/src/nfc/neard/dbusproperties.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v dbus-properties.xml -p dbusproperties -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusproperties_p.h" // HAND_EDIT + +/* + * Implementation of interface class OrgFreedesktopDBusPropertiesInterface + */ + +OrgFreedesktopDBusPropertiesInterface::OrgFreedesktopDBusPropertiesInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgFreedesktopDBusPropertiesInterface::~OrgFreedesktopDBusPropertiesInterface() +{ +} + diff --git a/src/nfc/neard/dbusproperties_p.h b/src/nfc/neard/dbusproperties_p.h new file mode 100644 index 00000000..dbc13fa5 --- /dev/null +++ b/src/nfc/neard/dbusproperties_p.h @@ -0,0 +1,71 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -v org.freedesktop.dbus.properties.xml -p dbusproperties_p -v + * + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSPROPERTIES_H_1409915780 +#define DBUSPROPERTIES_H_1409915780 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.freedesktop.DBus.Properties + */ +class OrgFreedesktopDBusPropertiesInterface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.freedesktop.DBus.Properties"; } + +public: + OrgFreedesktopDBusPropertiesInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + + ~OrgFreedesktopDBusPropertiesInterface(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply Get(const QString &interface, const QString &name) + { + QList argumentList; + argumentList << QVariant::fromValue(interface) << QVariant::fromValue(name); + return asyncCallWithArgumentList(QStringLiteral("Get"), argumentList); + } + + inline QDBusPendingReply GetAll(const QString &interface) + { + QList argumentList; + argumentList << QVariant::fromValue(interface); + return asyncCallWithArgumentList(QStringLiteral("GetAll"), argumentList); + } + + inline QDBusPendingReply<> Set(const QString &interface, const QString &name, const QDBusVariant &value) + { + QList argumentList; + argumentList << QVariant::fromValue(interface) << QVariant::fromValue(name) << QVariant::fromValue(value); + return asyncCallWithArgumentList(QStringLiteral("Set"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void PropertiesChanged(const QString &interface, const QVariantMap &changed_properties, const QStringList &invalidated_properties); +}; + +namespace org { + namespace freedesktop { + namespace DBus { + typedef ::OrgFreedesktopDBusPropertiesInterface Properties; + } + } +} +#endif diff --git a/src/nfc/neard/manager.cpp b/src/nfc/neard/manager.cpp index 97c7075c..176e09e4 100644 --- a/src/nfc/neard/manager.cpp +++ b/src/nfc/neard/manager.cpp @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager -v + * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ -#include "manager_p.h" // HAND-EDIT +#include "manager_p.h" /* * Implementation of interface class OrgNeardManagerInterface @@ -23,4 +23,3 @@ OrgNeardManagerInterface::OrgNeardManagerInterface(const QString &service, const OrgNeardManagerInterface::~OrgNeardManagerInterface() { } - diff --git a/src/nfc/neard/manager_p.h b/src/nfc/neard/manager_p.h index 86b8966f..313f47f4 100644 --- a/src/nfc/neard/manager_p.h +++ b/src/nfc/neard/manager_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager -v + * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef MANAGER_H_1403168371 -#define MANAGER_H_1403168371 +#ifndef MANAGER_P_H_1410442485 +#define MANAGER_P_H_1410442485 #include #include @@ -39,42 +39,42 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply GetProperties() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); } - inline QDBusPendingReply<> RegisterHandoverAgent(const QDBusObjectPath &path, const QString &type) + inline QDBusPendingReply<> RegisterHandoverAgent(const QDBusObjectPath &path) { QList argumentList; - argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); - return asyncCallWithArgumentList(QLatin1String("RegisterHandoverAgent"), argumentList); + argumentList << QVariant::fromValue(path); + return asyncCallWithArgumentList(QStringLiteral("RegisterHandoverAgent"), argumentList); } inline QDBusPendingReply<> RegisterNDEFAgent(const QDBusObjectPath &path, const QString &type) { QList argumentList; argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); - return asyncCallWithArgumentList(QLatin1String("RegisterNDEFAgent"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("RegisterNDEFAgent"), argumentList); } inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) { QList argumentList; argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); - return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("SetProperty"), argumentList); } - inline QDBusPendingReply<> UnregisterHandoverAgent(const QDBusObjectPath &path, const QString &type) + inline QDBusPendingReply<> UnregisterHandoverAgent(const QDBusObjectPath &path) { QList argumentList; - argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); - return asyncCallWithArgumentList(QLatin1String("UnregisterHandoverAgent"), argumentList); + argumentList << QVariant::fromValue(path); + return asyncCallWithArgumentList(QStringLiteral("UnregisterHandoverAgent"), argumentList); } inline QDBusPendingReply<> UnregisterNDEFAgent(const QDBusObjectPath &path, const QString &type) { QList argumentList; argumentList << QVariant::fromValue(path) << QVariant::fromValue(type); - return asyncCallWithArgumentList(QLatin1String("UnregisterNDEFAgent"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("UnregisterNDEFAgent"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/nfc/neard/neard.pri b/src/nfc/neard/neard.pri index 7aade77f..8120a784 100644 --- a/src/nfc/neard/neard.pri +++ b/src/nfc/neard/neard.pri @@ -1,9 +1,22 @@ HEADERS += neard/adapter_p.h \ - neard/manager_p.h \ - neard/tag_p.h \ - neard/record_p.h + neard/manager_p.h \ + neard/tag_p.h \ + neard/agent_p.h \ + neard/dbusproperties_p.h \ + neard/dbusobjectmanager_p.h \ + neard/neard_helper_p.h SOURCES += neard/adapter.cpp \ - neard/manager.cpp \ - neard/tag.cpp \ - neard/record.cpp + neard/manager.cpp \ + neard/tag.cpp \ + neard/agent.cpp \ + neard/dbusproperties.cpp \ + neard/dbusobjectmanager.cpp \ + neard/neard_helper.cpp + +OTHER_FILES += neard/org.freedesktop.dbus.objectmanager.xml \ + neard/org.freedesktop.dbus.properties.xml \ + neard/org.neard.Adapter.xml \ + neard/org.neard.Agent.xml \ + neard/org.neard.Manager.xml \ + neard/org.neard.Tag.xml diff --git a/src/nfc/neard/neard_helper.cpp b/src/nfc/neard/neard_helper.cpp new file mode 100644 index 00000000..a04e97bc --- /dev/null +++ b/src/nfc/neard/neard_helper.cpp @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 BasysKom GmbH. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include "neard_helper_p.h" +#include "dbusobjectmanager_p.h" + +QT_BEGIN_NAMESPACE + +Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) +Q_GLOBAL_STATIC(NeardHelper, neardHelper) + +NeardHelper::NeardHelper(QObject *parent) : + QObject(parent) +{ + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + + m_dbusObjectManager = new OrgFreedesktopDBusObjectManagerInterface(QStringLiteral("org.neard"), + QStringLiteral("/"), + QDBusConnection::systemBus(), + this); + if (!m_dbusObjectManager->isValid()) { + qCCritical(QT_NFC_NEARD) << "dbus object manager invalid"; + return; + } + + connect(m_dbusObjectManager, SIGNAL(InterfacesAdded(QDBusObjectPath,InterfaceList)), + this, SLOT(interfacesAdded(QDBusObjectPath,InterfaceList))); + connect(m_dbusObjectManager, SIGNAL(InterfacesRemoved(QDBusObjectPath,QStringList)), + this, SLOT(interfacesRemoved(QDBusObjectPath,QStringList))); +} + +NeardHelper *NeardHelper::instance() +{ + return neardHelper(); +} + +OrgFreedesktopDBusObjectManagerInterface *NeardHelper::dbusObjectManager() +{ + return m_dbusObjectManager; +} + +void NeardHelper::interfacesAdded(const QDBusObjectPath &path, InterfaceList interfaceList) +{ + foreach (const QString &key, interfaceList.keys()) { + if (key == QStringLiteral("org.neard.Tag")) { + emit tagFound(path); + break; + } + if (key == QStringLiteral("org.neard.Record")) { + emit recordFound(path); + break; + } + } +} + +void NeardHelper::interfacesRemoved(const QDBusObjectPath &path, const QStringList &list) +{ + if (list.contains(QStringLiteral("org.neard.Record"))) { + qCDebug(QT_NFC_NEARD) << "record removed" << path.path(); + emit recordRemoved(path); + } else if (list.contains(QStringLiteral("org.neard.Tag"))) { + qCDebug(QT_NFC_NEARD) << "tag removed" << path.path(); + emit tagRemoved(path); + } +} + +QT_END_NAMESPACE diff --git a/src/nfc/neard/neard_helper_p.h b/src/nfc/neard/neard_helper_p.h new file mode 100644 index 00000000..0c8c1d21 --- /dev/null +++ b/src/nfc/neard/neard_helper_p.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 BasysKom GmbH. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNfc module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NEARD_HELPER_P_H +#define NEARD_HELPER_P_H + +#include +#include + +typedef QMap InterfaceList; +typedef QMap ManagedObjectList; + +Q_DECLARE_METATYPE(InterfaceList) +Q_DECLARE_METATYPE(ManagedObjectList) + +class OrgFreedesktopDBusObjectManagerInterface; + +QT_BEGIN_NAMESPACE + +class NeardHelper : public QObject +{ + Q_OBJECT +public: + NeardHelper(QObject* parent = 0); + static NeardHelper *instance(); + + OrgFreedesktopDBusObjectManagerInterface *dbusObjectManager(); + +signals: + void tagFound(const QDBusObjectPath&); + void tagRemoved(const QDBusObjectPath&); + void recordFound(const QDBusObjectPath&); + void recordRemoved(const QDBusObjectPath&); + +private slots: + void interfacesAdded(const QDBusObjectPath&, InterfaceList); + void interfacesRemoved(const QDBusObjectPath&, const QStringList&); + +private: + OrgFreedesktopDBusObjectManagerInterface *m_dbusObjectManager; +}; + +QT_END_NAMESPACE + +#endif // NEARD_HELPER_P_H diff --git a/src/nfc/neard/org.freedesktop.dbus.objectmanager.xml b/src/nfc/neard/org.freedesktop.dbus.objectmanager.xml new file mode 100644 index 00000000..ae16f410 --- /dev/null +++ b/src/nfc/neard/org.freedesktop.dbus.objectmanager.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/org.freedesktop.dbus.properties.xml b/src/nfc/neard/org.freedesktop.dbus.properties.xml new file mode 100644 index 00000000..1449d567 --- /dev/null +++ b/src/nfc/neard/org.freedesktop.dbus.properties.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/org.neard.Adapter.xml b/src/nfc/neard/org.neard.Adapter.xml index 0697b5cd..5f8c4cab 100644 --- a/src/nfc/neard/org.neard.Adapter.xml +++ b/src/nfc/neard/org.neard.Adapter.xml @@ -1,26 +1,11 @@ - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/src/nfc/neard/org.neard.Agent.xml b/src/nfc/neard/org.neard.Agent.xml new file mode 100644 index 00000000..5ec0e487 --- /dev/null +++ b/src/nfc/neard/org.neard.Agent.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/org.neard.Manager.xml b/src/nfc/neard/org.neard.Manager.xml index 068fc880..1ed92378 100644 --- a/src/nfc/neard/org.neard.Manager.xml +++ b/src/nfc/neard/org.neard.Manager.xml @@ -1,39 +1,38 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/nfc/neard/org.neard.Record.xml b/src/nfc/neard/org.neard.Record.xml deleted file mode 100644 index 39374d83..00000000 --- a/src/nfc/neard/org.neard.Record.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/src/nfc/neard/org.neard.Tag.xml b/src/nfc/neard/org.neard.Tag.xml index ce92dff6..d6cbaddd 100644 --- a/src/nfc/neard/org.neard.Tag.xml +++ b/src/nfc/neard/org.neard.Tag.xml @@ -1,22 +1,13 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/src/nfc/neard/record.cpp b/src/nfc/neard/record.cpp deleted file mode 100644 index 9b3fe93f..00000000 --- a/src/nfc/neard/record.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p record org.neard.Record.xml - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "record_p.h" - -/* - * Implementation of interface class OrgNeardRecordInterface - */ - -OrgNeardRecordInterface::OrgNeardRecordInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -OrgNeardRecordInterface::~OrgNeardRecordInterface() -{ -} - diff --git a/src/nfc/neard/record_p.h b/src/nfc/neard/record_p.h deleted file mode 100644 index 975b0cd5..00000000 --- a/src/nfc/neard/record_p.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p record org.neard.Record.xml - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef RECORD_H_1403789294 -#define RECORD_H_1403789294 - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Proxy class for interface org.neard.Record - */ -class OrgNeardRecordInterface: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.neard.Record"; } - -public: - OrgNeardRecordInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~OrgNeardRecordInterface(); - -public Q_SLOTS: // METHODS - inline QDBusPendingReply GetProperties() - { - QList argumentList; - return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); - } - -Q_SIGNALS: // SIGNALS -}; - -namespace org { - namespace neard { - typedef ::OrgNeardRecordInterface Record; - } -} -#endif diff --git a/src/nfc/neard/tag.cpp b/src/nfc/neard/tag.cpp index a0c4e1ef..7e34e110 100644 --- a/src/nfc/neard/tag.cpp +++ b/src/nfc/neard/tag.cpp @@ -1,8 +1,8 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag -v + * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments @@ -23,4 +23,3 @@ OrgNeardTagInterface::OrgNeardTagInterface(const QString &service, const QString OrgNeardTagInterface::~OrgNeardTagInterface() { } - diff --git a/src/nfc/neard/tag_p.h b/src/nfc/neard/tag_p.h index 65cfd9b4..07cce10d 100644 --- a/src/nfc/neard/tag_p.h +++ b/src/nfc/neard/tag_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag -v + * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag_p -v * - * qdbusxml2cpp is Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef TAG_H_1403696363 -#define TAG_H_1403696363 +#ifndef TAG_P_H_1410941369 +#define TAG_P_H_1410941369 #include #include @@ -36,28 +36,20 @@ public: ~OrgNeardTagInterface(); public Q_SLOTS: // METHODS - inline QDBusPendingReply GetProperties() + inline QDBusPendingReply GetRawNDEF() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); - } - - inline QDBusPendingReply<> SetProperty(const QString &name, const QDBusVariant &value) - { - QList argumentList; - argumentList << QVariant::fromValue(name) << QVariant::fromValue(value); - return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetRawNDEF"), argumentList); } inline QDBusPendingReply<> Write(const QVariantMap &attributes) { QList argumentList; argumentList << QVariant::fromValue(attributes); - return asyncCallWithArgumentList(QLatin1String("Write"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Write"), argumentList); } Q_SIGNALS: // SIGNALS - void PropertyChanged(const QString &name, const QDBusVariant &value); }; namespace org { diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index faa3c9aa..b092728c 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -1,6 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Copyright (C) 2014 BasysKom GmbH. ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNfc module of the Qt Toolkit. @@ -42,8 +43,9 @@ #include "qnearfieldmanager_neard_p.h" #include "qnearfieldtarget_neard_p.h" -#include "neard/manager_p.h" #include "neard/adapter_p.h" +#include "neard/dbusproperties_p.h" +#include "neard/dbusobjectmanager_p.h" QT_BEGIN_NAMESPACE @@ -51,34 +53,42 @@ Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) // TODO We need a constructor that lets us select an adapter QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() - : QNearFieldManagerPrivate(), m_adapter(0), m_manager(0) + : QNearFieldManagerPrivate(), + m_adapter(0), + m_dbusProperties(0), + m_neardHelper(NeardHelper::instance()) { - m_manager = new OrgNeardManagerInterface(QStringLiteral("org.neard"), QStringLiteral("/"), - QDBusConnection::systemBus(), this); - if (!m_manager->isValid()) { - qCWarning(QT_NFC_NEARD) << "Could not connect to manager" << "Neard daemon running?"; - return; - } - - QDBusPendingReply reply = m_manager->GetProperties(); + QDBusPendingReply reply = m_neardHelper->dbusObjectManager()->GetManagedObjects(); reply.waitForFinished(); if (reply.isError()) { - qCWarning(QT_NFC_NEARD) << "Error getting manager properties."; + qCWarning(QT_NFC_NEARD) << "Error getting managed objects"; return; } - // Now we check if the adapter still exists (it might have been unplugged) - const QDBusArgument &paths = reply.value().value(QStringLiteral("Adapters")).value(); + bool found = false; + foreach (const QDBusObjectPath &path, reply.value().keys()) { + const InterfaceList ifaceList = reply.value().value(path); + foreach (const QString &iface, ifaceList.keys()) { + if (iface == QStringLiteral("org.neard.Adapter")) { + found = true; + m_adapterPath = path.path(); + qCDebug(QT_NFC_NEARD) << "org.neard.Adapter found for path" << m_adapterPath; + break; + } + } + + if (found) + break; + } - paths.beginArray(); - while (!paths.atEnd()) { - QDBusObjectPath path; - paths >> path; - // Select the first adapter - m_adapterPath = path.path(); - break; + if (!found) { + qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?"; + } else { + connect(m_neardHelper, SIGNAL(tagFound(QDBusObjectPath)), + this, SLOT(handleTagFound(QDBusObjectPath))); + connect(m_neardHelper, SIGNAL(tagRemoved(QDBusObjectPath)), + this, SLOT(handleTagRemoved(QDBusObjectPath))); } - paths.endArray(); } QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() @@ -88,89 +98,124 @@ QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() bool QNearFieldManagerPrivateImpl::isAvailable() const { - if (!m_manager->isValid() || m_adapterPath.isNull()) { + if (!m_neardHelper->dbusObjectManager()->isValid() || m_adapterPath.isNull()) { + qCWarning(QT_NFC_NEARD) << "dbus object manager invalid or adapter path invalid"; return false; } - QDBusPendingReply reply = m_manager->GetProperties(); + QDBusPendingReply reply = m_neardHelper->dbusObjectManager()->GetManagedObjects(); reply.waitForFinished(); if (reply.isError()) { - qCDebug(QT_NFC_NEARD) << "Error getting manager properties."; + qCWarning(QT_NFC_NEARD) << "error getting managed objects"; return false; } - // Now we check if the adapter still exists (it might have been unplugged) - const QDBusArgument &paths = reply.value().value(QStringLiteral("Adapters")).value(); - - paths.beginArray(); - while (!paths.atEnd()) { - QDBusObjectPath path; - paths >> path; - // Check if the adapter exists - if (path.path() == m_adapterPath) { - paths.endArray(); + foreach (const QDBusObjectPath &path, reply.value().keys()) { + if (m_adapterPath == path.path()) return true; - } } - paths.endArray(); + return false; } bool QNearFieldManagerPrivateImpl::startTargetDetection() { + qCDebug(QT_NFC_NEARD) << "starting target detection"; if (!isAvailable()) return false; - // TODO define behavior when target detection is started again - if (m_adapter) + if (!m_dbusProperties) { + m_dbusProperties = new OrgFreedesktopDBusPropertiesInterface(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus(), + this); + } + + if (!m_dbusProperties->isValid()) { + qCWarning(QT_NFC_NEARD) << "dbus property interface invalid"; return false; + } - //qDebug() << "Constructing interface with path" << m_adapterPath; - m_adapter = new OrgNeardAdapterInterface(QStringLiteral("org.neard"), m_adapterPath, - QDBusConnection::systemBus(), this); + // check if the adapter is currently polling + QDBusPendingReply replyPolling = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Polling")); + replyPolling.waitForFinished(); + if (!replyPolling.isError()) { + if (replyPolling.value().variant().toBool()) { + qCDebug(QT_NFC_NEARD) << "adapter is already polling"; + return true; + } + } else { + qCWarning(QT_NFC_NEARD) << "error getting 'Polling' state from property interface"; + return false; + } - { - QDBusPendingReply reply = m_adapter->GetProperties(); - reply.waitForFinished(); - if (!reply.isError()) { - if (reply.value().value(QStringLiteral("Polling")) == true) { - //qDebug() << "Adapter" << m_adapterPath << "is busy"; - return false; // Should we return false or true? + // check if the adapter it powered + QDBusPendingReply replyPowered = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Powered")); + replyPowered.waitForFinished(); + if (!replyPowered.isError()) { + if (replyPowered.value().variant().toBool()) { + qCDebug(QT_NFC_NEARD) << "adapter is already powered"; + } else { + QDBusPendingReply replyTryPowering = m_dbusProperties->Set(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Powered"), + QDBusVariant(true)); + replyTryPowering.waitForFinished(); + if (!replyTryPowering.isError()) { + qCDebug(QT_NFC_NEARD) << "powering adapter"; } } + } else { + qCWarning(QT_NFC_NEARD) << "error getting 'Powered' state from property interface"; + return false; } - // Switch on the NFC adapter if it is not already - QDBusPendingReply<> reply = m_adapter->SetProperty(QStringLiteral("Powered"), QDBusVariant(true)); - reply.waitForFinished(); + // create adapter and start poll loop + if (!m_adapter) { + m_adapter = new OrgNeardAdapterInterface(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus(), + this); + } - //qDebug() << (reply.isError() ? "Error setting up adapter" : "Adapter powered on"); - reply = m_adapter->StartPollLoop(QStringLiteral("Dual")); - reply.waitForFinished(); - //qDebug() << (reply.isError() ? "Error when starting polling" : "Successfully started to poll"); + // possible modes: "Target", "Initiator", "Dual" + QDBusPendingReply<> replyPollLoop = m_adapter->StartPollLoop(QStringLiteral("Dual")); + replyPollLoop.waitForFinished(); + if (replyPollLoop.isError()) { + qCWarning(QT_NFC_NEARD) << "error when starting polling"; + return false; + } else { + qCDebug(QT_NFC_NEARD) << "successfully started polling"; + } - // TagFound and TagLost DBus signals don't work -// connect(m_adapter, SIGNAL(TagFound(const QDBusObjectPath&)), -// this, SLOT(tagFound(const QDBusObjectPath&))); -// connect(m_adapter, SIGNAL(TagLost(const QDBusObjectPath&)), -// this, SLOT(tagFound(const QDBusObjectPath&))); - connect(m_adapter, SIGNAL(PropertyChanged(QString,QDBusVariant)), - this, SLOT(propertyChanged(QString,QDBusVariant))); return true; } void QNearFieldManagerPrivateImpl::stopTargetDetection() { + qCDebug(QT_NFC_NEARD) << "stopping target detection"; if (!isAvailable()) return; - QDBusPendingReply<> reply = m_adapter->StopPollLoop(); - reply.waitForFinished(); - // TODO Should we really power down the adapter? - reply = m_adapter->SetProperty(QStringLiteral("Powered"), QDBusVariant(false)); - reply.waitForFinished(); - delete m_adapter; - m_adapter = 0; + // check if the adapter is currently polling + QDBusPendingReply replyPolling = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Polling")); + replyPolling.waitForFinished(); + if (!replyPolling.isError()) { + if (replyPolling.value().variant().toBool()) { + QDBusPendingReply<> replyStopPolling = m_adapter->StopPollLoop(); + replyStopPolling.waitForFinished(); + if (replyStopPolling.isError()) + qCWarning(QT_NFC_NEARD) << "error when stopping polling"; + else + qCDebug(QT_NFC_NEARD) << "successfully stopped polling"; + } else { + qCDebug(QT_NFC_NEARD) << "already stopped polling"; + } + } else { + qCWarning(QT_NFC_NEARD) << "error getting 'Polling' state from property interface"; + } } int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(QObject *object, const QMetaMethod &method) @@ -204,66 +249,21 @@ void QNearFieldManagerPrivateImpl::releaseAccess(QNearFieldManager::TargetAccess Q_UNUSED(accessModes); } -void QNearFieldManagerPrivateImpl::tagFound(const QDBusObjectPath &path) +void QNearFieldManagerPrivateImpl::handleTagFound(const QDBusObjectPath &path) { - qCDebug(QT_NFC_NEARD) << "Tag found" << path.path(); + NearFieldTarget *nfTag = new NearFieldTarget(this, path); + m_activeTags.insert(path.path(), nfTag); + emit targetDetected(nfTag); } -void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVariant value) +void QNearFieldManagerPrivateImpl::handleTagRemoved(const QDBusObjectPath &path) { - qCDebug(QT_NFC_NEARD) << "Property changed" << property; - // New device detected - if (property == QStringLiteral("Devices")) { - const QDBusArgument &devices = value.variant().value(); - QStringList devicesList; - devices.beginArray(); - while (!devices.atEnd()) { - QDBusObjectPath path; - devices >> path; - devicesList.append(path.path()); - qCDebug(QT_NFC_NEARD) << "New device" << devicesList; - } - devices.endArray(); - qDebug() << "Devices list changed" << devicesList; - } else if (property == QStringLiteral("Tags")) { - const QDBusArgument &tags = value.variant().value(); - QStringList tagList; - tags.beginArray(); - while (!tags.atEnd()) { - QDBusObjectPath path; - tags >> path; - tagList.append(path.path()); - - // If a tag is not in the tags list we detected a new tag - if (!m_activeTags.value(path.path())) { - NearFieldTarget *nfTag = - new NearFieldTarget(this, path); - connect(nfTag, SIGNAL(destroyed(QObject*)), this, SLOT(tagDeleted(QObject*))); - emit targetDetected(nfTag); - m_activeTags.insert(path.path(), nfTag); - } - } - //Look if a tag was lost - foreach (const QString &target, m_activeTags.keys()) { - if (!tagList.contains(target)) { - emit targetLost(m_activeTags.value(target)); - m_activeTags.remove(target); - } - } - - tags.endArray(); - qCDebug(QT_NFC_NEARD) << "Tag list changed" << tagList; + const QString adapterPath = path.path(); + if (m_activeTags.contains(adapterPath)) { + QNearFieldTarget *nfTag = m_activeTags.value(adapterPath); + m_activeTags.remove(adapterPath); + emit targetLost(nfTag); } } -void QNearFieldManagerPrivateImpl::tagDeleted(QObject *obj) -{ - if (obj == 0) - return; - - const QString key = m_activeTags.key(static_cast(obj)); - if (!key.isEmpty()) - m_activeTags.remove(key); -} - QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index a7433c8f..ee72595c 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -1,6 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Copyright (C) 2014 BasysKom GmbH. ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNfc module of the Qt Toolkit. @@ -45,6 +46,7 @@ #include "qnearfieldmanager_p.h" #include "qnearfieldmanager.h" #include "qnearfieldtarget.h" +#include "neard/neard_helper_p.h" #include #include @@ -52,6 +54,7 @@ class OrgNeardAdapterInterface; class OrgNeardManagerInterface; +class OrgFreedesktopDBusPropertiesInterface; QT_BEGIN_NAMESPACE @@ -69,6 +72,7 @@ public: void stopTargetDetection(); + // not implemented int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method); @@ -80,15 +84,15 @@ public: void releaseAccess(QNearFieldManager::TargetAccessModes accessModes); private Q_SLOTS: - void tagFound(const QDBusObjectPath&); - void propertyChanged(QString,QDBusVariant); - void tagDeleted(QObject*); + void handleTagFound(const QDBusObjectPath&); + void handleTagRemoved(const QDBusObjectPath&); private: QString m_adapterPath; OrgNeardAdapterInterface *m_adapter; - OrgNeardManagerInterface *m_manager; + OrgFreedesktopDBusPropertiesInterface *m_dbusProperties; QMap m_activeTags; + NeardHelper *m_neardHelper; }; QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp index c4f00d6d..8215718d 100644 --- a/src/nfc/qnearfieldtarget.cpp +++ b/src/nfc/qnearfieldtarget.cpp @@ -281,6 +281,7 @@ QNearFieldTarget::QNearFieldTarget(QObject *parent) { qRegisterMetaType("QNearFieldTarget::RequestId"); qRegisterMetaType("QNearFieldTarget::Error"); + qRegisterMetaType("QNdefMessage::QNdefMessage"); } /*! diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index cb489498..100456bf 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -1,6 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Copyright (C) 2014 BasysKom GmbH. ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNfc module of the Qt Toolkit. @@ -50,8 +51,10 @@ #include #include +#include "neard/neard_helper_p.h" +#include "neard/dbusproperties_p.h" +#include "neard/dbusobjectmanager_p.h" #include "neard/tag_p.h" -#include "neard/record_p.h" #include #include @@ -67,23 +70,27 @@ class NearFieldTarget : public T public: NearFieldTarget(QObject *parent, QDBusObjectPath interfacePath) - : T(parent) + : T(parent), + m_tagPath(interfacePath), + m_readRequested(false) { - m_tagInterface = new OrgNeardTagInterface(QStringLiteral("org.neard"), - interfacePath.path(), - QDBusConnection::systemBus(), this); - - if (!isValid()) { - qCWarning(QT_NFC_NEARD) << "Could not connect to org.neard.Tag dbus interface" - << interfacePath.path(); + m_readErrorTimer.setSingleShot(true); + m_recordPathsCollectedTimer.setSingleShot(true); + + qCDebug(QT_NFC_NEARD) << "tag found at path" << interfacePath.path(); + m_dbusProperties = new OrgFreedesktopDBusPropertiesInterface(QStringLiteral("org.neard"), + interfacePath.path(), + QDBusConnection::systemBus(), + this); + if (!m_dbusProperties->isValid()) { + qCWarning(QT_NFC_NEARD) << "Could not connect to dbus property interface at path" << interfacePath.path(); return; } - QDBusPendingReply reply = m_tagInterface->GetProperties(); + QDBusPendingReply reply = m_dbusProperties->GetAll(QStringLiteral("org.neard.Tag")); reply.waitForFinished(); if (reply.isError()) { - qCWarning(QT_NFC_NEARD) << "Could not get properties of org.neard.Tag dbus interface" - << interfacePath.path(); + qCWarning(QT_NFC_NEARD) << "Could not get properties of org.neard.Tag dbus interface"; return; } @@ -99,7 +106,14 @@ public: else if (type == QStringLiteral("Type 4")) m_type = QNearFieldTarget::NfcTagType4; - qCDebug(QT_NFC_NEARD) << "Type" << type << m_type; + qCDebug(QT_NFC_NEARD) << "tag type" << type; + + QObject::connect(&m_recordPathsCollectedTimer, &QTimer::timeout, + this, &NearFieldTarget::createNdefMessage); + QObject::connect(&m_readErrorTimer, &QTimer::timeout, + this, &NearFieldTarget::handleReadError); + QObject::connect(NeardHelper::instance(), &NeardHelper::recordFound, + this, &NearFieldTarget::handleRecordFound); } ~NearFieldTarget() @@ -108,7 +122,7 @@ public: bool isValid() { - return m_tagInterface->isValid(); + return m_dbusProperties->isValid() && NeardHelper::instance()->dbusObjectManager()->isValid(); } QByteArray uid() const @@ -124,63 +138,37 @@ public: QNearFieldTarget::AccessMethods accessMethods() const { - QNearFieldTarget::AccessMethods result = QNearFieldTarget::NdefAccess; - return result; + return QNearFieldTarget::NdefAccess; } bool hasNdefMessage() { - if (isValid()) { - QDBusPendingReply reply = m_tagInterface->GetProperties(); - reply.waitForFinished(); - if (reply.isError()) - return false; - - const QDBusArgument &recordPaths = qvariant_cast(reply.value().value(QStringLiteral("Records"))); - - recordPaths.beginArray(); - while (!recordPaths.atEnd()) { - QDBusObjectPath path; - recordPaths >> path; - if (!path.path().isEmpty()) { - recordPaths.endArray(); - return true; - } - } - recordPaths.endArray(); - } - return false; + return !m_recordPaths.isEmpty(); } QNearFieldTarget::RequestId readNdefMessages() { if (isValid()) { - QDBusPendingReply reply = m_tagInterface->GetProperties(); - reply.waitForFinished(); - if (reply.isError()) { - emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); - } - - const QDBusArgument &recordPaths = qvariant_cast(reply.value().value(QStringLiteral("Records"))); - - QNdefMessage newNdefMessage; - recordPaths.beginArray(); - while (!recordPaths.atEnd()) { - QDBusObjectPath path; - recordPaths >> path; - newNdefMessage.append(readRecord(path)); - } - recordPaths.endArray(); - - emit QNearFieldTarget::ndefMessageRead(newNdefMessage); + // if the user calls readNdefMessages before the previous request has been completed + // return the current request id. + if (m_currentRequestId.isValid()) + return m_currentRequestId; QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId, requestId)); + // save the id so it can be passed along with requestCompleted + m_currentRequestId = requestId; + // since the triggering of interfaceAdded will ultimately lead to createNdefMessage being called + // we need to make sure that ndefMessagesRead will only be triggered when readNdefMessages has + // been called before. In case readNdefMessages is called again after that we can directly call + // call createNdefMessage. + m_readRequested = true; + if (hasNdefMessage()) + createNdefMessage(); + else + m_readErrorTimer.start(1000); + return requestId; } else { - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } } @@ -188,34 +176,29 @@ public: QNearFieldTarget::RequestId sendCommand(const QByteArray &command) { Q_UNUSED(command); - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } QNearFieldTarget::RequestId sendCommands(const QList &commands) { Q_UNUSED(commands); - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) { + qCDebug(QT_NFC_NEARD) << "writing messages"; if (messages.isEmpty() || messages.first().isEmpty()) { qCWarning(QT_NFC_NEARD) << "No record specified"; - //TODO - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } if (messages.count() > 1 || messages.first().count() > 1) { // neard only supports one ndef record per tag qCWarning(QT_NFC_NEARD) << "Writing of only one NDEF record and message is supported"; - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } QNdefRecord record = messages.first().first(); - QDBusPendingReply<> reply; if (record.typeNameFormat() == QNdefRecord::NfcRtd) { QVariantMap recordProperties; if (record.isRecordType()) { @@ -237,38 +220,46 @@ public: recordProperties.insert(QStringLiteral("Language"), textRecord.locale()); } else { qCWarning(QT_NFC_NEARD) << "Record type not supported for writing"; - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } - reply = m_tagInterface->Write(recordProperties); - } + OrgNeardTagInterface tagInterface(QStringLiteral("org.neard"), + m_tagPath.path(), + QDBusConnection::systemBus()); + if (!tagInterface.isValid()) { + qCWarning(QT_NFC_NEARD) << "tag interface invalid"; + } else { + QDBusPendingReply<> reply; + reply = tagInterface.Write(recordProperties); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); + return QNearFieldTarget::RequestId(); + } - reply.waitForFinished(); - if (reply.isError()) { - qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); - emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); - } + QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); - emit QNearFieldTarget::ndefMessagesWritten(); + QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, requestId)); + return requestId; + } + } - QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId, requestId)); - return requestId; + return QNearFieldTarget::RequestId(); } private: QNdefRecord readRecord(const QDBusObjectPath &path) { - OrgNeardRecordInterface recordInterface(QStringLiteral("org.neard"), - path.path(), - QDBusConnection::systemBus()); + qCDebug(QT_NFC_NEARD) << "reading record for path" << path.path(); + OrgFreedesktopDBusPropertiesInterface recordInterface(QStringLiteral("org.neard"), + path.path(), + QDBusConnection::systemBus()); if (!recordInterface.isValid()) return QNdefRecord(); - QDBusPendingReply reply = recordInterface.GetProperties(); + QDBusPendingReply reply = recordInterface.GetAll(QStringLiteral("org.neard.Record")); reply.waitForFinished(); if (reply.isError()) return QNdefRecord(); @@ -322,9 +313,59 @@ private: return QNdefRecord(); } + void handleRecordFound(const QDBusObjectPath &path) + { + m_recordPaths.append(path); + // FIXME: this timer only exists because neard doesn't currently supply enough + // information to let us know when all record interfaces have been added or + // how many records are actually contained on a tag. We assume that when no + // signal has been received for 100ms all record interfaces have been added. + m_recordPathsCollectedTimer.start(100); + // as soon as record paths have been added we can handle errors without the timer. + m_readErrorTimer.stop(); + } + + void createNdefMessage() + { + if (m_readRequested) { + qCDebug(QT_NFC_NEARD) << "creating Ndef message, reading" << m_recordPaths.length() << "record paths"; + QNdefMessage newNdefMessage; + foreach (const QDBusObjectPath &recordPath, m_recordPaths) + newNdefMessage.append(readRecord(recordPath)); + + if (!newNdefMessage.isEmpty()) { + QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, + Q_ARG(const QNdefMessage, newNdefMessage)); + // the request id in requestCompleted has to match the one created in readNdefMessages + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, m_currentRequestId)); + } else { + QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::Error, QNearFieldTarget::UnknownError), + Q_ARG(const QNearFieldTarget::RequestId, m_currentRequestId)); + } + + m_readRequested = false; + // invalidate the current request id + m_currentRequestId = QNearFieldTarget::RequestId(0); + } + } + + void handleReadError() + { + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, m_currentRequestId); + m_currentRequestId = QNearFieldTarget::RequestId(0); + } + protected: - OrgNeardTagInterface *m_tagInterface; + QDBusObjectPath m_tagPath; + OrgFreedesktopDBusPropertiesInterface *m_dbusProperties; + QList m_recordPaths; + QTimer m_recordPathsCollectedTimer; + QTimer m_readErrorTimer; QNearFieldTarget::Type m_type; + bool m_readRequested; + QNearFieldTarget::RequestId m_currentRequestId; }; QT_END_NAMESPACE -- cgit v1.2.3 From f258fbbaf2b14ad0af60ce3f74cd2ce26a139689 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Oct 2014 15:21:56 +0200 Subject: QNearFieldManager::registerNdefMessageHandler returns -1 on error This brings it in line with another function overload. Change-Id: I9120f755790e60b5073024133955c2b10671308f Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager_neard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index b092728c..41331a23 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -222,7 +222,7 @@ int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(QObject *object, co { Q_UNUSED(object); Q_UNUSED(method); - return 0; + return -1; } int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method) -- cgit v1.2.3 From a00a35e6e6410af797c1b8d0f220523fcee6a6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lutz=20Sch=C3=B6nemann?= Date: Wed, 8 Oct 2014 14:05:33 +0200 Subject: Fixing crash when stopping poll loop When stopping the neard adapter poll loop without starting it from the same QNearFieldManagerPrivateImpl instance the m_adapter variable does not hold a valid pointer to an instance of OrgNeardAdapterInterface. This patch fixes that issue by creating a temporary instance on the stack to call the appropriate function on the D-Bus interface. Change-Id: I42ced8d00ca9f87756c8f3f81ca78969702344c1 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager_neard.cpp | 58 ++++++++++++++++++++----------------- src/nfc/qnearfieldmanager_neard_p.h | 4 --- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index 41331a23..65cf0ee3 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -54,8 +54,6 @@ Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) // TODO We need a constructor that lets us select an adapter QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() : QNearFieldManagerPrivate(), - m_adapter(0), - m_dbusProperties(0), m_neardHelper(NeardHelper::instance()) { QDBusPendingReply reply = m_neardHelper->dbusObjectManager()->GetManagedObjects(); @@ -124,21 +122,18 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection() if (!isAvailable()) return false; - if (!m_dbusProperties) { - m_dbusProperties = new OrgFreedesktopDBusPropertiesInterface(QStringLiteral("org.neard"), - m_adapterPath, - QDBusConnection::systemBus(), - this); - } + OrgFreedesktopDBusPropertiesInterface dbusProperties(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus()); - if (!m_dbusProperties->isValid()) { + if (!dbusProperties.isValid()) { qCWarning(QT_NFC_NEARD) << "dbus property interface invalid"; return false; } // check if the adapter is currently polling - QDBusPendingReply replyPolling = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), - QStringLiteral("Polling")); + QDBusPendingReply replyPolling = dbusProperties.Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Polling")); replyPolling.waitForFinished(); if (!replyPolling.isError()) { if (replyPolling.value().variant().toBool()) { @@ -151,16 +146,16 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection() } // check if the adapter it powered - QDBusPendingReply replyPowered = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), - QStringLiteral("Powered")); + QDBusPendingReply replyPowered = dbusProperties.Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Powered")); replyPowered.waitForFinished(); if (!replyPowered.isError()) { if (replyPowered.value().variant().toBool()) { qCDebug(QT_NFC_NEARD) << "adapter is already powered"; } else { - QDBusPendingReply replyTryPowering = m_dbusProperties->Set(QStringLiteral("org.neard.Adapter"), - QStringLiteral("Powered"), - QDBusVariant(true)); + QDBusPendingReply replyTryPowering = dbusProperties.Set(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Powered"), + QDBusVariant(true)); replyTryPowering.waitForFinished(); if (!replyTryPowering.isError()) { qCDebug(QT_NFC_NEARD) << "powering adapter"; @@ -172,15 +167,12 @@ bool QNearFieldManagerPrivateImpl::startTargetDetection() } // create adapter and start poll loop - if (!m_adapter) { - m_adapter = new OrgNeardAdapterInterface(QStringLiteral("org.neard"), - m_adapterPath, - QDBusConnection::systemBus(), - this); - } + OrgNeardAdapterInterface neardAdapter(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus()); // possible modes: "Target", "Initiator", "Dual" - QDBusPendingReply<> replyPollLoop = m_adapter->StartPollLoop(QStringLiteral("Dual")); + QDBusPendingReply<> replyPollLoop = neardAdapter.StartPollLoop(QStringLiteral("Dual")); replyPollLoop.waitForFinished(); if (replyPollLoop.isError()) { qCWarning(QT_NFC_NEARD) << "error when starting polling"; @@ -198,13 +190,27 @@ void QNearFieldManagerPrivateImpl::stopTargetDetection() if (!isAvailable()) return; + OrgFreedesktopDBusPropertiesInterface dbusProperties(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus()); + + if (!dbusProperties.isValid()) { + qCWarning(QT_NFC_NEARD) << "dbus property interface invalid"; + return; + } + // check if the adapter is currently polling - QDBusPendingReply replyPolling = m_dbusProperties->Get(QStringLiteral("org.neard.Adapter"), - QStringLiteral("Polling")); + QDBusPendingReply replyPolling = dbusProperties.Get(QStringLiteral("org.neard.Adapter"), + QStringLiteral("Polling")); replyPolling.waitForFinished(); if (!replyPolling.isError()) { if (replyPolling.value().variant().toBool()) { - QDBusPendingReply<> replyStopPolling = m_adapter->StopPollLoop(); + // create adapter and stop poll loop + OrgNeardAdapterInterface neardAdapter(QStringLiteral("org.neard"), + m_adapterPath, + QDBusConnection::systemBus()); + + QDBusPendingReply<> replyStopPolling = neardAdapter.StopPollLoop(); replyStopPolling.waitForFinished(); if (replyStopPolling.isError()) qCWarning(QT_NFC_NEARD) << "error when stopping polling"; diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index ee72595c..8df4149b 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -52,9 +52,7 @@ #include #include -class OrgNeardAdapterInterface; class OrgNeardManagerInterface; -class OrgFreedesktopDBusPropertiesInterface; QT_BEGIN_NAMESPACE @@ -89,8 +87,6 @@ private Q_SLOTS: private: QString m_adapterPath; - OrgNeardAdapterInterface *m_adapter; - OrgFreedesktopDBusPropertiesInterface *m_dbusProperties; QMap m_activeTags; NeardHelper *m_neardHelper; }; -- cgit v1.2.3 From cad026d8bc9c12ce775cea5d947063e36bb79608 Mon Sep 17 00:00:00 2001 From: Martin Leutelt Date: Thu, 16 Oct 2014 10:40:17 +0200 Subject: Updated documentation to include neard Change-Id: I5fbcc7975f9d01374ac296d6a5528974e8513601 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 0f8c1a8f..db5beabb 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -121,6 +121,14 @@ QT_BEGIN_NAMESPACE \endcode + + \section3 NFC on Linux + The \l{https://01.org/linux-nfc}{Linux NFC project} provides software to support NFC on Linux platforms. + The neard daemon will allow access to the supported hardware via DBus interfaces. QtNfc requires neard + version 0.14 which can be built from source or installed via the appropriate Linux package manager. Not + all API features are currently supported. + To allow QtNfc to access the DBus interfaces the neard daemon has to be running. In case of problems + debug output can be enabled by enabling categorized logging for 'qt.nfc.neard'. */ /*! @@ -222,6 +230,8 @@ bool QNearFieldManager::isAvailable() const successfully started; otherwise returns false. Causes the targetDetected() signal to be emitted when a target is within proximity. \sa stopTargetDetection() + + \note For platforms using neard: target detection will stop as soon as a tag has been detected. */ bool QNearFieldManager::startTargetDetection() { @@ -285,6 +295,8 @@ static QMetaMethod methodForSignature(QObject *object, const char *method) \note The \e target parameter of \a method may not be available on all platforms, in which case \e target will be 0. + + \note On platforms using neard registering message handlers is not supported. */ int QNearFieldManager::registerNdefMessageHandler(QNdefRecord::TypeNameFormat typeNameFormat, -- cgit v1.2.3 From 8a39bc14ae2be320621132682d1bc575162ff69e Mon Sep 17 00:00:00 2001 From: Martin Leutelt Date: Thu, 16 Oct 2014 11:34:26 +0200 Subject: Extend QML NearField item to support neard The property 'polling' has been added to query the current state and to allow the user to start and stop target detection. The signals 'tagFound' and 'tagRemoved' have been added to allow the user to react to those events. Change-Id: Ieb07b5b799679982429a66f1790fa9985c55a24d Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativenearfield.cpp | 98 +++++++++++++++++++++++++++++-- src/imports/nfc/qdeclarativenearfield_p.h | 11 ++++ 2 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index b1aeced7..ffba30d0 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -49,6 +49,8 @@ #include #include +#include + /*! \qmltype NearField \instantiates QDeclarativeNearField @@ -69,6 +71,9 @@ and \l orderMatch properties to match the required NDEF messages. Once an NDEF message is successfully read from a tag the \l messageRecords property is updated. + \note For platforms using neard filtering is currently not implemented. For more information + on neard see \relates QNearFieldManager. + \snippet doc_src_qtnfc.qml QML register for messages */ @@ -85,6 +90,8 @@ set to NDEF messages which match the filter. If no filter is set, a message handler for all NDEF messages will be registered. + \note Filtering is not supported when using neard. + \l QNearFieldManager::registerNdefMessageHandler() */ @@ -92,13 +99,44 @@ \qmlproperty bool NearField::orderMatch This property indicates whether the order of records should be taken into account when matching - messages. + messages. This is not supported when using neard. +*/ + +/*! + \qmlproperty bool NearField::polling + + This property indicates if the underlying adapter is currently in polling state. If set to \c true + the adapter will start polling and stop polling if set to \c false. + + \note On platforms using neard, the adapter will stop polling as soon as a tag has been detected. + For more information see \relates QNearFieldManager. +*/ + +/*! + \qmlsignal NearField::tagFound() + + This signal will be emitted when a tag has been detected. +*/ + +/*! + \qmlsignal NearField::tagRemoved() + + This signal will be emitted when a tag has been removed. */ QDeclarativeNearField::QDeclarativeNearField(QObject *parent) -: QObject(parent), m_orderMatch(false), m_componentCompleted(false), m_messageUpdating(false), - m_manager(0), m_messageHandlerId(-1) + : QObject(parent), + m_orderMatch(false), + m_componentCompleted(false), + m_messageUpdating(false), + m_manager(new QNearFieldManager(this)), + m_messageHandlerId(-1), + m_polling(false) { + connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)), + this, SLOT(_q_handleTargetDetected(QNearFieldTarget*))); + connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)), + this, SLOT(_q_handleTargetLost(QNearFieldTarget*))); } QQmlListProperty QDeclarativeNearField::messageRecords() @@ -141,11 +179,30 @@ void QDeclarativeNearField::componentComplete() registerMessageHandler(); } -void QDeclarativeNearField::registerMessageHandler() +bool QDeclarativeNearField::polling() const +{ + return m_polling; +} + +void QDeclarativeNearField::setPolling(bool on) { - if (!m_manager) - m_manager = new QNearFieldManager(this); + if (m_polling == on) + return; + + if (on) { + if (m_manager->startTargetDetection()) { + m_polling = true; + emit pollingChanged(); + } + } else { + m_manager->stopTargetDetection(); + m_polling = false; + emit pollingChanged(); + } +} +void QDeclarativeNearField::registerMessageHandler() +{ if (m_messageHandlerId != -1) m_manager->unregisterNdefMessageHandler(m_messageHandlerId); @@ -160,6 +217,12 @@ void QDeclarativeNearField::registerMessageHandler() } m_messageHandlerId = m_manager->registerNdefMessageHandler(ndefFilter, this, SLOT(_q_handleNdefMessage(QNdefMessage))); + + // FIXME: if a message handler has been registered we just assume that constant polling is done + if (m_messageHandlerId >= 0) { + m_polling = true; + emit pollingChanged(); + } } void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message) @@ -178,6 +241,29 @@ void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message) emit messageRecordsChanged(); } +void QDeclarativeNearField::_q_handleTargetLost(QNearFieldTarget *target) +{ + Q_UNUSED(target); + // FIXME: only notify that polling stopped when there is no registered message handler + if (m_messageHandlerId == -1) { + m_polling = false; + emit pollingChanged(); + } + + emit tagRemoved(); +} + +void QDeclarativeNearField::_q_handleTargetDetected(QNearFieldTarget *target) +{ + Q_UNUSED(target); + + if (m_messageHandlerId == -1) { + connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), + this, SLOT(_q_handleNdefMessage(QNdefMessage))); + target->readNdefMessages(); + } +} + void QDeclarativeNearField::append_messageRecord(QQmlListProperty *list, QQmlNdefRecord *record) { diff --git a/src/imports/nfc/qdeclarativenearfield_p.h b/src/imports/nfc/qdeclarativenearfield_p.h index 14a6d986..af6b947c 100644 --- a/src/imports/nfc/qdeclarativenearfield_p.h +++ b/src/imports/nfc/qdeclarativenearfield_p.h @@ -60,6 +60,7 @@ class QDeclarativeNearField : public QObject, public QQmlParserStatus Q_PROPERTY(QQmlListProperty messageRecords READ messageRecords NOTIFY messageRecordsChanged) Q_PROPERTY(QQmlListProperty filter READ filter NOTIFY filterChanged) Q_PROPERTY(bool orderMatch READ orderMatch WRITE setOrderMatch NOTIFY orderMatchChanged) + Q_PROPERTY(bool polling READ polling WRITE setPolling NOTIFY pollingChanged) Q_INTERFACES(QQmlParserStatus) @@ -77,13 +78,22 @@ public: void classBegin() { } void componentComplete(); + bool polling() const; + void setPolling(bool on); + signals: void messageRecordsChanged(); void filterChanged(); void orderMatchChanged(); + void pollingChanged(); + + void tagFound(); + void tagRemoved(); private slots: void _q_handleNdefMessage(const QNdefMessage &message); + void _q_handleTargetLost(QNearFieldTarget*); + void _q_handleTargetDetected(QNearFieldTarget*); private: QList m_message; @@ -94,6 +104,7 @@ private: QNearFieldManager *m_manager; int m_messageHandlerId; + bool m_polling; void registerMessageHandler(); -- cgit v1.2.3 From 9277a04640e488916b79a0dcbf818c7f1aa1510d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 6 Nov 2014 15:46:03 +0100 Subject: Majority of service detail discovery code on Android Primarily the change adds the required data structures and interfaces on the Java side. What is missing is the reporting of the discovery details back to Qt. Change-Id: I37f2e17bb0f87b4c526f1b43a933b9b09b22be72 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 254 ++++++++++++++++++++- src/bluetooth/android/jni_android.cpp | 2 + src/bluetooth/android/lowenergynotificationhub.cpp | 15 ++ src/bluetooth/android/lowenergynotificationhub_p.h | 3 + src/bluetooth/qlowenergycontroller_android.cpp | 61 ++++- src/bluetooth/qlowenergycontroller_p.h | 1 + src/bluetooth/qlowenergyservice.cpp | 2 + src/bluetooth/qlowenergyservice.h | 3 +- src/bluetooth/qlowenergyserviceprivate.cpp | 3 + 9 files changed, 339 insertions(+), 5 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 0fd73613..50e2f293 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -38,12 +38,17 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothProfile; import android.util.Log; import java.util.ArrayList; +import java.util.Collection; +import java.util.Hashtable; import java.util.List; +import java.util.UUID; public class QtBluetoothLE { private static final String TAG = "QtBluetoothGatt"; @@ -69,6 +74,11 @@ public class QtBluetoothLE { mRemoteGattAddress = remoteAddress; } + + /*************************************************************/ + /* Device scan */ + /*************************************************************/ + /* Returns true, if request was successfully completed */ @@ -101,6 +111,10 @@ public class QtBluetoothLE { public native void leScanResult(long qtObject, BluetoothDevice device, int rssi); + /*************************************************************/ + /* Service Discovery */ + /*************************************************************/ + private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { @@ -146,10 +160,59 @@ public class QtBluetoothLE { } leServicesDiscovered(qtObject, errorCode, builder.toString()); } + + public void onCharacteristicRead(android.bluetooth.BluetoothGatt gatt, + android.bluetooth.BluetoothGattCharacteristic characteristic, + int status) + { + GattEntry entry = entries.get(runningHandle); + entry.valueKnown = true; + entries.set(runningHandle, entry); + performServiceDiscoveryForHandle(runningHandle+1, false); + } + + public void onCharacteristicWrite(android.bluetooth.BluetoothGatt gatt, + android.bluetooth.BluetoothGattCharacteristic characteristic, + int status) + { + System.out.println("onCharacteristicWrite"); + } + + public void onCharacteristicChanged(android.bluetooth.BluetoothGatt gatt, + android.bluetooth.BluetoothGattCharacteristic characteristic) + { + System.out.println("onCharacteristicChanged"); + } + + public void onDescriptorRead(android.bluetooth.BluetoothGatt gatt, + android.bluetooth.BluetoothGattDescriptor descriptor, + int status) + { + GattEntry entry = entries.get(runningHandle); + entry.valueKnown = true; + entries.set(runningHandle, entry); + performServiceDiscoveryForHandle(runningHandle+1, false); + } + + public void onDescriptorWrite(android.bluetooth.BluetoothGatt gatt, + android.bluetooth.BluetoothGattDescriptor descriptor, + int status) + { + System.out.println("onDescriptorWrite"); + } + //TODO Requires Android API 21 which is not available on CI yet. +// public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt gatt, +// int status) { +// System.out.println("onReliableWriteCompleted"); +// } +// +// public void onReadRemoteRssi(android.bluetooth.BluetoothGatt gatt, +// int rssi, int status) { +// System.out.println("onReadRemoteRssi"); +// } + }; - public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); - public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); public boolean connect() { if (mBluetoothGatt != null) @@ -181,5 +244,192 @@ public class QtBluetoothLE { return mBluetoothGatt.discoverServices(); } + private enum GattEntryType + { + Service, Characteristic, CharacteristicValue, Descriptor + } + private class GattEntry + { + public GattEntryType type; + public boolean valueKnown = false; + public BluetoothGattService service = null; + public BluetoothGattCharacteristic characteristic = null; + public BluetoothGattDescriptor descriptor = null; + } + Hashtable> uuidToEntry = new Hashtable>(100); + ArrayList entries = new ArrayList(100); + + private void populateHandles() + { + // We introduce the notion of artificial handles. While GATT handles + // are not exposed on Android they help to quickly identify GATT attributes + // on the C++ side. The Qt Api will not expose the handles + GattEntry entry = null; + List services = mBluetoothGatt.getServices(); + for (BluetoothGattService service: services) { + entry = new GattEntry(); + entry.type = GattEntryType.Service; + entry.service = service; + entries.add(entry); + + //some devices may have more than one service with the same uuid + List old = uuidToEntry.get(service.getUuid()); + if (old == null) + old = new ArrayList(); + old.add(entries.size()-1); + uuidToEntry.put(service.getUuid(), old); + + List charList = service.getCharacteristics(); + for (BluetoothGattCharacteristic characteristic: charList) { + entry = new GattEntry(); + entry.type = GattEntryType.Characteristic; + entry.characteristic = characteristic; + entries.add(entry); + //uuidToEntry.put(characteristic.getUuid(), entries.size()-1); + + // this emulates GATT value attributes + entry = new GattEntry(); + entry.type = GattEntryType.CharacteristicValue; + entries.add(entry); + //uuidToEntry.put(characteristic.getUuid(), entry); + + List descList = characteristic.getDescriptors(); + for (BluetoothGattDescriptor desc: descList) { + entry = new GattEntry(); + entry.type = GattEntryType.Descriptor; + entry.descriptor = desc; + entries.add(entry); + //uuidToEntry.put(desc.getUuid(), entries.size()-1); + } + } + } + + entries.trimToSize(); + } + + private int currentServiceInDiscovery = -1; + private int runningHandle = -1; + public synchronized boolean discoverServiceDetails(String serviceUuid) + { + try { + if (mBluetoothGatt == null) + return false; + + if (entries.isEmpty()) + populateHandles(); + + GattEntry entry; + int serviceHandle; + try { + UUID service = UUID.fromString(serviceUuid); + List handles = uuidToEntry.get(service); + if (handles == null || handles.isEmpty()) { + Log.w(TAG, "Unknown service uuid for current device: " + service.toString()); + return false; + } + + //TODO for now we assume we always want the first service in case of uuid collision + serviceHandle = handles.get(0); + entry = entries.get(serviceHandle); + if (entry == null) { + Log.w(TAG, "Service with UUID " + service.toString() + " not found"); + return false; + } + } catch (IllegalArgumentException ex) { + //invalid UUID string passed + Log.w(TAG, "Cannot parse given UUID"); + return false; + } + + if (entry.type != GattEntryType.Service) { + Log.w(TAG, "Given UUID is not a service UUID: " + serviceUuid); + return false; + } + + // current service already under investigation + if (currentServiceInDiscovery == serviceHandle) + return true; + + if (currentServiceInDiscovery != -1) { + Log.w(TAG, "Service discovery already running on another service"); + return false; + } + + if (!entry.valueKnown) { + performServiceDiscoveryForHandle(serviceHandle, true); + } else { + Log.w(TAG, "Service already discovered"); + } + + } catch (Exception ex) { + ex.printStackTrace(); + return false; + } + + return true; + } + + private void finishCurrentServiceDiscovery() + { + GattEntry discoveredService = entries.get(currentServiceInDiscovery); + discoveredService.valueKnown = true; + entries.set(currentServiceInDiscovery, discoveredService); + runningHandle = -1; + currentServiceInDiscovery = -1; + leServiceDetailDiscoveryFinished(qtObject, discoveredService.service.getUuid().toString()); + } + + private synchronized void performServiceDiscoveryForHandle(int nextHandle, boolean searchStarted) + { + try { + if (searchStarted) { + currentServiceInDiscovery = nextHandle; + runningHandle = ++nextHandle; + } else { + runningHandle = nextHandle; + } + + GattEntry entry = null; + try { + entry = entries.get(nextHandle); + } catch (IndexOutOfBoundsException ex) { + ex.printStackTrace(); + Log.w(TAG, "Last entry of last service read"); + finishCurrentServiceDiscovery(); + return; + } + + boolean result = false; + switch (entry.type) { + case Characteristic: + result = mBluetoothGatt.readCharacteristic(entry.characteristic); + if (!result) + performServiceDiscoveryForHandle(runningHandle+1, false); + break; + case CharacteristicValue: + // ignore -> nothing to do for this artificial type + performServiceDiscoveryForHandle(runningHandle+1, false); + break; + case Descriptor: + result = mBluetoothGatt.readDescriptor(entry.descriptor); + if (!result) + performServiceDiscoveryForHandle(runningHandle+1, false); + break; + case Service: + finishCurrentServiceDiscovery(); + break; + default: + Log.w(TAG, "Invalid GATT attribute type"); + break; + } + + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); + public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); + public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index 6a293a4e..5ae18161 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -203,6 +203,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_connectionChange}, {"leServicesDiscovered", "(JILjava/lang/String;)V", (void *) LowEnergyNotificationHub::lowEnergy_servicesDiscovered}, + {"leServiceDetailDiscoveryFinished", "(JLjava/lang/String;)V", + (void *) LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 56c3eec7..e009e5f7 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -122,4 +122,19 @@ void LowEnergyNotificationHub::lowEnergy_servicesDiscovered( Q_ARG(QString, uuids)); } +void LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered( + JNIEnv *, jobject, jlong qtObject, jobject uuid) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + const QString serviceUuid = QAndroidJniObject(uuid).toString(); + QMetaObject::invokeMethod(hub, "serviceDetailsDiscoveryFinished", + Qt::QueuedConnection, + Q_ARG(QString, serviceUuid)); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 0cd3b02d..06c7b3ff 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -57,6 +57,8 @@ public: jint errorCode, jint newState); static void lowEnergy_servicesDiscovered(JNIEnv*, jobject, jlong qtObject, jint errorCode, jobject uuidList); + static void lowEnergy_serviceDetailsDiscovered(JNIEnv *, jobject, + jlong qtObject, jobject uuid); QAndroidJniObject javaObject() { @@ -67,6 +69,7 @@ signals: void connectionUpdated(QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode); void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &uuids); + void serviceDetailsDiscoveryFinished(const QString& serviceUuid); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 134a21b7..3a7ca98d 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -68,6 +68,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::connectionUpdated); connect(hub, &LowEnergyNotificationHub::servicesDiscovered, this, &QLowEnergyControllerPrivate::servicesDiscovered); + connect(hub, &LowEnergyNotificationHub::serviceDetailsDiscoveryFinished, + this, &QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished); } if (!hub->javaObject().isValid()) { @@ -103,9 +105,39 @@ void QLowEnergyControllerPrivate::discoverServices() } } -void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &/*service*/) +void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &service) { + if (!serviceList.contains(service)) { + qCWarning(QT_BT_ANDROID) << "Discovery of unknown service" << service.toString() + << "not possible"; + return; + } + if (!hub) + return; + + //cut leading { and trailing } {xxx-xxx} + QString tempUuid = service.toString(); + tempUuid.chop(1); //remove trailing '}' + tempUuid.remove(0, 1); //remove first '{' + + QAndroidJniEnvironment env; + QAndroidJniObject uuid = QAndroidJniObject::fromString(tempUuid); + bool result = hub->javaObject().callMethod("discoverServiceDetails", + "(Ljava/lang/String;)Z", + uuid.object()); + if (!result || true) { + QSharedPointer servicePrivate = + serviceList.value(service); + if (!servicePrivate.isNull()) { + servicePrivate->setError(QLowEnergyService::UnknownError); + servicePrivate->setState(QLowEnergyService::DiscoveryRequired); + } + qCWarning(QT_BT_ANDROID) << "Cannot discover details for" << service.toString(); + return; + } + + qCDebug(QT_BT_ANDROID) << "Discovery of" << service << "started"; } void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer /*service*/, @@ -113,7 +145,6 @@ void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointeruuid = service; + priv->setController(this); + + QSharedPointer pointer(priv); + serviceList.insert(service, pointer); + emit q->serviceDiscovered(QBluetoothUuid(entry)); } @@ -173,4 +215,19 @@ void QLowEnergyControllerPrivate::servicesDiscovered( } } +void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( + const QString &serviceUuid) +{ + const QBluetoothUuid service(serviceUuid); + if (!serviceList.contains(service)) { + qCWarning(QT_BT_ANDROID) << "Discovery done of unknown service:" + << service.toString(); + return; + } + + QSharedPointer pointer = + serviceList.value(service); + pointer->setState(QLowEnergyService::ServiceDiscovered); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 5dea046d..7676c19e 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -179,6 +179,7 @@ private slots: QLowEnergyController::Error errorCode); void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &foundServices); + void serviceDetailsDiscoveryFinished(const QString& serviceUuid); #endif private: diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 0ec92d45..0c803144 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -169,6 +169,8 @@ QT_BEGIN_NAMESPACE \value DescriptorWriteError An attempt to write a new value to a descriptor failed. For example, it might be triggered when attempting to write to a read-only descriptor. + \value UnknownError An unknown error occurred when interacting with the service. + This value was introduced by Qt 5.5. */ /*! diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 903b64fe..136f85ee 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -56,7 +56,8 @@ public: NoError = 0, OperationError, CharacteristicWriteError, - DescriptorWriteError + DescriptorWriteError, + UnknownError }; enum ServiceState { diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 43bb3498..7c310123 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -65,6 +65,9 @@ void QLowEnergyServicePrivate::setError(QLowEnergyService::ServiceError newError void QLowEnergyServicePrivate::setState(QLowEnergyService::ServiceState newState) { + if (state == newState) + return; + state = newState; emit stateChanged(newState); } -- cgit v1.2.3 From f1372ef9a1c4ad5bb7c7bbd94116ec1203fc4243 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 7 Nov 2014 11:55:39 +0100 Subject: Permanently register QBluetoothUuid with Qt Meta type system Change-Id: I7010e36d6abed116dbf0a941109d61208d901951 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothuuid.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index 61798b03..3883b47b 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -395,6 +395,18 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value UnknownDescriptorType The descriptor type is unknown. */ +namespace +{ + class BtUuidRegisterMetaTypes + { + public: + BtUuidRegisterMetaTypes() + { + qRegisterMetaType(); + } + } _registerBtUuidMetaTypes; +} + /*! Constructs a new null Bluetooth UUID. */ -- cgit v1.2.3 From e0dc61db4af89cce14ade3582ac92e4b713c7982 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 29 Oct 2014 10:15:54 +0100 Subject: Bluetooth - device (LE) discovery for iOS Add a QBluetoothDeviceDiscoveryAgent for iOS, implementation is based on Core Bluetooth framework. Low Energy devices scan only. - Ctor with address: set error as invalid bluetooth adapter error, Core Bluetooth framework does not provide access to the local adapter's address. - Adjust a test - we do not have access to the 'local device' information on iOS (no address, no number of devices etc.) - skip the last test in tst_deviceDiscovery. Change-Id: I49080d021c340016aebc548cc8ed758777c66397 Reviewed-by: Alex Blasche --- src/bluetooth/bluetooth.pro | 19 + src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h | 4 +- src/bluetooth/osx/osxbtledeviceinquiry.mm | 2 + src/bluetooth/osx/osxbtledeviceinquiry_p.h | 5 +- src/bluetooth/osx/osxbtutility.mm | 45 +++ src/bluetooth/osx/osxbtutility_p.h | 110 +++++- .../qbluetoothdevicediscoveryagent_ios.mm | 387 +++++++++++++++++++++ .../tst_qbluetoothdevicediscoveryagent.cpp | 8 +- 8 files changed, 565 insertions(+), 15 deletions(-) create mode 100644 src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 2868229d..1b065a2c 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -168,6 +168,25 @@ config_bluez:qtHaveModule(dbus) { SOURCES -= qbluetoothservicediscoveryagent.cpp SOURCES -= qbluetoothsocket.cpp SOURCES -= qbluetoothserver.cpp +} else:ios { + message("iOS is currently an unsupported Bluetooth platform, WIP.") + + DEFINES += QT_IOS_BLUETOOTH + LIBS += -framework Foundation -framework CoreBluetooth + + OBJECTIVE_SOURCES += \ + qbluetoothdevicediscoveryagent_ios.mm + + include(osx/osxbt.pri) + SOURCES += \ + qbluetoothdevicediscoveryagent_p.cpp \ + qbluetoothlocaldevice_p.cpp \ + qbluetoothserviceinfo_p.cpp \ + qbluetoothservicediscoveryagent_p.cpp \ + qbluetoothsocket_p.cpp \ + qbluetoothserver_p.cpp \ + qlowenergycontroller_p.cpp + SOURCES -= qbluetoothdevicediscoveryagent.cpp } else { message("Unsupported Bluetooth platform, will not build a working QtBluetooth library.") message("Either no Qt D-Bus found or no BlueZ headers.") diff --git a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h b/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h index cb8a70d3..65b5e61f 100644 --- a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h +++ b/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h @@ -41,7 +41,9 @@ #include -#import +// Foundation _MUST_ be included before 'wrapper' - +// SDK 10.9 is broken and requires this trick. +#include #include "corebluetoothwrapper_p.h" diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 60e3224d..2f5ec0bb 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -48,6 +48,8 @@ #include #include +// Foundation header is already included by this point +// (a workaround for a broken 10.9 SDK). #include "corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/osx/osxbtledeviceinquiry_p.h b/src/bluetooth/osx/osxbtledeviceinquiry_p.h index 16a757a6..20004d30 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtledeviceinquiry_p.h @@ -47,7 +47,10 @@ #include #include -#import +// The Foundation header must be included before +// corebluetoothwrapper_p.h - a workaround for a broken +// 10.9 SDK. +#include @class QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry); diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index b6818ef6..74ee84e6 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -159,6 +159,51 @@ QString qt_error_string(IOReturn errorCode) #endif + +// Apple has: CBUUID, NSUUID, CFUUID, IOBluetoothSDPUUID +// and it's handy to have several converters: + +QBluetoothUuid qt_uuid(CBUUID *uuid) +{ + if (!uuid) + return QBluetoothUuid(); + + QT_BT_MAC_AUTORELEASEPOOL; + + if (uuid.data.length != 16) // TODO: warning? + return QBluetoothUuid(); + + quint128 qtUuidData = {}; + const quint8 *const source = static_cast(uuid.data.bytes); + std::copy(source, source + 16, qtUuidData.data); + + return QBluetoothUuid(qtUuidData); +} + +CFStrongReference cf_uuid(const QBluetoothUuid &qtUuid) +{ + const quint128 qtUuidData = qtUuid.toUInt128(); + const quint8 *const data = qtUuidData.data; + + CFUUIDBytes bytes = {data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7], + data[8], data[9], data[10], data[11], + data[12], data[13], data[14], data[15]}; + + CFUUIDRef cfUuid = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, bytes); + return CFStrongReference(cfUuid, false);// false == already retained. +} + +ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid) +{ + CFStrongReference cfUuid(cf_uuid(qtUuid)); + if (!cfUuid) + return ObjCStrongReference(); + + ObjCStrongReference cbUuid([CBUUID UUIDWithCFUUID:cfUuid], true); //true == retain. + return cbUuid; +} + } QT_END_NAMESPACE diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index c2a48e5f..8c4083d9 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -47,19 +47,10 @@ #include #include +// Only after Foundation.h! +#include "corebluetoothwrapper_p.h" -#ifndef QT_IOS_BLUETOOTH - -#include -#include - -@class IOBluetoothSDPUUID; - -#else - -#include - -#endif +@class CBUUID; QT_BEGIN_NAMESPACE @@ -179,6 +170,97 @@ private: T *m_ptr; }; +// The type 'T' is some XXXRef from CoreFoundation and co. +// In principle, we can do a trick removing a pointer from a type +// when template is instantiated, but it's quite a lot of ugly pp-tokens +// like OSXBluetooth::CFStrongReference > strongReference; +// so instead we use 'T' everywhere, not 'T *' as can expected +// from a smart pointer. +template +class CFStrongReference { +public: + CFStrongReference() + : m_ptr(Q_NULLPTR) + { + } + + CFStrongReference(T obj, bool retain) + : m_ptr(obj) + { + if (m_ptr && retain) + CFRetain(m_ptr); + } + + CFStrongReference(const CFStrongReference &rhs) + { + if ((m_ptr = rhs.m_ptr)) + CFRetain(m_ptr); + } + + CFStrongReference &operator = (const CFStrongReference &rhs) + { + // "Old-style" implementation: + if (this != &rhs && m_ptr != rhs.m_ptr) { + if (m_ptr) + CFRelease(m_ptr); + if ((m_ptr = rhs.m_ptr)) + CFRetain(m_ptr); + } + + return *this; + } + +#ifdef Q_COMPILER_RVALUE_REFS + CFStrongReference(CFStrongReference &&xval) + { + m_ptr = xval.m_ptr; + xval.m_ptr = Q_NULLPTR; + } + + CFStrongReference &operator = (CFStrongReference &&xval) + { + m_ptr = xval.m_ptr; + xval.m_ptr = Q_NULLPTR; + return *this; + } +#endif + + ~CFStrongReference() + { + if (m_ptr) + CFRelease(m_ptr); + } + + void reset(T newVal) + { + if (m_ptr != newVal) { + if (m_ptr) + CFRelease(m_ptr); + if ((m_ptr = newVal)) + CFRetain(m_ptr); + } + } + + operator T() const + { + return m_ptr; + } + + T data() const + { + return m_ptr; + } + + T take() + { + T p = m_ptr; + m_ptr = Q_NULLPTR; + return p; + } +private: + T m_ptr; +}; + QString qt_address(NSString *address); #ifndef QT_IOS_BLUETOOTH @@ -192,6 +274,10 @@ QString qt_error_string(IOReturn errorCode); #endif +QBluetoothUuid qt_uuid(CBUUID *uuid); +CFStrongReference cf_uuid(const QBluetoothUuid &qtUuid); +ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid); + } // namespace OSXBluetooth // Logging category for both OS X and iOS. diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm new file mode 100644 index 00000000..20304d99 --- /dev/null +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm @@ -0,0 +1,387 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbluetoothdevicediscoveryagent.h" +#include "osx/osxbtledeviceinquiry_p.h" +#include "qbluetoothlocaldevice.h" +#include "qbluetoothdeviceinfo.h" +#include "osx/osxbtutility_p.h" +#include "qbluetoothuuid.h" + +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +using OSXBluetooth::ObjCScopedPointer; + +class QBluetoothDeviceDiscoveryAgentPrivate : public OSXBluetooth::LEDeviceInquiryDelegate +{ + friend class QBluetoothDeviceDiscoveryAgent; +public: + QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &address, + QBluetoothDeviceDiscoveryAgent *q); + virtual ~QBluetoothDeviceDiscoveryAgentPrivate(); + + bool isValid() const; + bool isActive() const; + + void start(); + void stop(); + +private: + // LEDeviceInquiryDelegate: + void LEdeviceInquiryError(QBluetoothDeviceDiscoveryAgent::Error error) Q_DECL_OVERRIDE; + void LEnotSupported() Q_DECL_OVERRIDE; + void LEdeviceFound(CBPeripheral *peripheral, const QBluetoothUuid &deviceUuid, + NSDictionary *advertisementData, NSNumber *RSSI) Q_DECL_OVERRIDE; + void LEdeviceInquiryFinished() Q_DECL_OVERRIDE; + + void setError(QBluetoothDeviceDiscoveryAgent::Error, const QString &text = QString()); + + QBluetoothDeviceDiscoveryAgent *q_ptr; + + QBluetoothDeviceDiscoveryAgent::Error lastError; + QString errorString; + + QBluetoothDeviceDiscoveryAgent::InquiryType inquiryType; + + typedef ObjCScopedPointer LEDeviceInquiry; + LEDeviceInquiry inquiryLE; + + typedef QList DevicesList; + DevicesList discoveredDevices; + + bool startPending; + bool stopPending; +}; + +QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &adapter, + QBluetoothDeviceDiscoveryAgent *q) : + q_ptr(q), + lastError(QBluetoothDeviceDiscoveryAgent::NoError), + inquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry), + startPending(false), + stopPending(false) +{ + Q_UNUSED(adapter); + + Q_ASSERT_X(q != Q_NULLPTR, "QBluetoothDeviceDiscoveryAgentPrivate()", + "invalid q_ptr (null)"); + + // OSXBTLEDeviceInquiry can be constructed even if LE is not supported - + // at this stage it's only a memory allocation of the object itself, + // if it fails - we have some memory-related problems. + LEDeviceInquiry newInquiryLE([[LEDeviceInquiryObjC alloc] initWithDelegate:this]); + if (!newInquiryLE) { + qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate() " + "failed to initialize a device inquiry object"; + return; + } + + inquiryLE.reset(newInquiryLE.take()); +} + +QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate() +{ +} + +bool QBluetoothDeviceDiscoveryAgentPrivate::isValid() const +{ + // isValid() - Qt does not use exceptions, but the ctor + // can fail to initialize some important data-members + // - this is what meant here by valid/invalid. + return inquiryLE; +} + +bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const +{ + if (startPending) + return true; + if (stopPending) + return false; + + return [inquiryLE isActive]; +} + +void QBluetoothDeviceDiscoveryAgentPrivate::start() +{ + Q_ASSERT_X(isValid(), "start()", "called on invalid device discovery agent"); + Q_ASSERT_X(!isActive(), "start()", "called on active device discovery agent"); + Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, + "startLE()", "called with an invalid Bluetooth adapter"); + + if (stopPending) { + startPending = true; + return; + } + + discoveredDevices.clear(); + setError(QBluetoothDeviceDiscoveryAgent::NoError); + + if (![inquiryLE start]) { + // We can be here only if we have some kind of + // resource allocation error. + setError(QBluetoothDeviceDiscoveryAgent::UnknownError, + QObject::tr("device discovery agent, failed to start: " + "resource allocation error")); + emit q_ptr->error(lastError); + } +} + +void QBluetoothDeviceDiscoveryAgentPrivate::stop() +{ + Q_ASSERT_X(isValid(), "stop()", "called on invalid device discovery agent"); + Q_ASSERT_X(isActive(), "stop()", "called whithout active inquiry"); + Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, + "stop()", "called with invalid bluetooth adapter"); + + startPending = false; + stopPending = true; + + setError(QBluetoothDeviceDiscoveryAgent::NoError); + // Can be asynchronous (depending on a status update of CBCentralManager). + // The call itself is always 'success'. + [inquiryLE stop]; +} + +void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryError(QBluetoothDeviceDiscoveryAgent::Error error) +{ + // At the moment the only error reported by osxbtledeviceinquiry + // can be 'powered off' error, it happens + // after the LE scan started (so we have LE support and this is + // a real PoweredOffError). + Q_ASSERT_X(error == QBluetoothDeviceDiscoveryAgent::PoweredOffError, + "LEdeviceInquiryError", "unexpected error"); + + startPending = false; + stopPending = false; + setError(error); + emit q_ptr->error(lastError); +} + +void QBluetoothDeviceDiscoveryAgentPrivate::LEnotSupported() +{ + startPending = false; + stopPending = false; + setError(QBluetoothDeviceDiscoveryAgent::UnsupportedPlatformError); + emit q_ptr->error(lastError); +} + +void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceFound(CBPeripheral *peripheral, const QBluetoothUuid &deviceUuid, + NSDictionary *advertisementData, + NSNumber *RSSI) +{ + Q_ASSERT_X(peripheral, "LEdeviceFound", "invalid peripheral (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + QString name; + if (peripheral.name && peripheral.name.length) { + name = QString::fromNSString(peripheral.name); + } else { + NSString *const localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; + if (localName && [localName length]) + name = QString::fromNSString(localName); + } + + // TODO: fix 'classOfDevice' (0 for now). + QBluetoothDeviceInfo newDeviceInfo(deviceUuid, name, 0); + if (RSSI) + newDeviceInfo.setRssi([RSSI shortValue]); + // CoreBluetooth scans only for LE devices. + newDeviceInfo.setCoreConfigurations(QBluetoothDeviceInfo::LowEnergyCoreConfiguration); + + // Update, append or discard. + for (int i = 0, e = discoveredDevices.size(); i < e; ++i) { + if (discoveredDevices[i].deviceUuid() == newDeviceInfo.deviceUuid()) { + if (discoveredDevices[i] == newDeviceInfo) + return; + + discoveredDevices.replace(i, newDeviceInfo); + emit q_ptr->deviceDiscovered(newDeviceInfo); + return; + } + } + + discoveredDevices.append(newDeviceInfo); + emit q_ptr->deviceDiscovered(newDeviceInfo); +} + +void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryFinished() +{ + Q_ASSERT_X(isValid(), "LEdeviceInquiryFinished", "invalid device discovery agent"); + + if (stopPending && !startPending) { + stopPending = false; + emit q_ptr->canceled(); + } else if (startPending) { + startPending = false; + stopPending = false; + start(); + } else { + emit q_ptr->finished(); + } +} + +void QBluetoothDeviceDiscoveryAgentPrivate::setError(QBluetoothDeviceDiscoveryAgent::Error error, + const QString &text) +{ + lastError = error; + + if (text.length() > 0) { + errorString = text; + } else { + switch (lastError) { + case QBluetoothDeviceDiscoveryAgent::NoError: + errorString = QString(); + break; + case QBluetoothDeviceDiscoveryAgent::PoweredOffError: + errorString = QObject::tr("device discovery agent: adapter is powered off"); + break; + case QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError: + errorString = QObject::tr("device discovery agent: invalid bluetooth adapter"); + break; + case QBluetoothDeviceDiscoveryAgent::InputOutputError: + errorString = QObject::tr("device discovery agent: input output error"); + break; + case QBluetoothDeviceDiscoveryAgent::UnsupportedPlatformError: + errorString = QObject::tr("Bluetooth LE is not supported"); + break; + case QBluetoothDeviceDiscoveryAgent::UnknownError: + default: + errorString = QObject::tr("device discovery agent: unknown error"); + } + } +} + +QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(QObject *parent) : + QObject(parent), + d_ptr(new QBluetoothDeviceDiscoveryAgentPrivate(QBluetoothAddress(), this)) +{ +} + +QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent( + const QBluetoothAddress &deviceAdapter, QObject *parent) : + QObject(parent), + d_ptr(new QBluetoothDeviceDiscoveryAgentPrivate(deviceAdapter, this)) +{ + if (!deviceAdapter.isNull()) { + qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(), " + "local device address is not available, provided address is ignored"; + d_ptr->setError(InvalidBluetoothAdapterError); + } +} + +QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent() +{ + delete d_ptr; +} + +QBluetoothDeviceDiscoveryAgent::InquiryType QBluetoothDeviceDiscoveryAgent::inquiryType() const +{ + return d_ptr->inquiryType; +} + +void QBluetoothDeviceDiscoveryAgent::setInquiryType(QBluetoothDeviceDiscoveryAgent::InquiryType type) +{ + d_ptr->inquiryType = type; +} + +QList QBluetoothDeviceDiscoveryAgent::discoveredDevices() const +{ + return d_ptr->discoveredDevices; +} + +void QBluetoothDeviceDiscoveryAgent::start() +{ + if (d_ptr->lastError != InvalidBluetoothAdapterError) { + if (d_ptr->isValid()) { + if (!isActive()) { + d_ptr->start(); + } else { + qCDebug(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::start(), " + "already started"; + } + } else { + // We previously failed to initialize + // private object correctly. + d_ptr->setError(InvalidBluetoothAdapterError); + emit error(InvalidBluetoothAdapterError); + } + } +} + +void QBluetoothDeviceDiscoveryAgent::stop() +{ + if (d_ptr->isValid()) { + if (isActive() && d_ptr->lastError != InvalidBluetoothAdapterError) { + d_ptr->stop(); + } else { + qCDebug(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::stop(), " + "failed to stop"; + } + } +} + +bool QBluetoothDeviceDiscoveryAgent::isActive() const +{ + if (d_ptr->isValid()) + return d_ptr->isActive(); + + return false; +} + +QBluetoothDeviceDiscoveryAgent::Error QBluetoothDeviceDiscoveryAgent::error() const +{ + return d_ptr->lastError; +} + +QString QBluetoothDeviceDiscoveryAgent::errorString() const +{ + return d_ptr->errorString; +} + +QT_END_NAMESPACE diff --git a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp index bf273c79..e80a6dc5 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp +++ b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp @@ -427,7 +427,13 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery() } } } - //For multiple Bluetooth adapter do the check only for GeneralUnlimitedInquiry +#ifdef Q_OS_IOS + //On iOS, we do not have access to the local device/adapter, numberOfAdapters is 0, + //so we skip this test at all. + QSKIP("iOS: no local Bluetooth device available. Skipping remaining part of test."); +#endif + + //For multiple Bluetooth adapter do the check only for GeneralUnlimitedInquiry. if (!(inquiryType == QBluetoothDeviceDiscoveryAgent::LimitedInquiry)) QVERIFY((numberOfAdapters-1) == counter); } -- cgit v1.2.3 From 327b6b7f8ff9acda74f403f2ff286e67f4202dfd Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 7 Nov 2014 12:06:43 +0100 Subject: Propagate Charactereristic data to Qt layer Although this makes the lowenergyscanner example functionally complete, descriptor data and service meta data are still not accessable via the Qt API. Change-Id: Ifb84010b4fea054357c07424ac30116d1e4f9de0 Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 11 +++++++ src/bluetooth/android/jni_android.cpp | 2 ++ src/bluetooth/android/lowenergynotificationhub.cpp | 35 ++++++++++++++++++++++ src/bluetooth/android/lowenergynotificationhub_p.h | 10 ++++++- src/bluetooth/qlowenergycontroller_android.cpp | 27 +++++++++++++++++ src/bluetooth/qlowenergycontroller_p.h | 3 ++ 6 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 50e2f293..93b4a50d 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -168,6 +168,14 @@ public class QtBluetoothLE { GattEntry entry = entries.get(runningHandle); entry.valueKnown = true; entries.set(runningHandle, entry); + String data = new String(characteristic.getValue()); + // Qt manages handles starting at 1, in Java we use a system starting with 0 + characteristic.getService().getUuid().toString(); + + //TODO avoid sending service uuid -> service handle should be sufficient + leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), + runningHandle+1, characteristic.getUuid().toString(), + characteristic.getProperties(), characteristic.getValue()); performServiceDiscoveryForHandle(runningHandle+1, false); } @@ -431,5 +439,8 @@ public class QtBluetoothLE { public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid); + public native void leCharacteristicRead(long qtObject, String serviceUuid, + int charHandle, String charUuid, + int properties, byte[] data); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index 5ae18161..b75ca2df 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -205,6 +205,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_servicesDiscovered}, {"leServiceDetailDiscoveryFinished", "(JLjava/lang/String;)V", (void *) LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered}, + {"leCharacteristicRead", "(JLjava/lang/String;ILjava/lang/String;I[B)V", + (void *) LowEnergyNotificationHub::lowEnergy_characteristicRead}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index e009e5f7..71aa5a02 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -137,4 +137,39 @@ void LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered( Q_ARG(QString, serviceUuid)); } +void LowEnergyNotificationHub::lowEnergy_characteristicRead( + JNIEnv *env, jobject, jlong qtObject, jobject sUuid, jint handle, + jobject cUuid, jint properties, jbyteArray data) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + + const QBluetoothUuid serviceUuid(QAndroidJniObject(sUuid).toString()); + if (serviceUuid.isNull()) + return; + + const QBluetoothUuid charUuid(QAndroidJniObject(cUuid).toString()); + + jsize length = env->GetArrayLength(data); + jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); + if (!nativeData) + return; + + env->GetByteArrayRegion(data, 0, length, nativeData); + const QByteArray qtArray(reinterpret_cast(nativeData), + length); //takes ownership of data + + QMetaObject::invokeMethod(hub, "characteristicRead", Qt::QueuedConnection, + Q_ARG(QBluetoothUuid, serviceUuid), + Q_ARG(int, handle), + Q_ARG(QBluetoothUuid, charUuid), + Q_ARG(int, properties), + Q_ARG(QByteArray, qtArray)); + free(nativeData); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 06c7b3ff..7a1e2d79 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -41,6 +41,7 @@ #include #include +#include #include "qlowenergycontroller_p.h" QT_BEGIN_NAMESPACE @@ -59,6 +60,10 @@ public: jint errorCode, jobject uuidList); static void lowEnergy_serviceDetailsDiscovered(JNIEnv *, jobject, jlong qtObject, jobject uuid); + static void lowEnergy_characteristicRead(JNIEnv*env, jobject, jlong qtObject, + jobject serviceUuid, + jint handle, jobject charUuid, + jint properties, jbyteArray data); QAndroidJniObject javaObject() { @@ -67,9 +72,12 @@ public: signals: void connectionUpdated(QLowEnergyController::ControllerState newState, - QLowEnergyController::Error errorCode); + QLowEnergyController::Error errorCode); void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &uuids); void serviceDetailsDiscoveryFinished(const QString& serviceUuid); + void characteristicRead(const QBluetoothUuid &serviceUuid, + int handle, const QBluetoothUuid &charUuid, + int properties, const QByteArray& data); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 3a7ca98d..c3cdde83 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -70,6 +70,9 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::servicesDiscovered); connect(hub, &LowEnergyNotificationHub::serviceDetailsDiscoveryFinished, this, &QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished); + connect(hub, &LowEnergyNotificationHub::characteristicRead, + this, &QLowEnergyControllerPrivate::characteristicRead); + } if (!hub->javaObject().isValid()) { @@ -230,4 +233,28 @@ void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( pointer->setState(QLowEnergyService::ServiceDiscovered); } +void QLowEnergyControllerPrivate::characteristicRead( + const QBluetoothUuid& serviceUuid, int handle, + const QBluetoothUuid &charUuid, int properties, const QByteArray &data) +{ + if (!serviceList.contains(serviceUuid)) + return; + + QSharedPointer service = + serviceList.value(serviceUuid); + QLowEnergyHandle charHandle = handle; + + QLowEnergyServicePrivate::CharData &charDetails = + service->characteristicList[charHandle]; + + //Android uses same properties value as Qt which is the Bluetooth LE standard + charDetails.properties = QLowEnergyCharacteristic::PropertyType(properties); + charDetails.uuid = charUuid; + charDetails.value = data; + //value handle always one larger than characteristics value handle + charDetails.valueHandle = charHandle + 1; + + //service->characteristicList[charHandle] = charDetails; +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 7676c19e..6f416b11 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -180,6 +180,9 @@ private slots: void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &foundServices); void serviceDetailsDiscoveryFinished(const QString& serviceUuid); + void characteristicRead(const QBluetoothUuid &serviceUuid, int handle, + const QBluetoothUuid &charUuid, int properties, + const QByteArray& data); #endif private: -- cgit v1.2.3 From a57a9a6598eb8fa2578ea8511b351b49d5b55ff0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 7 Nov 2014 15:51:02 +0100 Subject: The service->characteristic->descriptor tree becomes available in Qt At the same time this fixes bugs the following bugs: 1.) Non-readable characteristics were not visible 2.) Crashes when descriptor/characteristic values were empty 3.) QLEService::discoverServiceDetails always finished with an UnknownError Missing/incorrect are still service details such as included services and the service type (which currently always defaults to primary service). Change-Id: Id73013a3784cd3c3f632102f13f5459ab37e95a6 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 182 ++++++++++++++++++--- src/bluetooth/android/jni_android.cpp | 4 +- src/bluetooth/android/lowenergynotificationhub.cpp | 72 ++++++-- src/bluetooth/android/lowenergynotificationhub_p.h | 13 +- src/bluetooth/qlowenergycontroller_android.cpp | 50 +++++- src/bluetooth/qlowenergycontroller_p.h | 5 +- 6 files changed, 281 insertions(+), 45 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 93b4a50d..9295c2bb 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -45,7 +45,6 @@ import android.bluetooth.BluetoothProfile; import android.util.Log; import java.util.ArrayList; -import java.util.Collection; import java.util.Hashtable; import java.util.List; import java.util.UUID; @@ -165,18 +164,66 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattCharacteristic characteristic, int status) { + if (status != BluetoothGatt.GATT_SUCCESS) { + Log.w(TAG, "onCharacteristicRead error: " + status); + return; + } + + //runningHandle is only used during serviceDetailsDiscovery + //If it is -1 we got an update outside of the details discovery process + if (runningHandle == -1) { + List handles = uuidToEntry.get(characteristic.getService().getUuid()); + if (handles == null || handles.isEmpty()) { + Log.w(TAG, "Received Characteristic read update for unknown characteristic"); + return; + } + int serviceHandle = handles.get(0); + GattEntry entry; + int foundHandle = -1; + try { + for (int i = 1; serviceHandle + i < entries.size() && foundHandle == -1; i++) { + entry = entries.get(serviceHandle + i); + if (entry == null) + continue; + + if (entry.type == GattEntryType.Service) { + Log.w(TAG, "Out-of-detail-discovery: found unknown characteristic for known service"); + break; //reached next service -> unknown characteristic in service + } + + if (entry.type != GattEntryType.Characteristic) + continue; + + if (entry.characteristic == characteristic) + foundHandle = serviceHandle + i; + } + } catch (IndexOutOfBoundsException ex) { + Log.w(TAG, "Out-of-detail-discovery: cannot find handle for characteristic"); + return; + } + + if (foundHandle == -1) { + Log.w(TAG, "Out-of-detail-discovery: char update failed"); + return; + } + + leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), + foundHandle+1, characteristic.getUuid().toString(), + characteristic.getProperties(), characteristic.getValue()); + + return; + } + GattEntry entry = entries.get(runningHandle); entry.valueKnown = true; entries.set(runningHandle, entry); - String data = new String(characteristic.getValue()); - // Qt manages handles starting at 1, in Java we use a system starting with 0 - characteristic.getService().getUuid().toString(); + // Qt manages handles starting at 1, in Java we use a system starting with 0 //TODO avoid sending service uuid -> service handle should be sufficient leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), - runningHandle+1, characteristic.getUuid().toString(), + runningHandle + 1, characteristic.getUuid().toString(), characteristic.getProperties(), characteristic.getValue()); - performServiceDiscoveryForHandle(runningHandle+1, false); + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); } public void onCharacteristicWrite(android.bluetooth.BluetoothGatt gatt, @@ -196,10 +243,63 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattDescriptor descriptor, int status) { + if (status != BluetoothGatt.GATT_SUCCESS) { + Log.w(TAG, "onDescriptorRead error: " + status); + return; + } + + //runningHandle is only used during serviceDetailsDiscovery + //If it is -1 we got an update outside of the details discovery process + if (runningHandle == -1) { + List handles = uuidToEntry.get(descriptor.getCharacteristic().getService().getUuid()); + if (handles == null || handles.isEmpty()) { + Log.w(TAG, "Received Descriptor read update for unknown descriptor"); + return; + } + + int serviceHandle = handles.get(0); + GattEntry entry; + int foundHandle = -1; + try { + for (int i = 1; serviceHandle + i < entries.size() && foundHandle == -1; i++) { + entry = entries.get(serviceHandle + i); + if (entry == null) + continue; + + if (entry.type == GattEntryType.Service) { + Log.w(TAG, "Out-of-detail-discovery: found unknown descriptor for known service"); + break; //reached next service -> unknown descriptor in service + } + + if (entry.type != GattEntryType.Descriptor) + continue; + + if (entry.descriptor == descriptor) + foundHandle = serviceHandle + i; + } + } catch (IndexOutOfBoundsException ex) { + Log.w(TAG, "Out-of-detail-discovery: cannot find handle for descriptor"); + return; + } + + if (foundHandle == -1) + Log.w(TAG, "Out-of-detail-discovery: char update failed"); + + leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), + descriptor.getCharacteristic().getUuid().toString(), foundHandle+1, + descriptor.getUuid().toString(), descriptor.getValue()); + return; + } + + GattEntry entry = entries.get(runningHandle); entry.valueKnown = true; entries.set(runningHandle, entry); - performServiceDiscoveryForHandle(runningHandle+1, false); + //TODO avoid sending service and characteristic uuid -> handles should be sufficient + leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), + descriptor.getCharacteristic().getUuid().toString(), runningHandle+1, + descriptor.getUuid().toString(), descriptor.getValue()); + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); } public void onDescriptorWrite(android.bluetooth.BluetoothGatt gatt, @@ -263,6 +363,7 @@ public class QtBluetoothLE { public BluetoothGattService service = null; public BluetoothGattCharacteristic characteristic = null; public BluetoothGattDescriptor descriptor = null; + public int endHandle; } Hashtable> uuidToEntry = new Hashtable>(100); ArrayList entries = new ArrayList(100); @@ -275,11 +376,14 @@ public class QtBluetoothLE { GattEntry entry = null; List services = mBluetoothGatt.getServices(); for (BluetoothGattService service: services) { - entry = new GattEntry(); - entry.type = GattEntryType.Service; - entry.service = service; + GattEntry serviceEntry = new GattEntry(); + serviceEntry.type = GattEntryType.Service; + serviceEntry.service = service; entries.add(entry); + // remember handle for the service for later update + int serviceHandle = entries.size() - 1; + //some devices may have more than one service with the same uuid List old = uuidToEntry.get(service.getUuid()); if (old == null) @@ -287,29 +391,32 @@ public class QtBluetoothLE { old.add(entries.size()-1); uuidToEntry.put(service.getUuid(), old); + // add all characteristics List charList = service.getCharacteristics(); for (BluetoothGattCharacteristic characteristic: charList) { entry = new GattEntry(); entry.type = GattEntryType.Characteristic; entry.characteristic = characteristic; entries.add(entry); - //uuidToEntry.put(characteristic.getUuid(), entries.size()-1); // this emulates GATT value attributes entry = new GattEntry(); entry.type = GattEntryType.CharacteristicValue; entries.add(entry); - //uuidToEntry.put(characteristic.getUuid(), entry); + // add all descriptors List descList = characteristic.getDescriptors(); for (BluetoothGattDescriptor desc: descList) { entry = new GattEntry(); entry.type = GattEntryType.Descriptor; entry.descriptor = desc; entries.add(entry); - //uuidToEntry.put(desc.getUuid(), entries.size()-1); } } + + // update endHandle of current service + serviceEntry.endHandle = entries.size() - 1; + entries.set(serviceHandle, serviceEntry); } entries.trimToSize(); @@ -364,7 +471,7 @@ public class QtBluetoothLE { } if (!entry.valueKnown) { - performServiceDiscoveryForHandle(serviceHandle, true); + performServiceDetailDiscoveryForHandle(serviceHandle, true); } else { Log.w(TAG, "Service already discovered"); } @@ -379,15 +486,19 @@ public class QtBluetoothLE { private void finishCurrentServiceDiscovery() { + int currentEntry = currentServiceInDiscovery; GattEntry discoveredService = entries.get(currentServiceInDiscovery); discoveredService.valueKnown = true; entries.set(currentServiceInDiscovery, discoveredService); + runningHandle = -1; currentServiceInDiscovery = -1; - leServiceDetailDiscoveryFinished(qtObject, discoveredService.service.getUuid().toString()); + + leServiceDetailDiscoveryFinished(qtObject, discoveredService.service.getUuid().toString(), + currentEntry + 1, discoveredService.endHandle + 1); } - private synchronized void performServiceDiscoveryForHandle(int nextHandle, boolean searchStarted) + private synchronized void performServiceDetailDiscoveryForHandle(int nextHandle, boolean searchStarted) { try { if (searchStarted) { @@ -411,17 +522,40 @@ public class QtBluetoothLE { switch (entry.type) { case Characteristic: result = mBluetoothGatt.readCharacteristic(entry.characteristic); - if (!result) - performServiceDiscoveryForHandle(runningHandle+1, false); + try { + if (!result) { + // add characteristic now since we won't get a read update later one + // this is possible when the characteristic is not readable + Log.d(TAG, "Non-readable characteristic " + entry.characteristic.getUuid() + + " for service " + entry.characteristic.getService().getUuid()); + leCharacteristicRead(qtObject, entry.characteristic.getService().getUuid().toString(), + nextHandle + 1, entry.characteristic.getUuid().toString(), + entry.characteristic.getProperties(), entry.characteristic.getValue()); + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); + } + } catch (Exception ex) + { + ex.printStackTrace(); + } break; case CharacteristicValue: // ignore -> nothing to do for this artificial type - performServiceDiscoveryForHandle(runningHandle+1, false); + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); break; case Descriptor: result = mBluetoothGatt.readDescriptor(entry.descriptor); - if (!result) - performServiceDiscoveryForHandle(runningHandle+1, false); + if (!result) { + // atm all descriptor types are readable + Log.d(TAG, "Non-readable descriptor " + entry.descriptor.getUuid() + + " for service/char" + entry.descriptor.getCharacteristic().getService().getUuid() + + "/" + entry.descriptor.getCharacteristic().getUuid()); + leDescriptorRead(qtObject, + entry.descriptor.getCharacteristic().getService().getUuid().toString(), + entry.descriptor.getCharacteristic().getUuid().toString(), + nextHandle+1, entry.descriptor.getUuid().toString(), + entry.descriptor.getValue()); + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); + } break; case Service: finishCurrentServiceDiscovery(); @@ -438,9 +572,13 @@ public class QtBluetoothLE { public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); - public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid); + public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid, + int startHandle, int endHandle); public native void leCharacteristicRead(long qtObject, String serviceUuid, int charHandle, String charUuid, int properties, byte[] data); + public native void leDescriptorRead(long qtObject, String serviceUuid, String charUuid, + int descHandle, String descUuid, byte[] data); + } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index b75ca2df..745a0c98 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -203,10 +203,12 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_connectionChange}, {"leServicesDiscovered", "(JILjava/lang/String;)V", (void *) LowEnergyNotificationHub::lowEnergy_servicesDiscovered}, - {"leServiceDetailDiscoveryFinished", "(JLjava/lang/String;)V", + {"leServiceDetailDiscoveryFinished", "(JLjava/lang/String;II)V", (void *) LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered}, {"leCharacteristicRead", "(JLjava/lang/String;ILjava/lang/String;I[B)V", (void *) LowEnergyNotificationHub::lowEnergy_characteristicRead}, + {"leDescriptorRead", "(JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;[B)V", + (void *) LowEnergyNotificationHub::lowEnergy_descriptorRead}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 71aa5a02..709bbc68 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -123,7 +123,8 @@ void LowEnergyNotificationHub::lowEnergy_servicesDiscovered( } void LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered( - JNIEnv *, jobject, jlong qtObject, jobject uuid) + JNIEnv *, jobject, jlong qtObject, jobject uuid, jint startHandle, + jint endHandle) { lock.lockForRead(); LowEnergyNotificationHub *hub = hubMap()->value(qtObject); @@ -134,7 +135,9 @@ void LowEnergyNotificationHub::lowEnergy_serviceDetailsDiscovered( const QString serviceUuid = QAndroidJniObject(uuid).toString(); QMetaObject::invokeMethod(hub, "serviceDetailsDiscoveryFinished", Qt::QueuedConnection, - Q_ARG(QString, serviceUuid)); + Q_ARG(QString, serviceUuid), + Q_ARG(int, startHandle), + Q_ARG(int, endHandle)); } void LowEnergyNotificationHub::lowEnergy_characteristicRead( @@ -147,29 +150,74 @@ void LowEnergyNotificationHub::lowEnergy_characteristicRead( if (!hub) return; - const QBluetoothUuid serviceUuid(QAndroidJniObject(sUuid).toString()); if (serviceUuid.isNull()) return; const QBluetoothUuid charUuid(QAndroidJniObject(cUuid).toString()); - - jsize length = env->GetArrayLength(data); - jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); - if (!nativeData) + if (charUuid.isNull()) return; - env->GetByteArrayRegion(data, 0, length, nativeData); - const QByteArray qtArray(reinterpret_cast(nativeData), - length); //takes ownership of data + QByteArray payload; + if (data) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(data); + jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); + if (!nativeData) + return; + + env->GetByteArrayRegion(data, 0, length, nativeData); + payload = QByteArray(reinterpret_cast(nativeData), + length); //takes deep copy of data + free(nativeData); + } QMetaObject::invokeMethod(hub, "characteristicRead", Qt::QueuedConnection, Q_ARG(QBluetoothUuid, serviceUuid), Q_ARG(int, handle), Q_ARG(QBluetoothUuid, charUuid), Q_ARG(int, properties), - Q_ARG(QByteArray, qtArray)); - free(nativeData); + Q_ARG(QByteArray, payload)); + +} + +void LowEnergyNotificationHub::lowEnergy_descriptorRead( + JNIEnv *env, jobject, jlong qtObject, jobject sUuid, jobject cUuid, + jint handle, jobject dUuid, jbyteArray data) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + const QBluetoothUuid serviceUuid(QAndroidJniObject(sUuid).toString()); + if (serviceUuid.isNull()) + return; + + const QBluetoothUuid charUuid(QAndroidJniObject(cUuid).toString()); + const QBluetoothUuid descUuid(QAndroidJniObject(dUuid).toString()); + if (charUuid.isNull() || descUuid.isNull()) + return; + + QByteArray payload; + if (data) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(data); + jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); + if (!nativeData) + return; + + env->GetByteArrayRegion(data, 0, length, nativeData); + payload = QByteArray(reinterpret_cast(nativeData), + length); //takes deep copy of data + free(nativeData); + } + + QMetaObject::invokeMethod(hub, "descriptorRead", Qt::QueuedConnection, + Q_ARG(QBluetoothUuid, serviceUuid), + Q_ARG(QBluetoothUuid, charUuid), + Q_ARG(int, handle), + Q_ARG(QBluetoothUuid, descUuid), + Q_ARG(QByteArray, payload)); } QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 7a1e2d79..39008a65 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -59,11 +59,15 @@ public: static void lowEnergy_servicesDiscovered(JNIEnv*, jobject, jlong qtObject, jint errorCode, jobject uuidList); static void lowEnergy_serviceDetailsDiscovered(JNIEnv *, jobject, - jlong qtObject, jobject uuid); + jlong qtObject, jobject uuid, + jint startHandle, jint endHandle); static void lowEnergy_characteristicRead(JNIEnv*env, jobject, jlong qtObject, jobject serviceUuid, jint handle, jobject charUuid, jint properties, jbyteArray data); + static void lowEnergy_descriptorRead(JNIEnv *env, jobject, jlong qtObject, + jobject sUuid, jobject cUuid, + jint handle, jobject dUuid, jbyteArray data); QAndroidJniObject javaObject() { @@ -74,10 +78,13 @@ signals: void connectionUpdated(QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode); void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &uuids); - void serviceDetailsDiscoveryFinished(const QString& serviceUuid); + void serviceDetailsDiscoveryFinished(const QString& serviceUuid, + int startHandle, int endHandle); void characteristicRead(const QBluetoothUuid &serviceUuid, int handle, const QBluetoothUuid &charUuid, - int properties, const QByteArray& data); + int properties, const QByteArray &data); + void descriptorRead(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, + int handle, const QBluetoothUuid &descUuid, const QByteArray &data); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index c3cdde83..f832d868 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -72,7 +72,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished); connect(hub, &LowEnergyNotificationHub::characteristicRead, this, &QLowEnergyControllerPrivate::characteristicRead); - + connect(hub, &LowEnergyNotificationHub::descriptorRead, + this, &QLowEnergyControllerPrivate::descriptorRead); } if (!hub->javaObject().isValid()) { @@ -129,7 +130,7 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s bool result = hub->javaObject().callMethod("discoverServiceDetails", "(Ljava/lang/String;)Z", uuid.object()); - if (!result || true) { + if (!result) { QSharedPointer servicePrivate = serviceList.value(service); if (!servicePrivate.isNull()) { @@ -219,7 +220,7 @@ void QLowEnergyControllerPrivate::servicesDiscovered( } void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( - const QString &serviceUuid) + const QString &serviceUuid, int startHandle, int endHandle) { const QBluetoothUuid service(serviceUuid); if (!serviceList.contains(service)) { @@ -228,13 +229,20 @@ void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( return; } + //update service data QSharedPointer pointer = serviceList.value(service); + pointer->startHandle = startHandle; + pointer->endHandle = endHandle; + + qCDebug(QT_BT_ANDROID) << "Service" << serviceUuid << "discovered (start:" + << startHandle << "end:" << endHandle << ")"; + pointer->setState(QLowEnergyService::ServiceDiscovered); } void QLowEnergyControllerPrivate::characteristicRead( - const QBluetoothUuid& serviceUuid, int handle, + const QBluetoothUuid &serviceUuid, int handle, const QBluetoothUuid &charUuid, int properties, const QByteArray &data) { if (!serviceList.contains(serviceUuid)) @@ -247,14 +255,44 @@ void QLowEnergyControllerPrivate::characteristicRead( QLowEnergyServicePrivate::CharData &charDetails = service->characteristicList[charHandle]; - //Android uses same properties value as Qt which is the Bluetooth LE standard + //Android uses same property value as Qt which is the Bluetooth LE standard charDetails.properties = QLowEnergyCharacteristic::PropertyType(properties); charDetails.uuid = charUuid; charDetails.value = data; //value handle always one larger than characteristics value handle charDetails.valueHandle = charHandle + 1; +} - //service->characteristicList[charHandle] = charDetails; +void QLowEnergyControllerPrivate::descriptorRead( + const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, + int descHandle, const QBluetoothUuid &descUuid, const QByteArray &data) +{ + if (!serviceList.contains(serviceUuid)) + return; + + QSharedPointer service = + serviceList.value(serviceUuid); + + bool entryUpdated = false; + foreach (QLowEnergyHandle charHandle, service->characteristicList.keys()) { + QLowEnergyServicePrivate::CharData &charDetails = + service->characteristicList[charHandle]; + if (charDetails.uuid != charUuid) + continue; + + // new entry created if it doesn't exist + QLowEnergyServicePrivate::DescData &descDetails = + charDetails.descriptorList[descHandle]; + descDetails.uuid = descUuid; + descDetails.value = data; + entryUpdated = true; + break; + } + + if (!entryUpdated) { + qCWarning(QT_BT_ANDROID) << "Cannot find/update descriptor" + << descUuid << charUuid << serviceUuid; + } } QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 6f416b11..6a72fa6c 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -179,10 +179,13 @@ private slots: QLowEnergyController::Error errorCode); void servicesDiscovered(QLowEnergyController::Error errorCode, const QString &foundServices); - void serviceDetailsDiscoveryFinished(const QString& serviceUuid); + void serviceDetailsDiscoveryFinished(const QString& serviceUuid, + int startHandle, int endHandle); void characteristicRead(const QBluetoothUuid &serviceUuid, int handle, const QBluetoothUuid &charUuid, int properties, const QByteArray& data); + void descriptorRead(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, + int handle, const QBluetoothUuid &descUuid, const QByteArray &data); #endif private: -- cgit v1.2.3 From 5488d1cd532b47c0a322a8f0ab31cf70f4e076da Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 09:51:08 +0100 Subject: Avoid one large memory allocation per read descriptor/characteristic We directly allocate into the QByteArray which continues to manage the memory for us. Change-Id: I39cd314a3cc9fcfd6bcf28836e0222d6d9a4f04f Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/android/lowenergynotificationhub.cpp | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 709bbc68..30b69edc 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -161,14 +161,9 @@ void LowEnergyNotificationHub::lowEnergy_characteristicRead( QByteArray payload; if (data) { //empty Java byte array is 0x0 jsize length = env->GetArrayLength(data); - jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); - if (!nativeData) - return; - - env->GetByteArrayRegion(data, 0, length, nativeData); - payload = QByteArray(reinterpret_cast(nativeData), - length); //takes deep copy of data - free(nativeData); + payload.resize(length); + env->GetByteArrayRegion(data, 0, length, + reinterpret_cast(payload.data())); } QMetaObject::invokeMethod(hub, "characteristicRead", Qt::QueuedConnection, @@ -202,14 +197,9 @@ void LowEnergyNotificationHub::lowEnergy_descriptorRead( QByteArray payload; if (data) { //empty Java byte array is 0x0 jsize length = env->GetArrayLength(data); - jbyte* nativeData = (jbyte*) malloc(length * sizeof(jbyte)); - if (!nativeData) - return; - - env->GetByteArrayRegion(data, 0, length, nativeData); - payload = QByteArray(reinterpret_cast(nativeData), - length); //takes deep copy of data - free(nativeData); + payload.resize(length); + env->GetByteArrayRegion(data, 0, length, + reinterpret_cast(payload.data())); } QMetaObject::invokeMethod(hub, "descriptorRead", Qt::QueuedConnection, -- cgit v1.2.3 From 93a0343ab23cdb6e098cf8df378deb2195e0ca06 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 12:03:24 +0100 Subject: Don't print the Java stacktrace when reaching last entry of last service We jump out and that's it. We expect the exception in those cases. Change-Id: I0fa1b42a0eb5893dec6f68a5353dfb5da3caa137 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 9295c2bb..0ed4962b 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -512,7 +512,7 @@ public class QtBluetoothLE { try { entry = entries.get(nextHandle); } catch (IndexOutOfBoundsException ex) { - ex.printStackTrace(); + //ex.printStackTrace(); Log.w(TAG, "Last entry of last service read"); finishCurrentServiceDiscovery(); return; -- cgit v1.2.3 From a1cb63d9c2b3a183a0f4afd97837d1ddd6497977 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 12:15:58 +0100 Subject: Fixes for QLowEnergyController unit test on Android It turns out mutliple connections to the sam remote device are possible. The limitations on Linux are implementation specific. We lift the general API limitation and document the insufficient behavior on Linux. A bug has been filed to track this limitation. On Android, unit tests require widgets support to run as we need a QGuiApplication. Change-Id: I37c487246ea6115d3441ca91a920279adbdf726e Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller.cpp | 14 ++++++++++---- tests/auto/qlowenergycontroller/qlowenergycontroller.pro | 4 ++++ .../auto/qlowenergycontroller/tst_qlowenergycontroller.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 24b50659..a114c832 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -70,10 +70,11 @@ QT_BEGIN_NAMESPACE The first step is to establish a connection via \l connectToDevice(). Once the connection has been established, the controller's \l state() changes to \l QLowEnergyController::ConnectedState and the \l connected() - signal is emitted. It is important to mention that the remote device can - usually only be connected to a single device. Therefore it is not - possible to have multiple instances of this class being connected to the - same remote device. The \l disconnectFromDevice() function is used to break + signal is emitted. It is important to mention that some platforms such as + a BlueZ based Linux cannot maintain two connected instances of + \l QLowEnergyController to the same remote device. In such cases the second + call to \l connectToDevice() may fail. This limitation may disappear at some + stage in the future. The \l disconnectFromDevice() function is used to break the existing connection. The second step after establishing the connection is to discover the services @@ -516,6 +517,11 @@ void QLowEnergyController::setRemoteAddressType( is \l UnconnectedState. The \l connected() signal is emitted once the connection is successfully established. + On Linux/BlueZ systems, it is not possible to connect to the same + remote device using two instances of this class. The second call + to this function may fail with an error. This limitation may + be removed in future releases. + \sa disconnectFromDevice() */ void QLowEnergyController::connectToDevice() diff --git a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro b/tests/auto/qlowenergycontroller/qlowenergycontroller.pro index 159f27bf..5360c796 100644 --- a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro +++ b/tests/auto/qlowenergycontroller/qlowenergycontroller.pro @@ -1,4 +1,8 @@ QT = core bluetooth testlib + +# Android requires GUI application when running test +android: QT += widgets + TARGET = tst_qlowenergycontroller CONFIG += testcase diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 3cb57e3f..c9cf1ca1 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -376,7 +376,18 @@ void tst_QLowEnergyController::tst_concurrentDiscovery() 30000); } +#ifdef Q_OS_ANDROID + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + QCOMPARE(control2.state(), QLowEnergyController::ConnectedState); + control2.disconnectFromDevice(); + QTest::qWait(3000); + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + QCOMPARE(control2.state(), QLowEnergyController::UnconnectedState); +#else + // see QTBUG-42519 + // Linux cannot maintain two controller connections at the same time QVERIFY(control2.error() != QLowEnergyController::NoError); +#endif } /* We are testing that we can run service discovery on the same device -- cgit v1.2.3 From 56ed37e8da233010f27624f40a76b9ebcbf36707 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 11:33:32 +0100 Subject: Fix QLEController::connectToDevice() documentation A logical condition was inverted. Change-Id: Ia7b54fe75a8cea4275e3c92c6283bc12f3423b64 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index f3ae2654..3d57ec6b 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -475,7 +475,7 @@ void QLowEnergyController::setRemoteAddressType( Connects to the remote Bluetooth Low Energy device. This function does nothing if the controller's \l state() - is \l UnconnectedState. The \l connected() signal is emitted + is not equal to \l UnconnectedState. The \l connected() signal is emitted once the connection is successfully established. \sa disconnectFromDevice() @@ -503,6 +503,8 @@ void QLowEnergyController::connectToDevice() Once any of those objects become invalid they remain invalid even if this controller object reconnects. + This function does nothing if the controller is in the \l UnconnectedState. + \sa connectToDevice() */ void QLowEnergyController::disconnectFromDevice() -- cgit v1.2.3 From b299a75a1d90dfd44c0f11ad75665c087c9ea120 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 10:46:57 +0100 Subject: More lowenergyscanner example fixes. This fixes a UI display bug and a hanging UI when the service discovery aborts with an error. Change-Id: Ic84d7b885d777360c8f1396e3973623c1d2c550a Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- examples/bluetooth/lowenergyscanner/assets/Dialog.qml | 2 +- examples/bluetooth/lowenergyscanner/device.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml index 2b8580f3..190e6b90 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml @@ -42,7 +42,7 @@ import QtQuick 2.0 Rectangle { width: parent.width/3*2 - height: 62 + height: dialogTextId.height + background.height + 20 z: 50 property string dialogText: "" property bool busyImage: true diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index 1f1e11c4..b9c8b532 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -290,13 +290,24 @@ void Device::deviceDisconnected() void Device::serviceDetailsDiscovered(QLowEnergyService::ServiceState newState) { - if (newState != QLowEnergyService::ServiceDiscovered) + if (newState != QLowEnergyService::ServiceDiscovered) { + // do not hang in "Scanning for characteristics" mode forever + // in case the service discovery failed + // We have to queue the signal up to give UI time to even enter + // the above mode + if (newState != QLowEnergyService::DiscoveringServices) { + QMetaObject::invokeMethod(this, "characteristicsUpdated", + Qt::QueuedConnection); + } return; + } QLowEnergyService *service = qobject_cast(sender()); if (!service) return; + + //! [les-chars] const QList chars = service->characteristics(); foreach (const QLowEnergyCharacteristic &ch, chars) { -- cgit v1.2.3 From d2c2e502dcee44d06eb0b0ad392571d7bc3021bf Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 10 Nov 2014 15:07:20 +0100 Subject: Improve reliability of QLEController connect()/disconnect()/connect() Quick disconnecting and reconnecting caused some bugs and revealed some unreliabe API behavior on Android. The internal data structures were never cleaned up when disconnecting from the remote device. If multiple QLEService objects of the same QLEController instance requested a service discovery, every request but the first failed. This was fixed by queueing up the service discovery requests. Last but not least, reusing the same BluetoothGatt instance for the reconnect is very error prone. It may well be caused by Android API bugs. The reconnect would sometimes fail or toggle the connect/disconnect flag a couple of times which is not a problem for the Qt API itself but the stability of the related unit test (see tst_QLowEnergyController::tst_concurrentDiscovery()). Therefore we won't reuse the same BluetoothGatt instance but rather request a new one. Change-Id: I314f2a30960284b9bcd4926f4944c415a6d75788 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 55 +++++++++++++++++++--- src/bluetooth/qlowenergycontroller_android.cpp | 5 +- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 0ed4962b..84744a4d 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -46,6 +46,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.Hashtable; +import java.util.LinkedList; import java.util.List; import java.util.UUID; @@ -124,7 +125,13 @@ public class QtBluetoothLE { //This must be in sync with QLowEnergyController::ControllerState switch (newState) { case BluetoothProfile.STATE_DISCONNECTED: - qLowEnergyController_State = 0; break; + qLowEnergyController_State = 0; + // we disconnected -> get rid of data from previous run + resetServiceDetailData(); + // reset mBluetoothGatt, reusing same object is not very reliable + // sometimes it reconnects and sometimes it does not. + mBluetoothGatt = null; + break; case BluetoothProfile.STATE_CONNECTED: qLowEnergyController_State = 2; } @@ -169,6 +176,11 @@ public class QtBluetoothLE { return; } + synchronized (this) { + if (uuidToEntry.isEmpty()) // ignore data if internal setup is not ready; + return; + } + //runningHandle is only used during serviceDetailsDiscovery //If it is -1 we got an update outside of the details discovery process if (runningHandle == -1) { @@ -248,6 +260,11 @@ public class QtBluetoothLE { return; } + synchronized (this) { + if (uuidToEntry.isEmpty()) // ignore data if internal setup is not ready; + return; + } + //runningHandle is only used during serviceDetailsDiscovery //If it is -1 we got an update outside of the details discovery process if (runningHandle == -1) { @@ -323,9 +340,6 @@ public class QtBluetoothLE { public boolean connect() { - if (mBluetoothGatt != null) - return mBluetoothGatt.connect(); - mRemoteGattDevice = mBluetoothAdapter.getRemoteDevice(mRemoteGattAddress); if (mRemoteGattDevice == null) return false; @@ -367,6 +381,7 @@ public class QtBluetoothLE { } Hashtable> uuidToEntry = new Hashtable>(100); ArrayList entries = new ArrayList(100); + private LinkedList servicesToBeDiscovered = new LinkedList(); private void populateHandles() { @@ -424,6 +439,16 @@ public class QtBluetoothLE { private int currentServiceInDiscovery = -1; private int runningHandle = -1; + + private synchronized void resetServiceDetailData() + { + runningHandle = -1; + currentServiceInDiscovery = -1; + uuidToEntry.clear(); + entries.clear(); + servicesToBeDiscovered.clear(); + } + public synchronized boolean discoverServiceDetails(String serviceUuid) { try { @@ -466,8 +491,16 @@ public class QtBluetoothLE { return true; if (currentServiceInDiscovery != -1) { - Log.w(TAG, "Service discovery already running on another service"); - return false; + // we are currently discovering another service + // we queue the new one up until we finish the previous one + if (!entry.valueKnown) { + servicesToBeDiscovered.add(serviceHandle); + Log.w(TAG, "Service discovery already running on another service, " + + "queueing request for " + serviceUuid); + } else { + Log.w(TAG, "Service already known"); + } + return true; } if (!entry.valueKnown) { @@ -496,6 +529,16 @@ public class QtBluetoothLE { leServiceDetailDiscoveryFinished(qtObject, discoveredService.service.getUuid().toString(), currentEntry + 1, discoveredService.endHandle + 1); + + if (!servicesToBeDiscovered.isEmpty()) { + try { + int nextService = servicesToBeDiscovered.remove(); + performServiceDetailDiscoveryForHandle(nextService, true); + } catch (IndexOutOfBoundsException ex) { + Log.w(TAG, "Expected queued service but didn't find any"); + return; + } + } } private synchronized void performServiceDetailDiscoveryForHandle(int nextHandle, boolean searchStarted) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index f832d868..4801d9bf 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -167,7 +167,10 @@ void QLowEnergyControllerPrivate::connectionUpdated( Q_Q(QLowEnergyController); const QLowEnergyController::ControllerState oldState = state; - qCDebug(QT_BT_ANDROID) << "Connection updated" << errorCode << oldState << newState; + qCDebug(QT_BT_ANDROID) << "Connection updated:" + << "error:" << errorCode + << "oldState:" << oldState + << "newState:" << newState; if (errorCode != QLowEnergyController::NoError) { // ConnectionError if transition from Connecting to Connected -- cgit v1.2.3 From be5883540fe61123da3fb39dd39cfd34eec442b8 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 7 Nov 2014 13:09:10 +0100 Subject: QLowEnergyController - version for OS X and iOS QLowEnergyController/Private for OS X and iOS. This patch contains dummy empty classes required. While LE controller is not fully implemented, I have to disable (marking as insignificant) auto test on this class, otherwise changing the (empty) class to pass the test adds more problem. Change-Id: I54f764f7f6468b1acf58e80555ae454922de9f3b Reviewed-by: Alex Blasche --- src/bluetooth/bluetooth.pro | 13 +- src/bluetooth/qlowenergycontroller_osx.mm | 210 +++++++++++++++++++++ src/bluetooth/qlowenergycontroller_osx_p.h | 86 +++++++++ src/bluetooth/qlowenergycontroller_p.h | 20 ++ src/bluetooth/qlowenergyservice_osx.mm | 125 ++++++++++++ .../qlowenergycontroller/qlowenergycontroller.pro | 4 + 6 files changed, 456 insertions(+), 2 deletions(-) create mode 100644 src/bluetooth/qlowenergycontroller_osx.mm create mode 100644 src/bluetooth/qlowenergycontroller_osx_p.h create mode 100644 src/bluetooth/qlowenergyservice_osx.mm diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 1b065a2c..b6783425 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -154,20 +154,28 @@ config_bluez:qtHaveModule(dbus) { qbluetoothservicediscoveryagent_osx.mm \ qbluetoothsocket_osx.mm \ qbluetoothserver_osx.mm \ - qbluetoothtransferreply_osx.mm + qbluetoothtransferreply_osx.mm \ + qlowenergycontroller_osx.mm \ + qlowenergyservice_osx.mm SOURCES += \ qlowenergycontroller_p.cpp PRIVATE_HEADERS += qbluetoothsocket_osx_p.h \ qbluetoothserver_osx_p.h \ - qbluetoothtransferreply_osx_p.h + qbluetoothtransferreply_osx_p.h \ + qbluetoothtransferreply_osx_p.h \ + qlowenergycontroller_osx_p.h SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qbluetoothserviceinfo.cpp SOURCES -= qbluetoothservicediscoveryagent.cpp SOURCES -= qbluetoothsocket.cpp SOURCES -= qbluetoothserver.cpp + SOURCES -= qlowenergyservice_p.cpp + SOURCES -= qlowenergyservice.cpp + SOURCES -= qlowenergycontroller.cpp + SOURCES -= qlowenergycontroller_p.cpp } else:ios { message("iOS is currently an unsupported Bluetooth platform, WIP.") @@ -186,6 +194,7 @@ config_bluez:qtHaveModule(dbus) { qbluetoothsocket_p.cpp \ qbluetoothserver_p.cpp \ qlowenergycontroller_p.cpp + SOURCES -= qbluetoothdevicediscoveryagent.cpp } else { message("Unsupported Bluetooth platform, will not build a working QtBluetooth library.") diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm new file mode 100644 index 00000000..08721933 --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Javier S. Pedro +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "osx/osxbtutility_p.h" + +#include "qlowenergyserviceprivate_p.h" +#include "qlowenergycontroller_osx_p.h" +#include "qbluetoothlocaldevice.h" +#include "qbluetoothdeviceinfo.h" +#include "qlowenergycontroller.h" +#include "qbluetoothuuid.h" + +#include +#include +#include +#include +#include + +#define OSX_D_PTR QLowEnergyControllerPrivateOSX *osx_d_ptr = static_cast(d_ptr) + +QT_BEGIN_NAMESPACE + +QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q) + : q_ptr(q), + lastError(QLowEnergyController::NoError), + controllerState(QLowEnergyController::UnconnectedState), + addressType(QLowEnergyController::PublicAddress) +{ + Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); + // This is the "wrong" constructor - no valid device UUID to connect later. +} + +QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q, + const QBluetoothDeviceInfo &deviceInfo) + : q_ptr(q), + deviceUuid(deviceInfo.deviceUuid()), + lastError(QLowEnergyController::NoError), + controllerState(QLowEnergyController::UnconnectedState), + addressType(QLowEnergyController::PublicAddress) +{ + Q_ASSERT_X(q, "QLowEnergyControllerPrivateOSX", "invalid q_ptr (null)"); +} + +QLowEnergyControllerPrivateOSX::~QLowEnergyControllerPrivateOSX() +{ +} + +bool QLowEnergyControllerPrivateOSX::isValid() const +{ + return false; +} + +void QLowEnergyControllerPrivateOSX::connectToDevice() +{ +} + +void QLowEnergyControllerPrivateOSX::discoverServices() +{ +} + +void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid &serviceUuid) +{ + Q_UNUSED(serviceUuid); +} + +QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddress, + QObject *parent) + : QObject(parent), + d_ptr(new QLowEnergyControllerPrivateOSX(this)) +{ + Q_UNUSED(remoteAddress) +} + +QLowEnergyController::QLowEnergyController(const QBluetoothDeviceInfo &remoteDevice, + QObject *parent) + : QObject(parent), + d_ptr(new QLowEnergyControllerPrivateOSX(this, remoteDevice)) +{ + Q_UNUSED(remoteDevice) +} + +QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddress, + const QBluetoothAddress &localAddress, + QObject *parent) + : QObject(parent), + d_ptr(new QLowEnergyControllerPrivateOSX(this)) +{ + OSX_D_PTR; + + osx_d_ptr->remoteAddress = remoteAddress; + osx_d_ptr->localAddress = localAddress; + + qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " + "construction with remote address is not supported"; +} + +QLowEnergyController::~QLowEnergyController() +{ + // TODO: disconnect, but this can be quite problematic - it's async. operation! + delete d_ptr; +} + +QBluetoothAddress QLowEnergyController::localAddress() const +{ + OSX_D_PTR; + + return osx_d_ptr->localAddress; +} + +QBluetoothAddress QLowEnergyController::remoteAddress() const +{ + OSX_D_PTR; + + return osx_d_ptr->remoteAddress; +} + +QLowEnergyController::ControllerState QLowEnergyController::state() const +{ + OSX_D_PTR; + + return osx_d_ptr->controllerState; +} + +QLowEnergyController::RemoteAddressType QLowEnergyController::remoteAddressType() const +{ + OSX_D_PTR; + + return osx_d_ptr->addressType; +} + +void QLowEnergyController::setRemoteAddressType(RemoteAddressType type) +{ + Q_UNUSED(type) + + OSX_D_PTR; + + osx_d_ptr->addressType = type; +} + +void QLowEnergyController::connectToDevice() +{ +} + +void QLowEnergyController::disconnectFromDevice() +{ +} + +void QLowEnergyController::discoverServices() +{ +} + +QList QLowEnergyController::services() const +{ + return QList(); +} + +QLowEnergyService *QLowEnergyController::createServiceObject(const QBluetoothUuid &serviceUuid, + QObject *parent) +{ + Q_UNUSED(serviceUuid) + Q_UNUSED(parent) + return Q_NULLPTR; +} + +QLowEnergyController::Error QLowEnergyController::error() const +{ + OSX_D_PTR; + + return osx_d_ptr->lastError; +} + +QString QLowEnergyController::errorString() const +{ + OSX_D_PTR; + + return osx_d_ptr->errorString; +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h new file mode 100644 index 00000000..6d48f591 --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Javier S. Pedro +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QLOWENERGYCONTROLLER_OSX_P_H +#define QLOWENERGYCONTROLLER_OSX_P_H + +#include "qlowenergycontroller_p.h" +#include "qlowenergycontroller.h" +#include "osx/osxbtutility_p.h" +#include "qbluetoothaddress.h" +#include "qbluetoothuuid.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +// The suffix OSX is not the very right, it's also iOS. +class QLowEnergyControllerPrivateOSX : public QLowEnergyControllerPrivate +{ + friend class QLowEnergyController; +public: + QLowEnergyControllerPrivateOSX(QLowEnergyController *q); + QLowEnergyControllerPrivateOSX(QLowEnergyController *q, + const QBluetoothDeviceInfo &uuid); + ~QLowEnergyControllerPrivateOSX(); + + bool isValid() const; + +private: + void connectToDevice(); + void discoverServices(); + void discoverServiceDetails(const QBluetoothUuid &serviceUuid); + + QLowEnergyController *q_ptr; + QBluetoothUuid deviceUuid; + + QString errorString; + QLowEnergyController::Error lastError; + + QBluetoothAddress localAddress; + QBluetoothAddress remoteAddress; + + QLowEnergyController::ControllerState controllerState; + QLowEnergyController::RemoteAddressType addressType; + + typedef QMap > ServiceMap; + typedef ServiceMap::const_iterator ConstServiceIterator; + typedef ServiceMap::iterator ServiceIterator; + ServiceMap discoveredServices; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 6a72fa6c..1ffeb6b6 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -34,6 +34,24 @@ #ifndef QLOWENERGYCONTROLLERPRIVATE_P_H #define QLOWENERGYCONTROLLERPRIVATE_P_H +#if defined(QT_OSX_BLUETOOTH) || defined(QT_IOS_BLUETOOTH) + +#include +#include + +QT_BEGIN_NAMESPACE + +class QLowEnergyControllerPrivate : public QObject +{ +public: + // This class is required to make shared pointer machinery and + // moc (== Obj-C syntax) happy on both OS X and iOS. +}; + +QT_END_NAMESPACE + +#else + #include #include #include @@ -195,4 +213,6 @@ private: QT_END_NAMESPACE +#endif // QT_OSX_BLUETOOTH || QT_IOS_BLUETOOTH + #endif // QLOWENERGYCONTROLLERPRIVATE_P_H diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm new file mode 100644 index 00000000..e2f5d35f --- /dev/null +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qlowenergycharacteristic.h" +#include "qlowenergydescriptor.h" +#include "qlowenergyservice.h" +#include "qbluetoothuuid.h" + +#include +#include + +QLowEnergyService::QLowEnergyService(QSharedPointer d, QObject *parent) + : QObject(parent), + d_ptr(d) +{ +} + +QLowEnergyService::~QLowEnergyService() +{ +} + +QList QLowEnergyService::includedServices() const +{ + return QList(); +} + +QLowEnergyService::ServiceTypes QLowEnergyService::type() const +{ + return PrimaryService; +} + +QLowEnergyService::ServiceState QLowEnergyService::state() const +{ + return InvalidService; +} + +QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const +{ + Q_UNUSED(uuid) + + return QLowEnergyCharacteristic(); +} + +QList QLowEnergyService::characteristics() const +{ + return QList(); +} + +QBluetoothUuid QLowEnergyService::serviceUuid() const +{ + return QBluetoothUuid(); +} + +QString QLowEnergyService::serviceName() const +{ + return QString(); +} + +void QLowEnergyService::discoverDetails() +{ +} + +QLowEnergyService::ServiceError QLowEnergyService::error() const +{ + return NoError; +} + +bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const +{ + Q_UNUSED(characteristic) + + return false; +} + +void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, + const QByteArray &newValue, + WriteMode mode) +{ + Q_UNUSED(characteristic) + Q_UNUSED(newValue) + Q_UNUSED(mode) +} + +bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const +{ + Q_UNUSED(descriptor) + return false; +} + +void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, + const QByteArray &newValue) +{ + Q_UNUSED(descriptor) + Q_UNUSED(newValue) +} diff --git a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro b/tests/auto/qlowenergycontroller/qlowenergycontroller.pro index 5360c796..9d25d8a3 100644 --- a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro +++ b/tests/auto/qlowenergycontroller/qlowenergycontroller.pro @@ -8,3 +8,7 @@ CONFIG += testcase SOURCES += tst_qlowenergycontroller.cpp +osx|ios { + QT += widgets + CONFIG += insignificant_test +} -- cgit v1.2.3 From 51dbe4a457c0bf81b96c898aab5d83b421e7a4f0 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 7 Nov 2014 14:00:40 +0100 Subject: QLowEnergyController - connectTo/disconnectFrom/Device (OS X, iOS) Implement connect to device/disconnect from device methods, add CentralManager class dealing with CBCentralManager (with additional external logic). - Improve error handling while in 'connecting' state. - Use the proper error (ConnectionError) instead of UnknownError + make the error handling more uniform while isConnecting == true. - Use isNull on QBluetoothUuid, no need in ugly 'hasUuid'. Change-Id: I84a704a746b4677ccb870b9c132db5f7359030c6 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbt.pri | 6 +- src/bluetooth/osx/osxbtcentralmanager.mm | 448 +++++++++++++++++++++++++++++ src/bluetooth/osx/osxbtcentralmanager_p.h | 128 +++++++++ src/bluetooth/qlowenergycontroller_osx.mm | 179 +++++++++++- src/bluetooth/qlowenergycontroller_osx_p.h | 27 +- 5 files changed, 780 insertions(+), 8 deletions(-) create mode 100644 src/bluetooth/osx/osxbtcentralmanager.mm create mode 100644 src/bluetooth/osx/osxbtcentralmanager_p.h diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 288afa6d..1eddcf4c 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -12,7 +12,8 @@ CONFIG(osx) { osx/osxbtobexsession_p.h \ osx/osxbtledeviceinquiry_p.h \ osx/corebluetoothwrapper_p.h \ - osx/osxbtcentralmanagerdelegate_p.h + osx/osxbtcentralmanagerdelegate_p.h \ + osx/osxbtcentralmanager_p.h OBJECTIVE_SOURCES += osx/osxbtutility.mm \ osx/osxbtdevicepair.mm \ @@ -26,7 +27,8 @@ CONFIG(osx) { osx/osxbtsocketlistener.mm \ osx/osxbtobexsession.mm \ osx/osxbtledeviceinquiry.mm \ - osx/osxbtcentralmanagerdelegate.mm + osx/osxbtcentralmanagerdelegate.mm \ + osx/osxbtcentralmanager.mm } else { PRIVATE_HEADERS += osx/osxbtutility_p.h \ osx/osxbtledeviceinquiry_p.h \ diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm new file mode 100644 index 00000000..d2e45832 --- /dev/null +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -0,0 +1,448 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "osxbtcentralmanagerdelegate_p.h" +#include "osxbtcentralmanager_p.h" + +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +namespace OSXBluetooth { + +CentralManagerDelegate::~CentralManagerDelegate() +{ +} + +} + +QT_END_NAMESPACE + + +#ifdef QT_NAMESPACE +using namespace QT_NAMESPACE; +#endif + +@interface QT_MANGLE_NAMESPACE(OSXBTCentralManager) (PrivateAPI) + +- (QLowEnergyController::Error)connectToDevice; // "Device" is in Qt's world ... +- (void)connectToPeripheral; // "Peripheral" is in Core Bluetooth. +- (bool)connected; + +@end + +@implementation QT_MANGLE_NAMESPACE(OSXBTCentralManager) + +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate +{ + Q_ASSERT_X(aDelegate, "-initWithDelegate:", "invalid delegate (null)"); + + if (self = [super init]) { + manager = nil; + managerState = OSXBluetooth::CentralManagerIdle; + disconnectPending = false; + peripheral = nil; + delegate = aDelegate; + } + + return self; +} + +- (void)dealloc +{ + typedef QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) TransientDelegate; + + if (managerState == OSXBluetooth::CentralManagerUpdating) { + // Here we have to trick with a transient delegate not to + // delete the manager too early - or Core Bluetooth will crash. + // State was not updated yet, too early to release. + TransientDelegate *const transient = [[TransientDelegate alloc] initWithManager:manager]; + // On ARC the lifetime of a transient delegate will become a problem, since delegate itself + // is a weak reference in a manager. + [manager setDelegate:transient]; + } else { + [manager setDelegate:nil]; + [manager release]; + } + + [peripheral setDelegate:nil]; + [peripheral release]; + + [super dealloc]; +} + +- (QLowEnergyController::Error)connectToDevice:(const QBluetoothUuid &)aDeviceUuid +{ + Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, "-connectToDevice", + "invalid state"); // QLowEnergyController connects only if in UnconnectedState. + + deviceUuid = aDeviceUuid; + + if (!manager) { + managerState = OSXBluetooth::CentralManagerUpdating; // We'll have to wait for updated state. + manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; + if (!manager) { + managerState = OSXBluetooth::CentralManagerIdle; + qCWarning(QT_BT_OSX) << "-connectToDevice:, failed to allocate a " + "central manager"; + return QLowEnergyController::ConnectionError; + } + return QLowEnergyController::NoError; + } else { + return [self connectToDevice]; + } +} + +- (QLowEnergyController::Error)connectToDevice +{ + Q_ASSERT_X(manager, "-connectToDevice", "invalid central manager (nil)"); + Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, + "-connectToDevice", "invalid state"); + + if ([self isConnected]) { + qCDebug(QT_BT_OSX) << "-connectToDevice, already connected"; + delegate->connectSuccess(); + return QLowEnergyController::NoError; + } else if (peripheral) { + // Was retrieved already, but not connected + // or disconnected. + [self connectToPeripheral]; + return QLowEnergyController::NoError; + } + + using namespace OSXBluetooth; + + // Retrieve a peripheral first ... + ObjCScopedPointer uuids([[NSMutableArray alloc] init]); + if (!uuids) { + qCWarning(QT_BT_OSX) << "-connectToDevice, failed to allocate identifiers"; + return QLowEnergyController::ConnectionError; + } + +#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) + const quint128 qtUuidData(deviceUuid.toUInt128()); + // STATIC_ASSERT on sizes would be handy! + uuid_t uuidData = {}; + std::copy(qtUuidData.data, qtUuidData.data + 16, uuidData); + const ObjCScopedPointer nsUuid([[NSUUID alloc] initWithUUIDBytes:uuidData]); + if (!nsUuid) { + qCWarning(QT_BT_OSX) << "-connectToDevice, failed to allocate NSUUID identifier"; + return QLowEnergyController::ConnectionError; + } + + [uuids addObject:nsUuid]; + + // With the latest CoreBluetooth, we can synchronously retrive peripherals: + QT_BT_MAC_AUTORELEASEPOOL; + NSArray *const peripherals = [manager retrievePeripheralsWithIdentifiers:uuids]; + if (!peripherals || peripherals.count != 1) { + qCWarning(QT_BT_OSX) << "-connectToDevice, failed to retrive a peripheral"; + return QLowEnergyController::UnknownRemoteDeviceError; + } + + peripheral = [static_cast([peripherals objectAtIndex:0]) retain]; + [self connectToPeripheral]; + + return QLowEnergyController::NoError; +#else + OSXBluetooth::CFStrongReference cfUuid(OSXBluetooth::cf_uuid(deviceUuid)); + if (!cfUuid) { + qCWarning(QT_BT_OSX) << "-connectToDevice:, failed to create CFUUID object"; + return QLowEnergyController::ConnectionError; + } + // TODO: With ARC this cast will be illegal: + [uuids addObject:(id)cfUuid.data()]; + // Unfortunately, with old Core Bluetooth this call is asynchronous ... + managerState = OSXBluetooth::CentralManagerConnecting; + [manager retrievePeripherals:uuids]; + + return QLowEnergyController::NoError; +#endif +} + +- (void)connectToPeripheral +{ + Q_ASSERT_X(manager, "-connectToPeripheral", "invalid central manager (nil)"); + Q_ASSERT_X(peripheral, "-connectToPeripheral", "invalid peripheral (nil)"); + Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, + "-connectToPeripheral", "invalid state"); + + // The state is still the same - connecting. + if ([self isConnected]) { + qCDebug(QT_BT_OSX) << "-connectToPeripheral, already connected"; + delegate->connectSuccess(); + } else { + qCDebug(QT_BT_OSX) << "-connectToPeripheral, trying to connect"; + managerState = OSXBluetooth::CentralManagerConnecting; + [manager connectPeripheral:peripheral options:nil]; + } +} + +- (bool)isConnected +{ + if (!peripheral) + return false; + +#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_7_0) + return peripheral.state == CBPeripheralStateConnected; +#else + return peripheral.isConnected; +#endif +} + +- (void)disconnectFromDevice +{ + if (managerState == OSXBluetooth::CentralManagerUpdating) { + disconnectPending = true; + } else { + disconnectPending = false; + + if ([self isConnected]) { + Q_ASSERT_X(peripheral, "-disconnectFromDevice", "invalid peripheral (nil)"); + Q_ASSERT_X(manager, "-disconnectFromDevice", "invalid central manager (nil)"); + managerState = OSXBluetooth::CentralManagerDisconnecting; + [manager cancelPeripheralConnection:peripheral]; + } else { + managerState = OSXBluetooth::CentralManagerIdle; + delegate->disconnected(); + } + } +} + +- (void)discoverServices +{ +} + +- (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid +{ + Q_UNUSED(serviceUuid) + return false; +} + +- (bool)discoverCharacteristics:(const QBluetoothUuid &)serviceUuid +{ + Q_UNUSED(serviceUuid) + return false; +} + +// CBCentralManagerDelegate (the real one). + +- (void)centralManagerDidUpdateState:(CBCentralManager *)central +{ + Q_ASSERT_X(delegate, "-centralManagerDidUpdateState:", "invalid delegate (null)"); + + using namespace OSXBluetooth; + + const CBCentralManagerState state = central.state; + + if (state == CBCentralManagerStateUnknown + || state == CBCentralManagerStateResetting) { + // We still have to wait, docs say: + // "The current state of the central manager is unknown; + // an update is imminent." or + // "The connection with the system service was momentarily + // lost; an update is imminent." + return; + } + + if (disconnectPending) { + disconnectPending = false; + managerState = OSXBluetooth::CentralManagerIdle; + return [self disconnectFromDevice]; + } + + // Let's check some states we do not like first: + if (state == CBCentralManagerStateUnsupported || state == CBCentralManagerStateUnauthorized) { + if (managerState == CentralManagerUpdating) { + // We tried to connect just to realize, LE is not supported. Report this. + managerState = CentralManagerIdle; + delegate->LEnotSupported(); + } else { + // TODO: if we are here, LE _was_ supported and we first managed to update + // and reset managerState from CentralManagerUpdating. + managerState = CentralManagerIdle; + delegate->error(QLowEnergyController::InvalidBluetoothAdapterError); + } + return; + } + + if (state == CBCentralManagerStatePoweredOff) { + if (managerState == CentralManagerUpdating) { + // I've seen this instead of Unsopported on OS X. + managerState = CentralManagerIdle; + delegate->LEnotSupported(); + } else { + managerState = CentralManagerIdle; + // TODO: we need a better error + + // what will happen if later the state changes to PoweredOn??? + delegate->error(QLowEnergyController::InvalidBluetoothAdapterError); + } + return; + } + + if (state == CBCentralManagerStatePoweredOn) { + if (managerState == CentralManagerUpdating) { + managerState = CentralManagerIdle; + const QLowEnergyController::Error status = [self connectToDevice]; + if (status != QLowEnergyController::NoError)// An allocation problem? + delegate->error(status); + } + } else { + // We actually handled all known states, but .. Core Bluetooth can change? + Q_ASSERT_X(0, "-centralManagerDidUpdateState:", "invalid centra's state"); + } +} + +- (void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals +{ + Q_UNUSED(central) + + // This method is required for iOS before 7.0 and OS X below 10.9. + Q_ASSERT_X(manager, "-centralManager:didRetrivePeripherals:", "invalid central manager (nil)"); + + if (managerState != OSXBluetooth::CentralManagerConnecting) { + // Canceled by calling -disconnectFromDevice method. + return; + } + + managerState = OSXBluetooth::CentralManagerIdle; + + if (!peripherals || peripherals.count != 1) { + Q_ASSERT_X(delegate, "-centralManager:didRetrievePeripherals:", + "invalid delegate (null)"); + + qCDebug(QT_BT_OSX) << "-centralManager:didRetrievePeripherals:, " + "unexpected number of peripherals (!= 1)"; + + delegate->error(QLowEnergyController::UnknownRemoteDeviceError); + } else { + peripheral = [static_cast([peripherals objectAtIndex:0]) retain]; + [self connectToPeripheral]; + } +} + +- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)aPeripheral +{ + Q_UNUSED(central) + Q_UNUSED(aPeripheral) + + Q_ASSERT_X(delegate, "-centralManager:didConnectPeripheral:", + "invalid delegate (null)"); + + if (managerState != OSXBluetooth::CentralManagerConnecting) { + // We called cancel but before disconnected, managed to connect? + return; + } + + managerState = OSXBluetooth::CentralManagerIdle; + delegate->connectSuccess(); +} + +- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)aPeripheral + error:(NSError *)error +{ + Q_UNUSED(central) + Q_UNUSED(aPeripheral) + Q_UNUSED(error) + + Q_ASSERT_X(delegate, "-centralManager:didFailToConnectPeripheral:", + "invalid delegate (null)"); + + if (managerState != OSXBluetooth::CentralManagerConnecting) { + // Canceled already. + return; + } + + managerState = OSXBluetooth::CentralManagerIdle; + // TODO: better error mapping is required. + delegate->error(QLowEnergyController::UnknownRemoteDeviceError); +} + +- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)aPeripheral + error:(NSError *)error +{ + Q_UNUSED(central) + Q_UNUSED(aPeripheral) + + Q_ASSERT_X(delegate, "-centralManager:didDisconnectPeripheral:error:", + "invalid delegate (null)"); + + if (error && managerState == OSXBluetooth::CentralManagerDisconnecting) { + managerState = OSXBluetooth::CentralManagerIdle; + qCWarning(QT_BT_OSX) << "-centralManager:didDisconnectPeripheral:, " + "failed to disconnect"; + // TODO: instead of 'unknown' - .. ? + delegate->error(QLowEnergyController::UnknownRemoteDeviceError); + } else { + managerState = OSXBluetooth::CentralManagerIdle; + delegate->disconnected(); + } +} + +// CBPeripheralDelegate. + +- (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverServices:(NSError *)error +{ + Q_UNUSED(aPeripheral) + Q_UNUSED(error) +} + + +- (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverIncludedServicesForService:(CBService *)service + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + Q_UNUSED(service) + Q_UNUSED(error) +} + +- (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverCharacteristicsForService:(CBService *)service + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + Q_UNUSED(service) + Q_UNUSED(error) +} + +@end diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h new file mode 100644 index 00000000..5f836f42 --- /dev/null +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 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 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef OSXBTCENTRALMANAGER_P_H +#define OSXBTCENTRALMANAGER_P_H + +#include "qlowenergycontroller.h" +#include "qbluetoothuuid.h" +#include "osxbtutility_p.h" + +#include + +// Foundation.h must be included before corebluetoothwrapper_p.h - +// a workaround for a broken 10.9 SDK. +#include + +#include "corebluetoothwrapper_p.h" + +@class QT_MANGLE_NAMESPACE(OSXBTCentralManager); + +QT_BEGIN_NAMESPACE + +namespace OSXBluetooth { + +class CentralManagerDelegate +{ +public: + typedef QT_MANGLE_NAMESPACE(OSXBTCentralManager) ObjCCentralManager; + typedef ObjCStrongReference LEServices; + typedef LEServices LECharacteristics; + + virtual ~CentralManagerDelegate(); + + virtual void LEnotSupported() = 0; + virtual void connectSuccess() = 0; + virtual void serviceDiscoveryFinished(LEServices services) = 0; + virtual void includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LEServices services) = 0; + virtual void characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LECharacteristics characteristics) = 0; + virtual void disconnected() = 0; + + // General errors. + virtual void error(QLowEnergyController::Error error) = 0; + // Service related errors. + virtual void error(const QBluetoothUuid &serviceUuid, + QLowEnergyController::Error error) = 0; +}; + +enum CentralManagerState +{ + // QLowEnergyController already has some of these states, + // but it's not enough and we need more special states here. + CentralManagerIdle, + // Required by CBCentralManager to avoid problems with dangled pointers. + CentralManagerUpdating, + CentralManagerConnecting, + CentralManagerDiscovering, + CentralManagerDisconnecting +}; + +} + +QT_END_NAMESPACE + +@interface QT_MANGLE_NAMESPACE(OSXBTCentralManager) : NSObject +{ + CBCentralManager *manager; + QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerState managerState; + bool disconnectPending; + + QBluetoothUuid deviceUuid; + CBPeripheral *peripheral; + + QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *delegate; +} + +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; +- (void)dealloc; + +- (QLowEnergyController::Error)connectToDevice:(const QBluetoothUuid &)aDeviceUuid; +- (void)disconnectFromDevice; + +- (void)discoverServices; +- (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid; +- (bool)discoverCharacteristics:(const QBluetoothUuid &)serviceUuid; + +@end + +#endif diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 08721933..6e62844c 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -53,23 +53,39 @@ QT_BEGIN_NAMESPACE QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q) : q_ptr(q), + isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), addressType(QLowEnergyController::PublicAddress) { - Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); // This is the "wrong" constructor - no valid device UUID to connect later. + Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); + // We still create a manager, to simplify error handling later. + centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); + if (!centralManager) { + qCWarning(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::" + "QBluetoothLowEnergyControllerPrivateOSX(), " + "failed to initialize central manager"; + } + } QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q, const QBluetoothDeviceInfo &deviceInfo) : q_ptr(q), deviceUuid(deviceInfo.deviceUuid()), + isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), addressType(QLowEnergyController::PublicAddress) { Q_ASSERT_X(q, "QLowEnergyControllerPrivateOSX", "invalid q_ptr (null)"); + centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); + if (!centralManager) { + qCWarning(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::" + "QBluetoothLowEnergyControllerPrivateOSX(), " + "failed to initialize central manager"; + } } QLowEnergyControllerPrivateOSX::~QLowEnergyControllerPrivateOSX() @@ -78,11 +94,136 @@ QLowEnergyControllerPrivateOSX::~QLowEnergyControllerPrivateOSX() bool QLowEnergyControllerPrivateOSX::isValid() const { - return false; + // isValid means only "was able to allocate all resources", + // nothing more. + return centralManager; +} + +void QLowEnergyControllerPrivateOSX::LEnotSupported() +{ + // Report as an error. But this should not be possible + // actually: before connecting to any device, we have + // to discover it, if it was discovered ... LE _must_ + // be supported. +} + +void QLowEnergyControllerPrivateOSX::connectSuccess() +{ + Q_ASSERT_X(controllerState == QLowEnergyController::ConnectingState, + "connectSuccess", "invalid state"); + + controllerState = QLowEnergyController::ConnectedState; + + if (!isConnecting) { + emit q_ptr->stateChanged(QLowEnergyController::ConnectedState); + emit q_ptr->connected(); + } +} + +void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices services) +{ + Q_UNUSED(services) +} + +void QLowEnergyControllerPrivateOSX::includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LEServices services) +{ + Q_UNUSED(serviceUuid) + Q_UNUSED(services) +} + +void QLowEnergyControllerPrivateOSX::characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LECharacteristics characteristics) +{ + Q_UNUSED(serviceUuid) + Q_UNUSED(characteristics) +} + + +void QLowEnergyControllerPrivateOSX::disconnected() +{ + controllerState = QLowEnergyController::UnconnectedState; + + if (!isConnecting) { + emit q_ptr->stateChanged(QLowEnergyController::UnconnectedState); + emit q_ptr->disconnected(); + } +} + +void QLowEnergyControllerPrivateOSX::error(QLowEnergyController::Error errorCode) +{ + // Errors reported during connect and general errors. + lastError = errorCode; + + // We're still in connectToDevice, + // some error was reported synchronously. + // Return, the error will be correctly set later + // by connectToDevice. + if (isConnecting) + return; + + switch (lastError) { + case QLowEnergyController::UnknownRemoteDeviceError: + errorString = QLowEnergyController::tr("Remote device cannot be found"); + break; + case QLowEnergyController::InvalidBluetoothAdapterError: + errorString = QLowEnergyController::tr("Cannot find local adapter"); + break; + case QLowEnergyController::NetworkError: + errorString = QLowEnergyController::tr("Error occurred during connection I/O"); + break; + case QLowEnergyController::UnknownError: + default: + errorString = QLowEnergyController::tr("Unknown Error"); + break; + } + + emit q_ptr->error(lastError); +} + +void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, + QLowEnergyController::Error errorCode) +{ + // Service/characteristics-related errors. + Q_UNUSED(serviceUuid) + Q_UNUSED(errorCode) } void QLowEnergyControllerPrivateOSX::connectToDevice() { + Q_ASSERT_X(isValid(), "connectToDevice", "invalid private controller"); + Q_ASSERT_X(controllerState == QLowEnergyController::UnconnectedState, + "connectToDevice", "invalid state"); + Q_ASSERT_X(!deviceUuid.isNull(), "connectToDevice", + "invalid private controller (no device uuid)"); + Q_ASSERT_X(!isConnecting, "connectToDevice", + "recursive connectToDevice call"); + + lastError = QLowEnergyController::NoError; + errorString.clear(); + + isConnecting = true;// Do not emit signals if some callback is executed synchronously. + controllerState = QLowEnergyController::ConnectingState; + const QLowEnergyController::Error status = [centralManager connectToDevice:deviceUuid]; + isConnecting = false; + + if (status == QLowEnergyController::NoError && lastError == QLowEnergyController::NoError) { + emit q_ptr->stateChanged(controllerState); + if (controllerState == QLowEnergyController::ConnectedState) { + // If a peripheral is connected already from the Core Bluetooth's + // POV: + emit q_ptr->connected(); + } else if (controllerState == QLowEnergyController::UnconnectedState) { + // Ooops, tried to connect, got peripheral disconnect instead - + // this happens with Core Bluetooth. + emit q_ptr->disconnected(); + } + } else if (status != QLowEnergyController::NoError) { + error(status); + } else { + // Re-set the error/description and emit. + error(lastError); + } } void QLowEnergyControllerPrivateOSX::discoverServices() @@ -100,6 +241,9 @@ QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddres d_ptr(new QLowEnergyControllerPrivateOSX(this)) { Q_UNUSED(remoteAddress) + + qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " + "construction with remote address is not supported!"; } QLowEnergyController::QLowEnergyController(const QBluetoothDeviceInfo &remoteDevice, @@ -107,7 +251,8 @@ QLowEnergyController::QLowEnergyController(const QBluetoothDeviceInfo &remoteDev : QObject(parent), d_ptr(new QLowEnergyControllerPrivateOSX(this, remoteDevice)) { - Q_UNUSED(remoteDevice) + // That's the only "real" ctor - with Core Bluetooth we need a _valid_ deviceUuid + // from 'remoteDevice'. } QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddress, @@ -122,12 +267,12 @@ QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddres osx_d_ptr->localAddress = localAddress; qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " - "construction with remote address is not supported"; + "construction with remote/local addresses is not supported!"; } QLowEnergyController::~QLowEnergyController() { - // TODO: disconnect, but this can be quite problematic - it's async. operation! + // Deleting a peripheral will also disconnect. delete d_ptr; } @@ -170,10 +315,34 @@ void QLowEnergyController::setRemoteAddressType(RemoteAddressType type) void QLowEnergyController::connectToDevice() { + OSX_D_PTR; + + // A memory allocation problem. + if (!osx_d_ptr->isValid()) + return osx_d_ptr->error(UnknownError); + + // No QBluetoothDeviceInfo provided during construction. + if (!osx_d_ptr->deviceUuid.isNull()) + return osx_d_ptr->error(UnknownRemoteDeviceError); + + if (osx_d_ptr->controllerState != UnconnectedState) + return; + + osx_d_ptr->connectToDevice(); } void QLowEnergyController::disconnectFromDevice() { + if (state() == UnconnectedState || state() == ClosingState) + return; + + OSX_D_PTR; + + if (osx_d_ptr->isValid()) { + osx_d_ptr->controllerState = ClosingState; + emit stateChanged(ClosingState); + [osx_d_ptr->centralManager disconnectFromDevice]; + } } void QLowEnergyController::discoverServices() diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index 6d48f591..4162c764 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -34,6 +34,7 @@ #ifndef QLOWENERGYCONTROLLER_OSX_P_H #define QLOWENERGYCONTROLLER_OSX_P_H +#include "osx/osxbtcentralmanager_p.h" #include "qlowenergycontroller_p.h" #include "qlowenergycontroller.h" #include "osx/osxbtutility_p.h" @@ -47,7 +48,8 @@ QT_BEGIN_NAMESPACE // The suffix OSX is not the very right, it's also iOS. -class QLowEnergyControllerPrivateOSX : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateOSX : public QLowEnergyControllerPrivate, + public OSXBluetooth::CentralManagerDelegate { friend class QLowEnergyController; public: @@ -59,12 +61,32 @@ public: bool isValid() const; private: + // CentralManagerDelegate: + void LEnotSupported() Q_DECL_OVERRIDE; + void connectSuccess() Q_DECL_OVERRIDE; + + void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; + void includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LEServices services) Q_DECL_OVERRIDE; + void characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, + LECharacteristics characteristics) Q_DECL_OVERRIDE; + void disconnected() Q_DECL_OVERRIDE; + void error(QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; + void error(const QBluetoothUuid &serviceUuid, + QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; + void connectToDevice(); void discoverServices(); void discoverServiceDetails(const QBluetoothUuid &serviceUuid); QLowEnergyController *q_ptr; QBluetoothUuid deviceUuid; + // To be sure we set controller's state correctly + // (Connecting or Connected) we have to know if we're + // still inside connectToDevice - this is important, + // if a peripheral is _already_ connected from Core Bluetooth's + // point of view. + bool isConnecting; QString errorString; QLowEnergyController::Error lastError; @@ -75,6 +97,9 @@ private: QLowEnergyController::ControllerState controllerState; QLowEnergyController::RemoteAddressType addressType; + typedef OSXBluetooth::ObjCScopedPointer CentralManager; + CentralManager centralManager; + typedef QMap > ServiceMap; typedef ServiceMap::const_iterator ConstServiceIterator; typedef ServiceMap::iterator ServiceIterator; -- cgit v1.2.3 From 2f4269da610083795440545c7f191eea1c9c3c4c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 11 Nov 2014 13:27:55 +0100 Subject: Support for QLEService::writeCharacteristic() on Android Currently only the WriteWithResponse mode works and has been tested. Change-Id: I7947b67f737f5878a01704c09d3a9a532a41b820 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 120 ++++++++++++++++++++- src/bluetooth/android/jni_android.cpp | 2 + src/bluetooth/android/lowenergynotificationhub.cpp | 25 +++++ src/bluetooth/android/lowenergynotificationhub_p.h | 5 + src/bluetooth/qlowenergycontroller_android.cpp | 61 ++++++++++- src/bluetooth/qlowenergycontroller_p.h | 3 + 6 files changed, 212 insertions(+), 4 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 84744a4d..c5198dbd 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -242,7 +242,26 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattCharacteristic characteristic, int status) { - System.out.println("onCharacteristicWrite"); + if (status != BluetoothGatt.GATT_SUCCESS) + Log.w(TAG, "onCharacteristicWrite: error " + status); + + int handle = handleForCharacteristic(characteristic); + if (handle == -1) { + Log.w(TAG,"onCharacteristicWrite: cannot find handle"); + return; + } + + int errorCode = 0; + //This must be in sync with QLowEnergyService::ServiceError + switch (status) { + case BluetoothGatt.GATT_SUCCESS: + errorCode = 0; break; // NoError + default: + errorCode = 2; break; // CharacteristicWriteError + + } + + leCharacteristicWritten(qtObject, handle+1, characteristic.getValue(), errorCode); } public void onCharacteristicChanged(android.bluetooth.BluetoothGatt gatt, @@ -383,6 +402,82 @@ public class QtBluetoothLE { ArrayList entries = new ArrayList(100); private LinkedList servicesToBeDiscovered = new LinkedList(); + /* + Internal helper function + Returns the handle id for the given characteristic; otherwise returns -1. + + Note that this is the Java handle. The Qt handle is the Java handle +1. + */ + private int handleForCharacteristic(BluetoothGattCharacteristic characteristic) + { + if (characteristic == null) + return -1; + + List handles = uuidToEntry.get(characteristic.getService().getUuid()); + if (handles == null || handles.isEmpty()) + return -1; + + //TODO for now we assume we always want the first service in case of uuid collision + int serviceHandle = handles.get(0); + + try { + GattEntry entry = null; + for (int i = serviceHandle+1; i < entries.size(); i++) { + entry = entries.get(i); + switch (entry.type) { + case Descriptor: + case CharacteristicValue: + continue; + case Service: + break; + case Characteristic: + if (entry.characteristic == characteristic) + return i; + break; + } + } + } catch (IndexOutOfBoundsException ex) { /*nothing*/ } + return -1; + } + + /* + Internal helper function + Returns the handle id for the given descriptor; otherwise returns -1. + + Note that this is the Java handle. The Qt handle is the Java handle +1. + */ + private int handleForDescriptor(BluetoothGattDescriptor descriptor) + { + if (descriptor == null) + return -1; + + List handles = uuidToEntry.get(descriptor.getCharacteristic().getService().getUuid()); + if (handles == null || handles.isEmpty()) + return -1; + + //TODO for now we assume we always want the first service in case of uuid collision + int serviceHandle = handles.get(0); + + try { + GattEntry entry = null; + for (int i = serviceHandle+1; i < entries.size(); i++) { + entry = entries.get(i); + switch (entry.type) { + case Characteristic: + case CharacteristicValue: + continue; + case Service: + break; + case Descriptor: + if (entry.descriptor == descriptor) + return i; + break; + } + } + } catch (IndexOutOfBoundsException ex) { } + return -1; + } + private void populateHandles() { // We introduce the notion of artificial handles. While GATT handles @@ -613,6 +708,27 @@ public class QtBluetoothLE { } } + /*************************************************************/ + /* Write Characteristics */ + /*************************************************************/ + + public boolean writeCharacteristic(int charHandle, byte[] newValue) + { + if (mBluetoothGatt == null) + return false; + + GattEntry entry = null; + try { + entry = entries.get(charHandle-1); //Qt always uses handles+1 + } catch (IndexOutOfBoundsException ex) { + ex.printStackTrace(); + return false; + } + + entry.characteristic.setValue(newValue); + return mBluetoothGatt.writeCharacteristic(entry.characteristic); + } + public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid, @@ -622,6 +738,8 @@ public class QtBluetoothLE { int properties, byte[] data); public native void leDescriptorRead(long qtObject, String serviceUuid, String charUuid, int descHandle, String descUuid, byte[] data); + public native void leCharacteristicWritten(long qtObject, int charHandle, byte[] newData, + int errorCode); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index 745a0c98..f98762b7 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -209,6 +209,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_characteristicRead}, {"leDescriptorRead", "(JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;[B)V", (void *) LowEnergyNotificationHub::lowEnergy_descriptorRead}, + {"leCharacteristicWritten", "(JI[BI)V", + (void *) LowEnergyNotificationHub::lowEnergy_characteristicWritten}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 30b69edc..4995dc0e 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -210,4 +210,29 @@ void LowEnergyNotificationHub::lowEnergy_descriptorRead( Q_ARG(QByteArray, payload)); } +void LowEnergyNotificationHub::lowEnergy_characteristicWritten( + JNIEnv *env, jobject, jlong qtObject, jint charHandle, + jbyteArray data, jint errorCode) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QByteArray payload; + if (data) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(data); + payload.resize(length); + env->GetByteArrayRegion(data, 0, length, + reinterpret_cast(payload.data())); + } + + QMetaObject::invokeMethod(hub, "characteristicWritten", Qt::QueuedConnection, + Q_ARG(int, charHandle), + Q_ARG(QByteArray, payload), + Q_ARG(QLowEnergyService::ServiceError, + (QLowEnergyService::ServiceError)errorCode)); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 39008a65..49705799 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -68,6 +68,9 @@ public: static void lowEnergy_descriptorRead(JNIEnv *env, jobject, jlong qtObject, jobject sUuid, jobject cUuid, jint handle, jobject dUuid, jbyteArray data); + static void lowEnergy_characteristicWritten(JNIEnv *, jobject, jlong qtObject, + jint charHandle, jbyteArray data, + jint errorCode); QAndroidJniObject javaObject() { @@ -85,6 +88,8 @@ signals: int properties, const QByteArray &data); void descriptorRead(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, int handle, const QBluetoothUuid &descUuid, const QByteArray &data); + void characteristicWritten(int charHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 4801d9bf..4f8bfc5e 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -74,6 +74,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::characteristicRead); connect(hub, &LowEnergyNotificationHub::descriptorRead, this, &QLowEnergyControllerPrivate::descriptorRead); + connect(hub, &LowEnergyNotificationHub::characteristicWritten, + this, &QLowEnergyControllerPrivate::characteristicWritten); } if (!hub->javaObject().isValid()) { @@ -144,11 +146,41 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s qCDebug(QT_BT_ANDROID) << "Discovery of" << service << "started"; } -void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/, - const QByteArray &/*newValue*/, +void QLowEnergyControllerPrivate::writeCharacteristic( + const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QByteArray &newValue, bool /*writeWithResponse*/) { + //TODO don't ignore WriteWithResponse, right now we assume responses + Q_ASSERT(!service.isNull()); + + if (!service->characteristicList.contains(charHandle)) + return; + + QAndroidJniEnvironment env; + jbyteArray payload; + payload = env->NewByteArray(newValue.size()); + env->SetByteArrayRegion(payload, 0, newValue.size(), + (jbyte *)newValue.constData()); + + bool result = false; + if (hub) { + result = hub->javaObject().callMethod("writeCharacteristic", "(I[B)Z", + charHandle, payload); + } + + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + result = false; + } + + env->DeleteLocalRef(payload); + + if (!result) + QMetaObject::invokeMethod(service.data(), "error", Qt::QueuedConnection, + Q_ARG(QLowEnergyHandle, charHandle)); } void QLowEnergyControllerPrivate::writeDescriptor( @@ -298,4 +330,27 @@ void QLowEnergyControllerPrivate::descriptorRead( } } +void QLowEnergyControllerPrivate::characteristicWritten( + int charHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) +{ + QSharedPointer service = + serviceForHandle(charHandle); + if (service.isNull()) + return; + + if (errorCode != QLowEnergyService::NoError) { + service->setError(errorCode); + return; + } + + QLowEnergyCharacteristic characteristic = characteristicForHandle(charHandle); + if (!characteristic.isValid()) { + qCWarning(QT_BT_ANDROID) << "characteristicWritten: Cannot find characteristic"; + return; + } + + updateValueOfCharacteristic(charHandle, data, false); + emit service->characteristicWritten(characteristic, data); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 1ffeb6b6..92af2cd1 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -204,6 +204,9 @@ private slots: const QByteArray& data); void descriptorRead(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, int handle, const QBluetoothUuid &descUuid, const QByteArray &data); + void characteristicWritten(int charHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); + #endif private: -- cgit v1.2.3 From 720137353b3d6ecb6a07d1f5486ab20306be8134 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 11 Nov 2014 14:25:34 +0100 Subject: Fix intermittent failure when mapping handles to services startHandle and endHandle were randomly initialized and thus QLowEnergyControllerPrivate::serviceForHandle(..) failed at the same rate. In addition this adds a few debug logs which turned out useful when debugging the above issue. Change-Id: I41b65274213a66fa100d8c69bba02be0bb876b65 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_android.cpp | 8 +++++++- src/bluetooth/qlowenergyserviceprivate.cpp | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 4f8bfc5e..3891bb5b 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -166,6 +166,8 @@ void QLowEnergyControllerPrivate::writeCharacteristic( bool result = false; if (hub) { + qCDebug(QT_BT_ANDROID) << "Write characteristic with handle " << charHandle + << newValue.toHex() << "(service:" << service->uuid << ")"; result = hub->javaObject().callMethod("writeCharacteristic", "(I[B)Z", charHandle, payload); } @@ -271,7 +273,7 @@ void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( pointer->endHandle = endHandle; qCDebug(QT_BT_ANDROID) << "Service" << serviceUuid << "discovered (start:" - << startHandle << "end:" << endHandle << ")"; + << startHandle << "end:" << endHandle << ")" << pointer.data(); pointer->setState(QLowEnergyService::ServiceDiscovered); } @@ -338,6 +340,10 @@ void QLowEnergyControllerPrivate::characteristicWritten( if (service.isNull()) return; + + qCDebug(QT_BT_ANDROID) << "Characteristic write confirmation" << service->uuid + << charHandle << data.toHex() << errorCode; + if (errorCode != QLowEnergyService::NoError) { service->setError(errorCode); return; diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 7c310123..3b4ea64e 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -37,6 +37,8 @@ QT_BEGIN_NAMESPACE QLowEnergyServicePrivate::QLowEnergyServicePrivate(QObject *parent) : QObject(parent), + startHandle(0), + endHandle(0), type(QLowEnergyService::PrimaryService), state(QLowEnergyService::InvalidService), lastError(QLowEnergyService::NoError) -- cgit v1.2.3 From 53dad9ebc8e1caa8c13a8b964ecdede381067340 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 7 Nov 2014 15:29:59 +0100 Subject: QLowEnergyController - service discovery (OS X, iOS) Implement discoverServices and delegate's methods to work with a service discovery on a peripheral. - CBUUID (it's internal data) can be only 2 bytes long (16-bit shortened UUID) despite of the docs saying 'CBUUID is a 16-bit UUID'. - property 'isPrimary' did not exist prior to 10.9 SDK (OS X). Change-Id: If692d147c0479ed69a331514617e3ef2a986cdf4 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 35 ++++++++++++- src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h | 2 + src/bluetooth/osx/osxbtutility.mm | 29 +++++++++-- src/bluetooth/qlowenergycontroller_osx.mm | 60 ++++++++++++++++++++--- 4 files changed, 114 insertions(+), 12 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index d2e45832..32fad1db 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -252,6 +252,20 @@ using namespace QT_NAMESPACE; - (void)discoverServices { + Q_ASSERT_X(peripheral, "-discoverServices", "invalid peripheral (nil)"); + Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, + "-discoverServices", "invalid state"); + + // From Apple's docs: + // + //"If the servicesUUIDs parameter is nil, all the available + //services of the peripheral are returned; setting the + //parameter to nil is considerably slower and is not recommended." + // + // ... but we'd like to have them all: + [peripheral setDelegate:self]; + managerState = OSXBluetooth::CentralManagerDiscovering; + [peripheral discoverServices:nil]; } - (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid @@ -425,7 +439,26 @@ using namespace QT_NAMESPACE; - (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverServices:(NSError *)error { Q_UNUSED(aPeripheral) - Q_UNUSED(error) + + + if (managerState != OSXBluetooth::CentralManagerDiscovering) { + // Canceled by -disconnectFromDevice. + return; + } + + managerState = OSXBluetooth::CentralManagerIdle; + + if (error) { + // NSLog, not qCDebug/Warning - to print the error. + NSLog(@"-peripheral:didDiscoverServices:, failed with error %@", error); + // TODO: better error mapping required. + delegate->error(QLowEnergyController::UnknownError); + } else { + QT_BT_MAC_AUTORELEASEPOOL; + + OSXBluetooth::ObjCStrongReference services(peripheral.services, true); + delegate->serviceDiscoveryFinished(services); + } } diff --git a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h b/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h index 65b5e61f..196e14d0 100644 --- a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h +++ b/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h @@ -54,6 +54,8 @@ // and later in the delegate's -centralManagerDidUpdateState: we are trying to finally release // a manager. Otherwise, this thing dies even with ARC. +// TODO: can not reproduce this crash anymore ... probably, this class will be removed soon. + @interface QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) : NSObject { CBCentralManager *manager; diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index 74ee84e6..69e94434 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -165,19 +165,38 @@ QString qt_error_string(IOReturn errorCode) QBluetoothUuid qt_uuid(CBUUID *uuid) { + // Apples' docs say "128 bit" and "16-bit UUIDs are implicitly + // pre-filled with the Bluetooth Base UUID." + // But Core Bluetooth can return CBUUID objects of length 2 + // (16-bit, so they are not pre-filled?). + if (!uuid) return QBluetoothUuid(); QT_BT_MAC_AUTORELEASEPOOL; - if (uuid.data.length != 16) // TODO: warning? + if (uuid.data.length == 2) { + // TODO: this is .. UGLY :) + quint16 qtUuidData = 0; + const quint8 *const source = static_cast(uuid.data.bytes); + std::copy(source, source + 2, &qtUuidData); + + return QBluetoothUuid(qtUuidData); + } else if (uuid.data.length == 16) { + quint128 qtUuidData = {}; + const quint8 *const source = static_cast(uuid.data.bytes); + std::copy(source, source + 16, qtUuidData.data); + + return QBluetoothUuid(qtUuidData); + } else { + qCDebug(QT_BT_OSX) << "qt_uuid, invalid CBUUID, 2 or 16 bytes expected, but got " + << uuid.data.length << " bytes length"; return QBluetoothUuid(); + } - quint128 qtUuidData = {}; - const quint8 *const source = static_cast(uuid.data.bytes); - std::copy(source, source + 16, qtUuidData.data); + if (uuid.data.length != 16) // TODO: warning? + return QBluetoothUuid(); - return QBluetoothUuid(qtUuidData); } CFStrongReference cf_uuid(const QBluetoothUuid &qtUuid) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 6e62844c..a2db5c0a 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -122,7 +122,37 @@ void QLowEnergyControllerPrivateOSX::connectSuccess() void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices services) { - Q_UNUSED(services) + Q_ASSERT_X(controllerState == QLowEnergyController::DiscoveringState, + "serviceDiscoveryFinished", "invalid state"); + + QT_BT_MAC_AUTORELEASEPOOL; + + for (CBService *service in services.data()) { + if (CBUUID *const uuid = service.UUID) { + const QBluetoothUuid qtUuid(OSXBluetooth::qt_uuid(uuid)); + if (discoveredServices.find(qtUuid) != discoveredServices.end()) { + qCDebug(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " + "a duplicate service UUID found: " << qtUuid; + continue; + } + + QSharedPointer newService(new QLowEnergyServicePrivate); + newService->uuid = qtUuid; +#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) + if (!service.isPrimary) { + newService->type &= ~QLowEnergyService::PrimaryService; + newService->type |= QLowEnergyService::IncludedService; + } +#endif + newService->setController(this); + discoveredServices.insert(qtUuid, newService); + emit q_ptr->serviceDiscovered(qtUuid); + } + } + + controllerState = QLowEnergyController::DiscoveredState; + emit q_ptr->stateChanged(QLowEnergyController::DiscoveredState); + emit q_ptr->discoveryFinished(); } void QLowEnergyControllerPrivateOSX::includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, @@ -184,7 +214,7 @@ void QLowEnergyControllerPrivateOSX::error(QLowEnergyController::Error errorCode void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error errorCode) { - // Service/characteristics-related errors. + // Errors reported while discovering service details etc. Q_UNUSED(serviceUuid) Q_UNUSED(errorCode) } @@ -228,6 +258,13 @@ void QLowEnergyControllerPrivateOSX::connectToDevice() void QLowEnergyControllerPrivateOSX::discoverServices() { + Q_ASSERT_X(isValid(), "discoverServices", "invalid private controller"); + Q_ASSERT_X(controllerState != QLowEnergyController::UnconnectedState, + "discoverServices", "not connected to peripheral"); + + controllerState = QLowEnergyController::DiscoveringState; + emit q_ptr->stateChanged(QLowEnergyController::DiscoveringState); + [centralManager discoverServices]; } void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid &serviceUuid) @@ -347,19 +384,30 @@ void QLowEnergyController::disconnectFromDevice() void QLowEnergyController::discoverServices() { + if (state() != ConnectedState) + return; + + OSX_D_PTR; + + osx_d_ptr->discoverServices(); } QList QLowEnergyController::services() const { - return QList(); + OSX_D_PTR; + + return osx_d_ptr->discoveredServices.keys(); } QLowEnergyService *QLowEnergyController::createServiceObject(const QBluetoothUuid &serviceUuid, QObject *parent) { - Q_UNUSED(serviceUuid) - Q_UNUSED(parent) - return Q_NULLPTR; + OSX_D_PTR; + + if (!osx_d_ptr->discoveredServices.contains(serviceUuid)) + return Q_NULLPTR; + + return new QLowEnergyService(osx_d_ptr->discoveredServices.value(serviceUuid), parent); } QLowEnergyController::Error QLowEnergyController::error() const -- cgit v1.2.3 From 6705e28bc765e48ef5f6128560a2333d8cf94054 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 12:53:41 +0100 Subject: Update documentation to reflect new Linux platform support Fixes a few qdoc errors along the way. Change-Id: Ia0caf483f5c86dbd5c47f3d96a6d5bcf622db312 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativenearfield.cpp | 6 +++--- src/nfc/doc/src/nfc-index.qdoc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index ffba30d0..9f704e4b 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -71,8 +71,8 @@ and \l orderMatch properties to match the required NDEF messages. Once an NDEF message is successfully read from a tag the \l messageRecords property is updated. - \note For platforms using neard filtering is currently not implemented. For more information - on neard see \relates QNearFieldManager. + \note For platforms using neard, filtering is currently not implemented. For more information + on neard see \l QNearFieldManager. \snippet doc_src_qtnfc.qml QML register for messages */ @@ -109,7 +109,7 @@ the adapter will start polling and stop polling if set to \c false. \note On platforms using neard, the adapter will stop polling as soon as a tag has been detected. - For more information see \relates QNearFieldManager. + For more information see \l QNearFieldManager. */ /*! diff --git a/src/nfc/doc/src/nfc-index.qdoc b/src/nfc/doc/src/nfc-index.qdoc index bd375ea8..ba4fa919 100644 --- a/src/nfc/doc/src/nfc-index.qdoc +++ b/src/nfc/doc/src/nfc-index.qdoc @@ -34,7 +34,7 @@ The NFC API provides connectivity between NFC enabled devices. -Currently the API is supported on \l{Qt for BlackBerry}{BlackBerry 10}. +Currently the API is supported on \l{Qt for BlackBerry}{BlackBerry 10} and Linux using \l {https://01.org/linux-nfc}{Neard} v0.14 or later. \section1 Overview -- cgit v1.2.3 From e18fbb5794dfbc3ffb9bc98fca51fb569a67f420 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 13:46:10 +0100 Subject: More clearly specify the Linux and Bluez version for BTLE support Change-Id: If62bce8794855b8865e02ed87ec3faac80bfc3bd Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/doc/src/bluetooth-le-overview.qdoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc index 958e623d..029171f4 100644 --- a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc +++ b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc @@ -172,8 +172,7 @@ Low Energy devices. \l {heartlistener}{Heart Listener} example. \note As of Qt 5.4 the Qt Bluetooth Low Energy API is in tech preview mode and supports Linux - with BlueZ 4 & 5. Only the last versions of Bluez 4.x (v 4.101 confirmed to work) and Linux kernels - from version 3.5 onwards support this feature. + with BlueZ 4.101 & 5.x. The minimal Linux kernel version is 3.5. \section2 Establishing a Connection -- cgit v1.2.3 From e63351bbfd48070c6e7bd373c7f8804ffc32ce3b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 11:32:22 +0100 Subject: Prepare BTLE unit tests for platforms which don't provide handle access Change-Id: I63a6d31aaa13bf94ef0cc9664dd365ddb1d84b52 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../tst_qlowenergycharacteristic.cpp | 13 +- .../tst_qlowenergycontroller.cpp | 173 +++++++++++---------- 2 files changed, 104 insertions(+), 82 deletions(-) diff --git a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp index da748b05..c7ce3a06 100644 --- a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp +++ b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp @@ -44,6 +44,17 @@ QT_USE_NAMESPACE +// This define must be set if the platform provides access to GATT handles +// otherwise it must not be defined. As of now the two supported platforms +// (Android and Bluez/Linux) provide access or some notion of it. +#define HANDLES_PROVIDED_BY_PLATFORM + +#ifdef HANDLES_PROVIDED_BY_PLATFORM +#define HANDLE_VERIFY(stmt) QVERIFY(stmt) +#else +#define HANDLE_VERIFY(stmt) +#endif + class tst_QLowEnergyCharacteristic : public QObject { Q_OBJECT @@ -272,7 +283,7 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare() target = chars[indexWithDescriptor]; QVERIFY(target.isValid()); QVERIFY(!target.name().isEmpty()); - QVERIFY(target.handle() > 0); + HANDLE_VERIFY(target.handle() > 0); QVERIFY(!target.uuid().isNull()); QVERIFY(target.properties() != QLowEnergyCharacteristic::Unknown); if (target.properties() & QLowEnergyCharacteristic::Read) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index c9cf1ca1..026264d8 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -53,6 +53,17 @@ QT_USE_NAMESPACE +// This define must be set if the platform provides access to GATT handles +// otherwise it must not be defined. As of now the two supported platforms +// (Android and Bluez/Linux) provide access or some notion of it. +#define HANDLES_PROVIDED_BY_PLATFORM + +#ifdef HANDLES_PROVIDED_BY_PLATFORM +#define HANDLE_COMPARE(actual,expected) QCOMPARE(actual,expected) +#else +#define HANDLE_COMPARE(actual,expected) +#endif + class tst_QLowEnergyController : public QObject { Q_OBJECT @@ -526,7 +537,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Device Name QString temp("00002a00-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x3)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x3)); QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read); QCOMPARE(chars[0].value(), QByteArray::fromHex("544920424c452053656e736f7220546167")); QVERIFY(chars[0].isValid()); @@ -536,7 +547,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Appearance temp = QString("00002a01-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x5)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x5)); QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Read); QCOMPARE(chars[1].value(), QByteArray::fromHex("0000")); QVERIFY(chars[1].isValid()); @@ -546,7 +557,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Peripheral Privacy Flag temp = QString("00002a02-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x7)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x7)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("00")); @@ -557,7 +568,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Reconnection Address temp = QString("00002a03-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[3].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[3].handle(), QLowEnergyHandle(0x9)); + HANDLE_COMPARE(chars[3].handle(), QLowEnergyHandle(0x9)); //Early firmware version had this characteristic as Read|Write and may fail QCOMPARE(chars[3].properties(), QLowEnergyCharacteristic::Write); if (chars[3].properties() & QLowEnergyCharacteristic::Read) @@ -571,7 +582,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Peripheral Preferred Connection Parameters temp = QString("00002a04-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[4].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[4].handle(), QLowEnergyHandle(0xb)); + HANDLE_COMPARE(chars[4].handle(), QLowEnergyHandle(0xb)); QCOMPARE(chars[4].properties(), QLowEnergyCharacteristic::Read); QCOMPARE(chars[4].value(), QByteArray::fromHex("5000a0000000e803")); QVERIFY(chars[4].isValid()); @@ -587,7 +598,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("00002a05-0000-1000-8000-00805f9b34fb"); //this should really be readable according to GATT Service spec QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0xe)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0xe)); QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Indicate); QCOMPARE(chars[0].value(), QByteArray()); QVERIFY(chars[0].isValid()); @@ -595,7 +606,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().count(), 1); QCOMPARE(chars[0].descriptors().at(0).isValid(), true); - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0xf)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0xf)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -612,7 +623,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("00002a23-0000-1000-8000-00805f9b34fb"); //this should really be readable according to GATT Service spec QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x12)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x12)); QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read); QCOMPARE(chars[0].value(), QByteArray::fromHex("6e41ab0000296abc")); QVERIFY(chars[0].isValid()); @@ -622,7 +633,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Model Number temp = QString("00002a24-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x14)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x14)); QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Read); QCOMPARE(chars[1].value(), QByteArray::fromHex("4e2e412e00")); QVERIFY(chars[1].isValid()); @@ -632,7 +643,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Serial Number temp = QString("00002a25-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x16)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x16)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[2].value(), QByteArray::fromHex("4e2e412e00")); @@ -643,7 +654,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Firmware Revision temp = QString("00002a26-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[3].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[3].handle(), QLowEnergyHandle(0x18)); + HANDLE_COMPARE(chars[3].handle(), QLowEnergyHandle(0x18)); QCOMPARE(chars[3].properties(), (QLowEnergyCharacteristic::Read)); //FW rev. : 1.5 (Oct 23 2013) @@ -656,7 +667,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Hardware Revision temp = QString("00002a27-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[4].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[4].handle(), QLowEnergyHandle(0x1a)); + HANDLE_COMPARE(chars[4].handle(), QLowEnergyHandle(0x1a)); QCOMPARE(chars[4].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[4].value(), QByteArray::fromHex("4e2e412e00")); @@ -667,7 +678,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Software Revision temp = QString("00002a28-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[5].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[5].handle(), QLowEnergyHandle(0x1c)); + HANDLE_COMPARE(chars[5].handle(), QLowEnergyHandle(0x1c)); QCOMPARE(chars[5].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[5].value(), QByteArray::fromHex("4e2e412e00")); @@ -678,7 +689,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Manufacturer Name temp = QString("00002a29-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[6].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[6].handle(), QLowEnergyHandle(0x1e)); + HANDLE_COMPARE(chars[6].handle(), QLowEnergyHandle(0x1e)); QCOMPARE(chars[6].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[6].value(), QByteArray::fromHex("546578617320496e737472756d656e747300")); @@ -689,7 +700,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // IEEE temp = QString("00002a2a-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[7].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[7].handle(), QLowEnergyHandle(0x20)); + HANDLE_COMPARE(chars[7].handle(), QLowEnergyHandle(0x20)); QCOMPARE(chars[7].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[7].value(), QByteArray::fromHex("fe006578706572696d656e74616c")); @@ -700,7 +711,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // PnP ID temp = QString("00002a50-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[8].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[8].handle(), QLowEnergyHandle(0x22)); + HANDLE_COMPARE(chars[8].handle(), QLowEnergyHandle(0x22)); QCOMPARE(chars[8].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[8].value(), QByteArray::fromHex("010d0000001001")); @@ -716,7 +727,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Temp Data QString temp("f000aa01-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x25)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x25)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000")); @@ -726,7 +737,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().count(), 2); //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x26)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x26)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -735,7 +746,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x27)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x27)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -748,7 +759,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Temp Config temp = QString("f000aa02-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x29)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x29)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -758,7 +769,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().count(), 1); //descriptor checks QCOMPARE(chars[1].descriptors().at(0).isValid(), true); - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x2a)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x2a)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -773,7 +784,7 @@ void tst_QLowEnergyController::verifyServiceProperties( if (chars.count() > 2) { temp = QString("f000aa03-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x2c)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x2c)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("64")); @@ -783,7 +794,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[2].descriptors().count(), 1); //descriptor checks QCOMPARE(chars[2].descriptors().at(0).isValid(), true); - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x2d)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x2d)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -802,7 +813,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("0000ffe1-0000-1000-8000-00805f9b34fb"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x6b)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x6b)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray()); @@ -813,7 +824,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x6c)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x6c)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -823,7 +834,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x6d)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x6d)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -842,7 +853,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa11-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x30)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x30)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("000000")); @@ -853,7 +864,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x31)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x31)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -863,7 +874,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x32)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x32)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -876,7 +887,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa12-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x34)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x34)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -886,7 +897,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x35)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x35)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -899,7 +910,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa13-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x37)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x37)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("64")); // don't change it or set it to 0x64 @@ -910,7 +921,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[2].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x38)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x38)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -929,7 +940,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa21-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x3b)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x3b)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000")); @@ -940,7 +951,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x3c)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x3c)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -950,7 +961,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x3d)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x3d)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -963,7 +974,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa22-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x3f)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x3f)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -974,7 +985,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x40)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x40)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -988,7 +999,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Humidity Period temp = QString("f000aa23-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x42)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x42)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("64")); @@ -998,7 +1009,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[2].descriptors().count(), 1); //descriptor checks QCOMPARE(chars[2].descriptors().at(0).isValid(), true); - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x43)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x43)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -1017,7 +1028,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa31-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x46)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x46)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("000000000000")); @@ -1028,7 +1039,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x47)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x47)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1038,7 +1049,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x48)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x48)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -1051,7 +1062,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa32-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x4a)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x4a)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -1061,7 +1072,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().count(), 1); QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x4b)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x4b)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1075,7 +1086,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa33-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x4d)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x4d)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("c8")); // don't change it or set it to 0xc8 @@ -1085,7 +1096,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[2].descriptors().count(), 1); QCOMPARE(chars[2].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x4e)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x4e)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -1104,7 +1115,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa41-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x51)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x51)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000")); @@ -1115,7 +1126,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x52)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x52)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1125,7 +1136,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x53)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x53)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -1139,7 +1150,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa42-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x55)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x55)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -1149,7 +1160,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().count(), 1); QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x56)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x56)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1173,7 +1184,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa43-0451-4000-b000-000000000000"); QCOMPARE(calibration.uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(calibration.handle(), QLowEnergyHandle(0x5b)); + HANDLE_COMPARE(calibration.handle(), QLowEnergyHandle(0x5b)); QCOMPARE(calibration.properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(calibration.value(), QByteArray::fromHex("00000000000000000000000000000000")); // don't change it @@ -1184,7 +1195,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(calibration.descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(calibration.descriptors().at(0).handle(), QLowEnergyHandle(0x5c)); + HANDLE_COMPARE(calibration.descriptors().at(0).handle(), QLowEnergyHandle(0x5c)); QCOMPARE(calibration.descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(calibration.descriptors().at(0).type(), @@ -1194,7 +1205,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(calibration.descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(calibration.descriptors().at(1).handle(), QLowEnergyHandle(0x5d)); + HANDLE_COMPARE(calibration.descriptors().at(1).handle(), QLowEnergyHandle(0x5d)); QCOMPARE(calibration.descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(calibration.descriptors().at(1).type(), @@ -1209,7 +1220,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa44-0451-4000-b000-000000000000"); QCOMPARE(period.uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(period.handle(), QLowEnergyHandle(0x58)); + HANDLE_COMPARE(period.handle(), QLowEnergyHandle(0x58)); QCOMPARE(period.properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(period.value(), QByteArray::fromHex("64")); @@ -1220,7 +1231,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(period.descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(period.descriptors().at(0).handle(), QLowEnergyHandle(0x59)); + HANDLE_COMPARE(period.descriptors().at(0).handle(), QLowEnergyHandle(0x59)); QCOMPARE(period.descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(period.descriptors().at(0).type(), @@ -1239,7 +1250,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa51-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x60)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x60)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify)); QCOMPARE(chars[0].value(), QByteArray::fromHex("000000000000")); @@ -1250,7 +1261,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x61)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x61)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1260,7 +1271,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x62)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x62)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -1274,7 +1285,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa52-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x64)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x64)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -1285,7 +1296,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x65)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x65)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1298,7 +1309,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000aa53-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x67)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x67)); QCOMPARE(chars[2].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[2].value(), QByteArray::fromHex("64")); @@ -1308,7 +1319,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[2].descriptors().count(), 1); //descriptor checks QCOMPARE(chars[2].descriptors().at(0).isValid(), true); - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x68)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x68)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -1326,7 +1337,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000aa61-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x70)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x70)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Read)); QCOMPARE(chars[0].value(), QByteArray::fromHex("3f00")); @@ -1336,7 +1347,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().count(), 1); QCOMPARE(chars[0].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x71)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x71)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1348,7 +1359,7 @@ void tst_QLowEnergyController::verifyServiceProperties( // Test Config temp = QString("f000aa62-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x73)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x73)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write)); QCOMPARE(chars[1].value(), QByteArray::fromHex("00")); @@ -1359,7 +1370,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x74)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x74)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1376,7 +1387,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //first characteristic QString temp("f000ccc1-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x77)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x77)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Read)); // the connection control parameter change from platform to platform @@ -1388,7 +1399,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().count(), 2); //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x78)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x78)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1399,7 +1410,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x79)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x79)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -1411,7 +1422,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //second characteristic temp = QString("f000ccc2-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x7b)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x7b)); QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Write); QCOMPARE(chars[1].value(), QByteArray()); QVERIFY(chars[1].isValid()); @@ -1419,7 +1430,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().count(), 1); QCOMPARE(chars[1].descriptors().at(0).isValid(), true); - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x7c)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x7c)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1431,7 +1442,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //third characteristic temp = QString("f000ccc3-0451-4000-b000-000000000000"); QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp)); - QCOMPARE(chars[2].handle(), QLowEnergyHandle(0x7e)); + HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x7e)); QCOMPARE(chars[2].properties(), QLowEnergyCharacteristic::Write); QCOMPARE(chars[2].value(), QByteArray()); QVERIFY(chars[2].isValid()); @@ -1439,7 +1450,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[2].descriptors().count(), 1); QCOMPARE(chars[2].descriptors().at(0).isValid(), true); - QCOMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x7f)); + HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x7f)); QCOMPARE(chars[2].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[2].descriptors().at(0).type(), @@ -1457,7 +1468,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QString temp("f000ffc1-0451-4000-b000-000000000000"); QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[0].handle(), QLowEnergyHandle(0x82)); + HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x82)); QCOMPARE(chars[0].properties(), (QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Write|QLowEnergyCharacteristic::WriteNoResponse)); QCOMPARE(chars[0].value(), QByteArray()); @@ -1467,7 +1478,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().count(), 2); //descriptor checks QCOMPARE(chars[0].descriptors().at(0).isValid(), true); - QCOMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x83)); + HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x83)); QCOMPARE(chars[0].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), @@ -1478,7 +1489,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x84)); + HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x84)); QCOMPARE(chars[0].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[0].descriptors().at(1).type(), @@ -1491,7 +1502,7 @@ void tst_QLowEnergyController::verifyServiceProperties( temp = QString("f000ffc2-0451-4000-b000-000000000000"); QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp)); // value different in other revisions and test may fail - QCOMPARE(chars[1].handle(), QLowEnergyHandle(0x86)); + HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x86)); QCOMPARE(chars[1].properties(), (QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Write|QLowEnergyCharacteristic::WriteNoResponse)); QCOMPARE(chars[1].value(), QByteArray()); @@ -1502,7 +1513,7 @@ void tst_QLowEnergyController::verifyServiceProperties( //descriptor checks QCOMPARE(chars[1].descriptors().at(0).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x87)); + HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x87)); QCOMPARE(chars[1].descriptors().at(0).uuid(), QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[1].descriptors().at(0).type(), @@ -1513,7 +1524,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[1].descriptors().at(1).isValid(), true); // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(1).handle(), QLowEnergyHandle(0x88)); + HANDLE_COMPARE(chars[1].descriptors().at(1).handle(), QLowEnergyHandle(0x88)); QCOMPARE(chars[1].descriptors().at(1).uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription)); QCOMPARE(chars[1].descriptors().at(1).type(), -- cgit v1.2.3 From cc94fad463e50f0f4ec110bacc098f4c4d4818d8 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 11:36:14 +0100 Subject: Fix test warning about missing meta type registration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I79970d1f460e2384b459a967405c849b5c0aae03 Reviewed-by: Jędrzej Nowacki Reviewed-by: Timur Pocheptsov --- tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp index c7ce3a06..8b720f62 100644 --- a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp +++ b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp @@ -42,6 +42,8 @@ #include #include +Q_DECLARE_METATYPE(QBluetoothDeviceDiscoveryAgent::Error) + QT_USE_NAMESPACE // This define must be set if the platform provides access to GATT handles @@ -82,6 +84,7 @@ tst_QLowEnergyCharacteristic::tst_QLowEnergyCharacteristic() : globalControl(0), globalService(0) { QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); + qRegisterMetaType(); } tst_QLowEnergyCharacteristic::~tst_QLowEnergyCharacteristic() -- cgit v1.2.3 From 368726f6b36cfc3b5066e4051a2897904f8f7732 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 14:51:50 +0100 Subject: Add missing \since tags for new API introduced by Qt 5.4. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie51d6e549d80baae57864d4e0d43a1c58897f149 Reviewed-by: Timur Pocheptsov Reviewed-by: Topi Reiniö --- src/bluetooth/qbluetooth.cpp | 1 + src/bluetooth/qbluetoothtransferreply.cpp | 3 ++- src/bluetooth/qbluetoothuuid.cpp | 7 ++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetooth.cpp b/src/bluetooth/qbluetooth.cpp index d418adc1..ea3900e1 100644 --- a/src/bluetooth/qbluetooth.cpp +++ b/src/bluetooth/qbluetooth.cpp @@ -72,6 +72,7 @@ namespace QBluetooth { /*! \typedef QLowEnergyHandle \relates QBluetooth + \since 5.4 Typedef for Bluetooth Low Energy ATT attribute handles. */ diff --git a/src/bluetooth/qbluetoothtransferreply.cpp b/src/bluetooth/qbluetoothtransferreply.cpp index 6c5c83a2..af1bf828 100644 --- a/src/bluetooth/qbluetoothtransferreply.cpp +++ b/src/bluetooth/qbluetoothtransferreply.cpp @@ -64,7 +64,8 @@ QT_BEGIN_NAMESPACE \value UserCanceledTransferError User terminated the transfer. \value IODeviceNotReadableError File was not open before initiating the sending command. \value ResourceBusyError Unable to access the resource.. - \value SessionError An error occurred during the handling of the session. + \value SessionError An error occurred during the handling of the session. This enum was + introduced by Qt 5.4. */ diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index 61798b03..1c8c0cf2 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -99,7 +99,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 it can be used as a value for either of the above service attributes. Such a dual use has historical reasons but is no longer permissible for newer UUIDs. - The list below explicitly states as what type each UUID shall be used. + The list below explicitly states as what type each UUID shall be used. Bluetooth Low Energy related values + starting with 0x18 were introduced by Qt 5.4 \value ServiceDiscoveryServer Service discovery server UUID (service) \value BrowseGroupDescriptor Browser group descriptor (service) @@ -214,6 +215,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 /*! \enum QBluetoothUuid::CharacteristicType + \since 5.4 This enum is a convienience type for Bluetooth low energy service characteristics class UUIDs. Values of this type will be implicitly converted into a QBluetoothUuid when necessary. @@ -369,6 +371,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 /*! \enum QBluetoothUuid::DescriptorType + \since 5.4 Descriptors are attributes that describe Bluetooth Low Energy characteristic values. @@ -425,6 +428,7 @@ QBluetoothUuid::QBluetoothUuid(ServiceClassUuid uuid) /*! Constructs a new Bluetooth UUID from the characteristic type \a uuid. + \since 5.4 */ QBluetoothUuid::QBluetoothUuid(CharacteristicType uuid) : QUuid(uuid, baseUuid()->data2, baseUuid()->data3, baseUuid()->data4[0], baseUuid()->data4[1], @@ -435,6 +439,7 @@ QBluetoothUuid::QBluetoothUuid(CharacteristicType uuid) /*! Constructs a new Bluetooth UUID from the descriptor type \a uuid. + \since 5.4 */ QBluetoothUuid::QBluetoothUuid(DescriptorType uuid) : QUuid(uuid, baseUuid()->data2, baseUuid()->data3, baseUuid()->data4[0], baseUuid()->data4[1], -- cgit v1.2.3 From 26b5e44ffc7c33b258e6c3eb6bce340d51a4a377 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 12 Nov 2014 10:39:04 +0100 Subject: Support for QLEService::writeDescriptor() on Android Change-Id: I1c7f0491506c6f0512d097a419660c5f5e7fb144 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 53 +++++++++++++++++-- src/bluetooth/android/jni_android.cpp | 2 + src/bluetooth/android/lowenergynotificationhub.cpp | 25 +++++++++ src/bluetooth/android/lowenergynotificationhub_p.h | 5 ++ src/bluetooth/qlowenergycontroller_android.cpp | 61 ++++++++++++++++++++-- src/bluetooth/qlowenergycontroller_p.h | 4 +- 6 files changed, 141 insertions(+), 9 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index c5198dbd..45120081 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -258,7 +258,6 @@ public class QtBluetoothLE { errorCode = 0; break; // NoError default: errorCode = 2; break; // CharacteristicWriteError - } leCharacteristicWritten(qtObject, handle+1, characteristic.getValue(), errorCode); @@ -342,7 +341,21 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattDescriptor descriptor, int status) { - System.out.println("onDescriptorWrite"); + if (status != BluetoothGatt.GATT_SUCCESS) + Log.w(TAG, "onDescriptorWrite: error " + status); + + int handle = handleForDescriptor(descriptor); + + int errorCode = 0; + //This must be in sync with QLowEnergyService::ServiceError + switch (status) { + case BluetoothGatt.GATT_SUCCESS: + errorCode = 0; break; // NoError + default: + errorCode = 3; break; // DescriptorWriteError + } + + leDescriptorWritten(qtObject, handle+1, descriptor.getValue(), errorCode); } //TODO Requires Android API 21 which is not available on CI yet. // public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt gatt, @@ -725,10 +738,42 @@ public class QtBluetoothLE { return false; } - entry.characteristic.setValue(newValue); + boolean result = entry.characteristic.setValue(newValue); + if (!result) { + Log.w(TAG, "BluetoothGattCharacteristic.setValue failed"); + return false; + } + return mBluetoothGatt.writeCharacteristic(entry.characteristic); } + /*************************************************************/ + /* Write Descriptors */ + /*************************************************************/ + + public boolean writeDescriptor(int descHandle, byte[] newValue) + { + if (mBluetoothGatt == null) + return false; + + GattEntry entry = null; + try { + entry = entries.get(descHandle-1); //Qt always uses handles+1 + } catch (IndexOutOfBoundsException ex) { + ex.printStackTrace(); + return false; + } + + boolean result = entry.descriptor.setValue(newValue); + if (!result) { + Log.w(TAG, "BluetoothGattDescriptor.setValue failed"); + return false; + } + + return mBluetoothGatt.writeDescriptor(entry.descriptor); + } + + public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid, @@ -740,6 +785,8 @@ public class QtBluetoothLE { int descHandle, String descUuid, byte[] data); public native void leCharacteristicWritten(long qtObject, int charHandle, byte[] newData, int errorCode); + public native void leDescriptorWritten(long qtObject, int charHandle, byte[] newData, + int errorCode); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index f98762b7..7eacd3bc 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -211,6 +211,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_descriptorRead}, {"leCharacteristicWritten", "(JI[BI)V", (void *) LowEnergyNotificationHub::lowEnergy_characteristicWritten}, + {"leDescriptorWritten", "(JI[BI)V", + (void *) LowEnergyNotificationHub::lowEnergy_descriptorWritten}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 4995dc0e..00ef4ff0 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -235,4 +235,29 @@ void LowEnergyNotificationHub::lowEnergy_characteristicWritten( (QLowEnergyService::ServiceError)errorCode)); } +void LowEnergyNotificationHub::lowEnergy_descriptorWritten( + JNIEnv *env, jobject, jlong qtObject, jint descHandle, + jbyteArray data, jint errorCode) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QByteArray payload; + if (data) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(data); + payload.resize(length); + env->GetByteArrayRegion(data, 0, length, + reinterpret_cast(payload.data())); + } + + QMetaObject::invokeMethod(hub, "descriptorWritten", Qt::QueuedConnection, + Q_ARG(int, descHandle), + Q_ARG(QByteArray, payload), + Q_ARG(QLowEnergyService::ServiceError, + (QLowEnergyService::ServiceError)errorCode)); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 49705799..b3399a8d 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -71,6 +71,9 @@ public: static void lowEnergy_characteristicWritten(JNIEnv *, jobject, jlong qtObject, jint charHandle, jbyteArray data, jint errorCode); + static void lowEnergy_descriptorWritten(JNIEnv *, jobject, jlong qtObject, + jint descHandle, jbyteArray data, + jint errorCode); QAndroidJniObject javaObject() { @@ -90,6 +93,8 @@ signals: int handle, const QBluetoothUuid &descUuid, const QByteArray &data); void characteristicWritten(int charHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); + void descriptorWritten(int descHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 3891bb5b..582e83a6 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -76,6 +76,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::descriptorRead); connect(hub, &LowEnergyNotificationHub::characteristicWritten, this, &QLowEnergyControllerPrivate::characteristicWritten); + connect(hub, &LowEnergyNotificationHub::descriptorWritten, + this, &QLowEnergyControllerPrivate::descriptorWritten); } if (!hub->javaObject().isValid()) { @@ -186,12 +188,37 @@ void QLowEnergyControllerPrivate::writeCharacteristic( } void QLowEnergyControllerPrivate::writeDescriptor( - const QSharedPointer /*service*/, + const QSharedPointer service, const QLowEnergyHandle /*charHandle*/, - const QLowEnergyHandle /*descriptorHandle*/, - const QByteArray &/*newValue*/) + const QLowEnergyHandle descHandle, + const QByteArray &newValue) { + Q_ASSERT(!service.isNull()); + + QAndroidJniEnvironment env; + jbyteArray payload; + payload = env->NewByteArray(newValue.size()); + env->SetByteArrayRegion(payload, 0, newValue.size(), + (jbyte *)newValue.constData()); + + bool result = false; + if (hub) { + qCDebug(QT_BT_ANDROID) << "Write descriptor with handle " << descHandle + << newValue.toHex() << "(service:" << service->uuid << ")"; + result = hub->javaObject().callMethod("writeDescriptor", "(I[B)Z", + descHandle, payload); + } + + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + result = false; + } + env->DeleteLocalRef(payload); + + if (!result) + service->setError(QLowEnergyService::DescriptorWriteError); } void QLowEnergyControllerPrivate::connectionUpdated( @@ -340,7 +367,6 @@ void QLowEnergyControllerPrivate::characteristicWritten( if (service.isNull()) return; - qCDebug(QT_BT_ANDROID) << "Characteristic write confirmation" << service->uuid << charHandle << data.toHex() << errorCode; @@ -359,4 +385,31 @@ void QLowEnergyControllerPrivate::characteristicWritten( emit service->characteristicWritten(characteristic, data); } +void QLowEnergyControllerPrivate::descriptorWritten( + int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) +{ + QSharedPointer service = + serviceForHandle(descHandle); + if (service.isNull()) + return; + + qCDebug(QT_BT_ANDROID) << "Descriptor write confirmation" << service->uuid + << descHandle << data.toHex() << errorCode; + + if (errorCode != QLowEnergyService::NoError) { + service->setError(errorCode); + return; + } + + QLowEnergyDescriptor descriptor = descriptorForHandle(descHandle); + if (!descriptor.isValid()) { + qCWarning(QT_BT_ANDROID) << "descriptorWritten: Cannot find descriptor"; + return; + } + + updateValueOfDescriptor(descriptor.characteristicHandle(), + descHandle, data, false); + emit service->descriptorWritten(descriptor, data); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 92af2cd1..17c28cd6 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -206,8 +206,8 @@ private slots: int handle, const QBluetoothUuid &descUuid, const QByteArray &data); void characteristicWritten(int charHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); - - + void descriptorWritten(int descHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); #endif private: QLowEnergyController *q_ptr; -- cgit v1.2.3 From 03d72f5a961bd1c81e9d599937b4105c35f31ee1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 12 Nov 2014 10:41:09 +0100 Subject: Fix wrong error signal emision on writeCharacteristic() on Android There is no need to go around the event loop. Furthermore there is no signal "void error(QLEHandle)" in QLEService. The signal is void error(QLEService::ServiceError) Change-Id: I53e9eb9b82cff38b15edab524329fa98206ab27b Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_android.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 582e83a6..868457e9 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -183,8 +183,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic( env->DeleteLocalRef(payload); if (!result) - QMetaObject::invokeMethod(service.data(), "error", Qt::QueuedConnection, - Q_ARG(QLowEnergyHandle, charHandle)); + service->setError(QLowEnergyService::CharacteristicWriteError); } void QLowEnergyControllerPrivate::writeDescriptor( -- cgit v1.2.3 From c01298910e6af5de369ff85e27179cbfd1278b0b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 12 Nov 2014 11:28:28 +0100 Subject: Apply fixes pointed out by Java code analyzer This covers code optimizations and one minor corner case bug. Change-Id: I9c4df9462e8610ea37a6e43e20840e537c295684 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 55 +++++++++++----------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 45120081..04b211a5 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -52,16 +52,17 @@ import java.util.UUID; public class QtBluetoothLE { private static final String TAG = "QtBluetoothGatt"; - private BluetoothAdapter mBluetoothAdapter; + private final BluetoothAdapter mBluetoothAdapter; private boolean mLeScanRunning = false; private BluetoothGatt mBluetoothGatt = null; private String mRemoteGattAddress; - private BluetoothDevice mRemoteGattDevice = null; /* Pointer to the Qt object that "owns" the Java object */ + @SuppressWarnings({"CanBeFinal", "WeakerAccess"}) long qtObject = 0; + @SuppressWarnings("WeakerAccess") Activity qtactivity = null; public QtBluetoothLE() { @@ -97,7 +98,7 @@ public class QtBluetoothLE { } // Device scan callback - private BluetoothAdapter.LeScanCallback leScanCallback = + private final BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() { @Override @@ -115,7 +116,7 @@ public class QtBluetoothLE { /* Service Discovery */ /*************************************************************/ - private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { + private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { if (qtObject == 0) @@ -157,7 +158,7 @@ public class QtBluetoothLE { errorCode = 0; //QLowEnergyController::NoError final List services = mBluetoothGatt.getServices(); for (BluetoothGattService service: services) { - builder.append(service.getUuid().toString() + " "); //space is separator + builder.append(service.getUuid().toString()).append(" "); //space is separator } break; default: @@ -251,7 +252,7 @@ public class QtBluetoothLE { return; } - int errorCode = 0; + int errorCode; //This must be in sync with QLowEnergyService::ServiceError switch (status) { case BluetoothGatt.GATT_SUCCESS: @@ -346,7 +347,7 @@ public class QtBluetoothLE { int handle = handleForDescriptor(descriptor); - int errorCode = 0; + int errorCode; //This must be in sync with QLowEnergyService::ServiceError switch (status) { case BluetoothGatt.GATT_SUCCESS: @@ -372,15 +373,17 @@ public class QtBluetoothLE { public boolean connect() { - mRemoteGattDevice = mBluetoothAdapter.getRemoteDevice(mRemoteGattAddress); - if (mRemoteGattDevice == null) - return false; + BluetoothDevice mRemoteGattDevice; - mBluetoothGatt = mRemoteGattDevice.connectGatt(qtactivity, false, gattCallback); - if (mBluetoothGatt == null) + try { + mRemoteGattDevice = mBluetoothAdapter.getRemoteDevice(mRemoteGattAddress); + } catch (IllegalArgumentException ex) { + Log.w(TAG, "Remote address is not valid: " + mRemoteGattAddress); return false; + } - return true; + mBluetoothGatt = mRemoteGattDevice.connectGatt(qtactivity, false, gattCallback); + return mBluetoothGatt != null; } public void disconnect() { @@ -392,10 +395,7 @@ public class QtBluetoothLE { public boolean discoverServices() { - if (mBluetoothGatt == null) - return false; - - return mBluetoothGatt.discoverServices(); + return mBluetoothGatt != null && mBluetoothGatt.discoverServices(); } private enum GattEntryType @@ -411,9 +411,9 @@ public class QtBluetoothLE { public BluetoothGattDescriptor descriptor = null; public int endHandle; } - Hashtable> uuidToEntry = new Hashtable>(100); - ArrayList entries = new ArrayList(100); - private LinkedList servicesToBeDiscovered = new LinkedList(); + private final Hashtable> uuidToEntry = new Hashtable>(100); + private final ArrayList entries = new ArrayList(100); + private final LinkedList servicesToBeDiscovered = new LinkedList(); /* Internal helper function @@ -434,7 +434,7 @@ public class QtBluetoothLE { int serviceHandle = handles.get(0); try { - GattEntry entry = null; + GattEntry entry; for (int i = serviceHandle+1; i < entries.size(); i++) { entry = entries.get(i); switch (entry.type) { @@ -472,7 +472,7 @@ public class QtBluetoothLE { int serviceHandle = handles.get(0); try { - GattEntry entry = null; + GattEntry entry; for (int i = serviceHandle+1; i < entries.size(); i++) { entry = entries.get(i); switch (entry.type) { @@ -487,7 +487,7 @@ public class QtBluetoothLE { break; } } - } catch (IndexOutOfBoundsException ex) { } + } catch (IndexOutOfBoundsException ignored) { } return -1; } @@ -644,7 +644,6 @@ public class QtBluetoothLE { performServiceDetailDiscoveryForHandle(nextService, true); } catch (IndexOutOfBoundsException ex) { Log.w(TAG, "Expected queued service but didn't find any"); - return; } } } @@ -659,7 +658,7 @@ public class QtBluetoothLE { runningHandle = nextHandle; } - GattEntry entry = null; + GattEntry entry; try { entry = entries.get(nextHandle); } catch (IndexOutOfBoundsException ex) { @@ -669,7 +668,7 @@ public class QtBluetoothLE { return; } - boolean result = false; + boolean result; switch (entry.type) { case Characteristic: result = mBluetoothGatt.readCharacteristic(entry.characteristic); @@ -730,7 +729,7 @@ public class QtBluetoothLE { if (mBluetoothGatt == null) return false; - GattEntry entry = null; + GattEntry entry; try { entry = entries.get(charHandle-1); //Qt always uses handles+1 } catch (IndexOutOfBoundsException ex) { @@ -756,7 +755,7 @@ public class QtBluetoothLE { if (mBluetoothGatt == null) return false; - GattEntry entry = null; + GattEntry entry; try { entry = entries.get(descHandle-1); //Qt always uses handles+1 } catch (IndexOutOfBoundsException ex) { -- cgit v1.2.3 From d113b4c0e1b070b1644810083828e23a148e7a21 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 12 Nov 2014 15:54:16 +0100 Subject: Document and test concurrent write requests BTLE communication is serialised. However the Qt API provides the ability to issue multiple write requests while the first is still pending. The backend must enqueue the requests for later on. This behavior was already indirectly tests by a unit test but this patch adds an explicit test section for it and documents the behavior. Change-Id: I089b52940820bf0ba9c3ec872a6f1d5d6bd78a0e Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergyservice.cpp | 16 +++++++++++++++- .../tst_qlowenergycontroller.cpp | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 0c803144..0ae9ca67 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -98,7 +98,9 @@ QT_BEGIN_NAMESPACE \l writeCharacteristic() function attempts to write a new value to the given characteristic. If the write attempt is successful, the \l characteristicWritten() signal is emitted. A failure to write triggers the \l CharacteristicWriteError. - Writing a descriptor follows the same pattern. + Writing a descriptor follows the same pattern. Write requests are serialised. + Issuing a second write request before the previous request has finished + is delayed until the first write request has finished. \note Currently, it is not possible to send signed write or reliable write requests. @@ -495,6 +497,12 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) \l QLowEnergyCharacteristic::Write and \l QLowEnergyCharacteristic::WriteNoResponse properties. + All descriptor and characteristic write requests towards the same remote device are + serialised. A queue is employed when issuing multiple write requests at the same time. + The queue does not eliminate duplicated write requests for the same characteristic. + For example, if the same descriptor is set to the value A and immediately afterwards + to B, the two write request are executed in the given order. + \note Currently, it is not possible to use signed or reliable writes as defined by the Bluetooth specification. @@ -566,6 +574,12 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const the \l descriptorWritten() signal is emitted; otherwise the \l DescriptorWriteError is emitted. + All descriptor and characteristic write requests towards the same remote device are + serialised. A queue is employed when issuing multiple write requests at the same time. + The queue does not eliminate duplicated write requests for the same descriptor. + For example, if the same descriptor is set to the value A and immediately afterwards + to B, the two write request are executed in the given order. + A descriptor can only be written if this service is in the \l ServiceDiscovered state, belongs to the service and is writable. */ diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 026264d8..a91f8096 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -1875,6 +1875,28 @@ void tst_QLowEnergyController::tst_writeDescriptor() QVERIFY(notification == signalDesc); descWrittenSpy.clear(); + // test concurrent writeRequests + // they need to be queued up + service->writeDescriptor(notification,QByteArray::fromHex("0100")); + service->writeDescriptor(notification, QByteArray::fromHex("0000")); + service->writeDescriptor(notification, QByteArray::fromHex("0100")); + service->writeDescriptor(notification, QByteArray::fromHex("0000")); + QTRY_VERIFY_WITH_TIMEOUT(descWrittenSpy.count() == 4, 10000); + + QCOMPARE(notification.value(), QByteArray::fromHex("0000")); + for (int i = 0; i < descWrittenSpy.count(); i++) { + firstSignalData = descWrittenSpy.at(i); + signalDesc = firstSignalData[0].value(); + signalValue = firstSignalData[1].toByteArray(); + if (i & 0x1) // odd + QCOMPARE(signalValue, QByteArray::fromHex("0000")); + else // even + QCOMPARE(signalValue, QByteArray::fromHex("0100")); + QVERIFY(notification == signalDesc); + + } + descWrittenSpy.clear(); + // ******************************************* // write wrong value -> error response required QSignalSpy errorSpy(service, SIGNAL(error(QLowEnergyService::ServiceError))); -- cgit v1.2.3 From 71ee504996636091693e4201cfc892d2b09dd4c7 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 13 Nov 2014 15:14:49 +0100 Subject: Add change log for Qt 5.4.0 release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9eca03f01ba01e9952c28c6d4bd14f656aa5d838 Reviewed-by: Topi Reiniö Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- dist/changes-5.4.0 | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 dist/changes-5.4.0 diff --git a/dist/changes-5.4.0 b/dist/changes-5.4.0 new file mode 100644 index 00000000..b9e659e9 --- /dev/null +++ b/dist/changes-5.4.0 @@ -0,0 +1,99 @@ +Qt 5.4 introduces many new features and improvements as well as bugfixes +over the 5.3.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtBluetooth +----------- + + - Bluetooth Low Energy Support added: + * Connect/disconnect to peripherals supported. + * Services on Peripheral can be discovered and interacted with. + * BlueZ on Linux is the only currently supported platform. + Minimal requirement are a Linux kernel v 3.5+ and BlueZ version 4.101+. + More platforms will be added by future Qt releases. + * The feature/API remains in Tech Preview stage throughout the Qt 5.4 + release. Some API elements may still change in future releases. + + - Fixed documentation throughout all classes. + + - General: + * Bluetooth Low Energy scanner example has been added. + * Heart Listener Bluetooth Low Energy Heart Belt example has been added. + + - QBluetoothAddress: + * QDebug streaming operator added. + + - QBluetoothDeviceInfo: + * QBluetooth::CoreConfiguration enum added. + * CoreConfiguration attribute added. + + - QBluetoothServiceDiscoveryAgent: + * Fixed cases where Bluez doesn't provide service names for given + Bluetooth service class uuid. + + - QBLuetoothSocket: + * [QTBUG-32704] Fixed behavior of isReadable()/isOpen()/isWritable(). + So fat, these functions returned wrong values. + + - QBluetoothTransferReply: + * QBluetoothTransferReply::error() signal added. + * QBluetoothTransferReply::SessionError value added to TransferError enum. + * QBluetoothTransferReply::TransferError enum declared as as meta type. + * Fixed a memory leak on Bluez and QNX. + * Fixed segmentation fault if passed QIODevice was 0. + + - QBluetoothUuid: + * Added QBluetoothUuid::protocolToString(QBluetoothUuid::ProtocolUuid) + which returns a human-readable string for the given protocol uuid. + * Various Bluetooth Low Energy related API elements added. This includes + two new constructors, the DescriptorType and CharacteristicType enum, + various values for ServiceClassUuid enum and helper functions to + handle the extended range of new enums. + +QtNfc +----- + + - General: + * Fixed reference error bug in NFC poster example + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - Fixed broken QBluetoothServer::isListening(). It returned false right + after a successful call to listen(). + +Bluez/Linux +----------- + + - API ported to Bluez 5.x. + + - Fixed license issue. + + - QBluetoothDeviceDiscoveryAgent: + * Add support to enable detection of Bluetooth Low Energy devices. + + - QBluetoothSocket: + * Fixed case where port L2CP port number was not converted to little-endian. + This bug affected big-endian platforms. -- cgit v1.2.3 From 8ee716df65ffa40ec0bd0d650cfbcda101efe35d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 12 Nov 2014 15:57:31 +0100 Subject: Ensure that Android can deal with concurrent write requests. Change-Id: Ib4f8381a1975e17b5b142f49e0f3f32398a46bfb Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 114 ++++++++++++++++++--- 1 file changed, 101 insertions(+), 13 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 04b211a5..988f3c3d 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -128,7 +128,7 @@ public class QtBluetoothLE { case BluetoothProfile.STATE_DISCONNECTED: qLowEnergyController_State = 0; // we disconnected -> get rid of data from previous run - resetServiceDetailData(); + resetData(); // reset mBluetoothGatt, reusing same object is not very reliable // sometimes it reconnects and sometimes it does not. mBluetoothGatt = null; @@ -261,7 +261,11 @@ public class QtBluetoothLE { errorCode = 2; break; // CharacteristicWriteError } + synchronized (writeQueue) { + writeJobPending = false; + } leCharacteristicWritten(qtObject, handle+1, characteristic.getValue(), errorCode); + performNextWrite(); } public void onCharacteristicChanged(android.bluetooth.BluetoothGatt gatt, @@ -356,7 +360,12 @@ public class QtBluetoothLE { errorCode = 3; break; // DescriptorWriteError } + synchronized (writeQueue) { + writeJobPending = false; + } + leDescriptorWritten(qtObject, handle+1, descriptor.getValue(), errorCode); + performNextWrite(); } //TODO Requires Android API 21 which is not available on CI yet. // public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt gatt, @@ -411,10 +420,20 @@ public class QtBluetoothLE { public BluetoothGattDescriptor descriptor = null; public int endHandle; } + private class WriteJob + { + public GattEntry entry; + public byte[] newValue; + } + private final Hashtable> uuidToEntry = new Hashtable>(100); private final ArrayList entries = new ArrayList(100); private final LinkedList servicesToBeDiscovered = new LinkedList(); + + private final LinkedList writeQueue = new LinkedList(); + private boolean writeJobPending; + /* Internal helper function Returns the handle id for the given characteristic; otherwise returns -1. @@ -548,13 +567,18 @@ public class QtBluetoothLE { private int currentServiceInDiscovery = -1; private int runningHandle = -1; - private synchronized void resetServiceDetailData() + private void resetData() { - runningHandle = -1; - currentServiceInDiscovery = -1; - uuidToEntry.clear(); - entries.clear(); - servicesToBeDiscovered.clear(); + synchronized (this) { + runningHandle = -1; + currentServiceInDiscovery = -1; + uuidToEntry.clear(); + entries.clear(); + servicesToBeDiscovered.clear(); + } + synchronized (writeQueue) { + writeQueue.clear(); + } } public synchronized boolean discoverServiceDetails(String serviceUuid) @@ -737,13 +761,22 @@ public class QtBluetoothLE { return false; } - boolean result = entry.characteristic.setValue(newValue); + WriteJob newJob = new WriteJob(); + newJob.newValue = newValue; + newJob.entry = entry; + + boolean result; + synchronized (writeQueue) { + result = writeQueue.add(newJob); + } + if (!result) { - Log.w(TAG, "BluetoothGattCharacteristic.setValue failed"); + Log.w(TAG, "Cannot add characteristic write request for " + charHandle + " to queue" ); return false; } - return mBluetoothGatt.writeCharacteristic(entry.characteristic); + performNextWrite(); + return true; } /*************************************************************/ @@ -763,13 +796,68 @@ public class QtBluetoothLE { return false; } - boolean result = entry.descriptor.setValue(newValue); + WriteJob newJob = new WriteJob(); + newJob.newValue = newValue; + newJob.entry = entry; + + boolean result; + synchronized (writeQueue) { + result = writeQueue.add(newJob); + } + if (!result) { - Log.w(TAG, "BluetoothGattDescriptor.setValue failed"); + Log.w(TAG, "Cannot add descriptor write request for " + descHandle + " to queue" ); return false; } - return mBluetoothGatt.writeDescriptor(entry.descriptor); + performNextWrite(); + return true; + } + + /* + The queuing is required because two writeCharacteristic/writeDescriptor calls + cannot execute at the same time. The second write must happen after the + previous write has finished with on(Characteristic|Descriptor)Write(). + */ + private void performNextWrite() + { + if (mBluetoothGatt == null) + return; + + boolean skip = false; + final WriteJob nextJob; + synchronized (writeQueue) { + if (writeQueue.isEmpty() || writeJobPending) + return; + + nextJob = writeQueue.remove(); + boolean result; + switch (nextJob.entry.type) { + case Characteristic: + result = nextJob.entry.characteristic.setValue(nextJob.newValue); + if (!result || !mBluetoothGatt.writeCharacteristic(nextJob.entry.characteristic)) + skip = true; + break; + case Descriptor: + result = nextJob.entry.descriptor.setValue(nextJob.newValue); + if (!result || !mBluetoothGatt.writeDescriptor(nextJob.entry.descriptor)) + skip = true; + break; + case Service: + case CharacteristicValue: + skip = true; + break; + + } + + if (!skip) + writeJobPending = true; + } + + if (skip) { + Log.w(TAG, "Skipping write: " + nextJob.entry.type); + performNextWrite(); + } } -- cgit v1.2.3 From 25c2d4793bd4a55eec6e51ccbdfece9e505b8715 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 17 Nov 2014 13:00:18 +0100 Subject: Fix spelling mistake in change logs Change-Id: Ia82082ce24c98b69697b348dc20164b8ec034a0b Reviewed-by: Leena Miettinen --- dist/changes-5.4.0 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/changes-5.4.0 b/dist/changes-5.4.0 index b9e659e9..78809827 100644 --- a/dist/changes-5.4.0 +++ b/dist/changes-5.4.0 @@ -50,7 +50,7 @@ QtBluetooth - QBLuetoothSocket: * [QTBUG-32704] Fixed behavior of isReadable()/isOpen()/isWritable(). - So fat, these functions returned wrong values. + So far, these functions returned wrong values. - QBluetoothTransferReply: * QBluetoothTransferReply::error() signal added. -- cgit v1.2.3 From 839b05ba89134ccc4c4cc7716d18995a4c31b534 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 20 Nov 2014 15:28:40 +0100 Subject: Add missing InvalidBluetoothAdapterError to QML discovery model QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapter was introduced by Qt 5.3 but never added to the QML BluetoothDiscoveryModel. This patch fixes the problem. This was noticed due to a crash on Android emulator. Change-Id: I652576929659ca370216133154e36158e8425711 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- examples/bluetooth/scanner/scanner.qml | 2 ++ src/bluetooth/qbluetoothservicediscoveryagent.cpp | 3 ++- src/imports/bluetooth/plugins.qmltypes | 3 ++- .../qdeclarativebluetoothdiscoverymodel.cpp | 27 +++++++++++++++++++++- .../qdeclarativebluetoothdiscoverymodel_p.h | 3 ++- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/examples/bluetooth/scanner/scanner.qml b/examples/bluetooth/scanner/scanner.qml index 67aaecf0..543e19de 100644 --- a/examples/bluetooth/scanner/scanner.qml +++ b/examples/bluetooth/scanner/scanner.qml @@ -60,6 +60,8 @@ Item { console.log("Error: Bluetooth device not turned on"); break; case BluetoothDiscoveryModel.InputOutputError: console.log("Error: Bluetooth I/O Error"); break; + case BluetoothDiscoveryModel.InvalidBluetoothAdapterError: + console.log("Error: Invalid Bluetooth Adapter Error"); break; case BluetoothDiscoveryModel.NoError: break; default: diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index c800dc6d..ef28ef82 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -91,7 +91,8 @@ QT_BEGIN_NAMESPACE \value PoweredOffError The Bluetooth adaptor is powered off, power it on before doing discovery. \value InputOutputError Writing or reading from the device resulted in an error. \value InvalidBluetoothAdapterError The passed local adapter address does not match the physical - adapter address of any local Bluetooth device. + adapter address of any local Bluetooth device. This value + was introduced by Qt 5.3. \value UnknownError An unknown error has occurred. */ diff --git a/src/imports/bluetooth/plugins.qmltypes b/src/imports/bluetooth/plugins.qmltypes index f7d0d08d..cf2146e2 100644 --- a/src/imports/bluetooth/plugins.qmltypes +++ b/src/imports/bluetooth/plugins.qmltypes @@ -30,7 +30,8 @@ Module { "NoError": 0, "InputOutputError": 1, "PoweredOffError": 2, - "UnknownError": 3 + "UnknownError": 3, + "InvalidBluetoothAdapterError": 4 } } Property { name: "error"; type: "Error"; isReadonly: true } diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp index 20f47f65..01a53bfa 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp @@ -151,7 +151,19 @@ void QDeclarativeBluetoothDiscoveryModel::componentComplete() void QDeclarativeBluetoothDiscoveryModel::errorDiscovery(QBluetoothServiceDiscoveryAgent::Error error) { - d->m_error = static_cast(error); + switch (error) { + case QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError: + d->m_error = QDeclarativeBluetoothDiscoveryModel::InvalidBluetoothAdapterError; break; + case QBluetoothServiceDiscoveryAgent::NoError: + d->m_error = QDeclarativeBluetoothDiscoveryModel::NoError; break; + case QBluetoothServiceDiscoveryAgent::InputOutputError: + d->m_error = QDeclarativeBluetoothDiscoveryModel::InputOutputError; break; + case QBluetoothServiceDiscoveryAgent::PoweredOffError: + d->m_error = QDeclarativeBluetoothDiscoveryModel::PoweredOffError; break; + case QBluetoothServiceDiscoveryAgent::UnknownError: + d->m_error = QDeclarativeBluetoothDiscoveryModel::UnknownError; break; + } + emit errorChanged(); } @@ -187,6 +199,12 @@ void QDeclarativeBluetoothDiscoveryModel::clearModel() \li An IO failure occurred during device discovery \row \li \c BluetoothDiscoveryModel.PoweredOffError \li The bluetooth device is not powered on. + \row \li \c BluetoothDiscoveryModel.InvalidBluetoothAdapterError + \li There is no default Bluetooth device to perform the + service discovery. The model always uses the local default adapter. + Specifying a default adapter is not possible. If that's required, + \l QBluetoothServiceDiscoveryAgent should be directly used. This + value was introduced by Qt 5.4. \row \li \c BluetoothDiscoveryModel.UnknownError \li An unknown error occurred. \endtable @@ -407,6 +425,13 @@ void QDeclarativeBluetoothDiscoveryModel::setRunning(bool running) //qDebug() << "Minimal Discovery"; d->m_serviceAgent->start(QBluetoothServiceDiscoveryAgent::MinimalDiscovery); } + + // we could not start service discovery + if (!d->m_serviceAgent->isActive()) { + d->m_running = false; + errorDiscovery(d->m_serviceAgent->error()); + return; + } } } diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h index 279fb063..1834ce36 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h @@ -94,7 +94,8 @@ public: NoError, InputOutputError, PoweredOffError, - UnknownError + UnknownError, + InvalidBluetoothAdapterError }; Error error() const; -- cgit v1.2.3 From 5d405d07fb51502d0bfab08f4d74aa5eba365bab Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 20 Nov 2014 15:34:03 +0100 Subject: Fix crash during service discovery on Android This is caused when running a service discovery on an Android emulator. The emulator does not have a local Bluetooth device despite the Qt code assuming it. Change-Id: I9c0d826d14e7494bfeb27d449f9b6f568860d917 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qbluetoothservicediscoveryagent_android.cpp | 24 ++++++++++------------ 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp index 01993f25..e10d2ffe 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp @@ -48,19 +48,20 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate( - const QBluetoothAddress &deviceAdapter) + const QBluetoothAddress &/*deviceAdapter*/) : error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), singleDevice(false), receiver(0), localDeviceReceiver(0) { QList devices = QBluetoothLocalDevice::allDevices(); - Q_ASSERT(devices.count() == 1); //Android only supports one device at the moment + Q_ASSERT(devices.count() <= 1); //Android only supports one device at the moment - if (deviceAdapter.isNull() && devices.count() > 0 ) - m_deviceAdapterAddress = devices.at(0).address(); - else - m_deviceAdapterAddress = deviceAdapter; + if (devices.isEmpty()) { + error = QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError; + errorString = QBluetoothServiceDiscoveryAgent::tr("Invalid Bluetooth adapter address"); + return; + } if (QtAndroidPrivate::androidSdkVersion() < 15) qCWarning(QT_BT_ANDROID) @@ -69,13 +70,10 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate( << "Service discovery will return empty list."; - /* We assume that the current local adapter has been passed. - Android only supports one adapter at the moment. If m_deviceAdapterAddress - doesn't match the local adapter then we won't get to this point since - we have an InvalidBluetoothAdapter error. - - The logic below must change once there is more than one adapter. - */ + /* + We assume that the current local adapter has been passed. + The logic below must change once there is more than one adapter. + */ btAdapter = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter", "getDefaultAdapter", -- cgit v1.2.3 From 77c756fdb33e66dcdccc513af9cc865a658f7e73 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 21 Nov 2014 14:56:14 +0100 Subject: Reset the controller's internal state when disconnecting This caused problems when disconnecting from the remote device while an openrequest was pending and if the controller tried to reconnect immediately afterwards. The pending request queue was blocked forever. Change-Id: I444d5ac6763b65ec8baf687e0dccec4b28016a6c Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/bluez/hcimanager.cpp | 1 + src/bluetooth/qlowenergycontroller_bluez.cpp | 11 +++++++++++ src/bluetooth/qlowenergycontroller_p.h | 2 ++ 3 files changed, 14 insertions(+) diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index 449f0825..17d54a4b 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -150,6 +150,7 @@ bool HciManager::monitorEvent(HciManager::HciEvent event) return false; // this event is already enabled + // TODO runningEvents does not seem to be used if (runningEvents.contains(event)) return true; diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 4f8021e2..5629966d 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -271,6 +271,7 @@ void QLowEnergyControllerPrivate::disconnectFromDevice() { setState(QLowEnergyController::ClosingState); l2cpSocket->close(); + resetController(); } void QLowEnergyControllerPrivate::l2cpDisconnected() @@ -306,9 +307,19 @@ void QLowEnergyControllerPrivate::l2cpErrorChanged(QBluetoothSocket::SocketError } invalidateServices(); + resetController(); setState(QLowEnergyController::UnconnectedState); } + +void QLowEnergyControllerPrivate::resetController() +{ + openRequests.clear(); + requestPending = false; + encryptionChangePending = false; + securityLevelValue = -1; +} + void QLowEnergyControllerPrivate::l2cpReadyRead() { const QByteArray reply = l2cpSocket->readAll(); diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index ee206035..db1b346a 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -160,6 +160,8 @@ private: const QByteArray &newValue, quint16 offset); bool increaseEncryptLevelfRequired(quint8 errorCode); + void resetController(); + private slots: void l2cpConnected(); void l2cpDisconnected(); -- cgit v1.2.3 From 2aca0f85a8c3b4f0543e55b9f7aa9aa635fb5e9e Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 21 Nov 2014 16:33:48 +0100 Subject: Workaround Android when connecting to non-existing/turned off device In such cases a disconnect() call never receives a system callback that BluetoothGatt is disconnected. Similarly when the timeout hits the platform sends an unknown error code 133 and again doesn't send a disconnected status. This patch works around both issues by preempting the platform behavior. It seems that subsequent connect attempts are not harmed by this. Change-Id: I14326c9169f8c1cbbe8aa11de62ca807e79f4975 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_android.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 868457e9..a28feaf6 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -97,9 +97,20 @@ void QLowEnergyControllerPrivate::connectToDevice() void QLowEnergyControllerPrivate::disconnectFromDevice() { + /* Catch an Android timeout bug. If the device is connecting but cannot + * physically connect it seems to ignore the disconnect call below. + * At least BluetoothGattCallback.onConnectionStateChange never + * arrives. The next BluetoothGatt.connect() works just fine though. + * */ + + QLowEnergyController::ControllerState oldState = state; setState(QLowEnergyController::ClosingState); + if (hub) hub->javaObject().callMethod("disconnect"); + + if (oldState == QLowEnergyController::ConnectingState) + setState(QLowEnergyController::UnconnectedState); } void QLowEnergyControllerPrivate::discoverServices() @@ -234,8 +245,18 @@ void QLowEnergyControllerPrivate::connectionUpdated( if (errorCode != QLowEnergyController::NoError) { // ConnectionError if transition from Connecting to Connected - if (oldState == QLowEnergyController::ConnectingState) + if (oldState == QLowEnergyController::ConnectingState) { setError(QLowEnergyController::ConnectionError); + /* There is a bug in Android, when connecting to an unconnectable + * device. The connection times out and Android sends error code + * 133 (doesn't exist) and STATE_CONNECTED. A subsequent disconnect() + * call never sends a STATE_DISCONNECTED either. + * As workaround we will trigger disconnect when we encounter + * error during connect attempt. This leaves the controller + * in a cleaner state. + * */ + newState = QLowEnergyController::UnconnectedState; + } else setError(errorCode); } -- cgit v1.2.3 From 4f8da7a6a2e0e7da06e7f869176a5e9773179189 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Sun, 23 Nov 2014 11:48:27 +0100 Subject: QLowEnergyController - connectTo/disconnectFromDevice (OS X, iOS) Fix for disconnectFromDevice. It can happen that connect requesting is pending forever and not reporting any error: there is no timeout in Core Bluetooth (quite reasonable), a device (after it was found by LE scan) can be turned off or move out of range before connected. If a user calls disconnectFromDevice on a controller during this time: - we still have to call cancelPeripheralConnection to make sure the pending connection never succeeds - we have to set the controller's state to unconnected, since, unfortunately, delegate's callback is not guaranteed to work (descipe of Apple's docs promising this behavior). Fix for connectToDevice - small typo was breaking connectToDevice's logic. Change-Id: I4040c79a37ff31ecb5fb2296fa0d39b81d26393d Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 15 ++++++++------- src/bluetooth/qlowenergycontroller_osx.mm | 13 ++++++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 32fad1db..3bd802d6 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -238,15 +238,16 @@ using namespace QT_NAMESPACE; } else { disconnectPending = false; - if ([self isConnected]) { - Q_ASSERT_X(peripheral, "-disconnectFromDevice", "invalid peripheral (nil)"); - Q_ASSERT_X(manager, "-disconnectFromDevice", "invalid central manager (nil)"); + if ([self isConnected]) managerState = OSXBluetooth::CentralManagerDisconnecting; - [manager cancelPeripheralConnection:peripheral]; - } else { + else managerState = OSXBluetooth::CentralManagerIdle; - delegate->disconnected(); - } + + // We have to call -cancelPeripheralConnection: even + // if not connected (to cancel a pending connect attempt). + // Unfortunately, didDisconnect callback is not always called + // (despite of Apple's docs saying it _must_). + [manager cancelPeripheralConnection:peripheral]; } } diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index a2db5c0a..bb729c10 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -359,7 +359,7 @@ void QLowEnergyController::connectToDevice() return osx_d_ptr->error(UnknownError); // No QBluetoothDeviceInfo provided during construction. - if (!osx_d_ptr->deviceUuid.isNull()) + if (osx_d_ptr->deviceUuid.isNull()) return osx_d_ptr->error(UnknownRemoteDeviceError); if (osx_d_ptr->controllerState != UnconnectedState) @@ -376,9 +376,20 @@ void QLowEnergyController::disconnectFromDevice() OSX_D_PTR; if (osx_d_ptr->isValid()) { + const ControllerState oldState = osx_d_ptr->controllerState; + osx_d_ptr->controllerState = ClosingState; emit stateChanged(ClosingState); [osx_d_ptr->centralManager disconnectFromDevice]; + + if (oldState == ConnectingState) { + // With a pending connect attempt there is no + // guarantee we'll ever have didDisconnect callback, + // set the state here and now to make sure we still + // can connect. + osx_d_ptr->controllerState = UnconnectedState; + emit stateChanged(UnconnectedState); + } } } -- cgit v1.2.3 From 5de53cc79ecb83e3bce97567b1462ce432cc5759 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 21 Nov 2014 12:59:11 +0100 Subject: QLowEnergyController - service discovery (OS X and iOS) The initial version of service discovery failed to discover included services correctly, actually this discovery requires some kind of 'graph traversal' on the services tree. This patch re-implements the service discovery, discovering included services also and avoiding ... loops in services referencing each other (if it ever happens :) ) Change-Id: I60c6122fa5ddb922c21c99dd12024879cffad334 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 139 ++++++++++++---- src/bluetooth/osx/osxbtcentralmanager_p.h | 22 ++- src/bluetooth/osx/osxbtutility_p.h | 8 + src/bluetooth/qlowenergycontroller_osx.mm | 247 +++++++++++++++++++++++------ src/bluetooth/qlowenergycontroller_osx_p.h | 7 +- 5 files changed, 330 insertions(+), 93 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 3bd802d6..dd36a91f 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -39,7 +39,6 @@ ** ****************************************************************************/ -#include "osxbtcentralmanagerdelegate_p.h" #include "osxbtcentralmanager_p.h" #include @@ -68,6 +67,9 @@ using namespace QT_NAMESPACE; - (QLowEnergyController::Error)connectToDevice; // "Device" is in Qt's world ... - (void)connectToPeripheral; // "Peripheral" is in Core Bluetooth. +- (void)discoverIncludedServices; + +// Aux. functions. - (bool)connected; @end @@ -84,6 +86,7 @@ using namespace QT_NAMESPACE; disconnectPending = false; peripheral = nil; delegate = aDelegate; + currentService = 0; } return self; @@ -91,20 +94,17 @@ using namespace QT_NAMESPACE; - (void)dealloc { - typedef QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) TransientDelegate; + // In the past I had a 'transient delegate': I've seen some crashes + // while deleting a manager _before_ its state updated. + // Strangely enough, I can not reproduce this anymore, so this + // part is simplified now. To be investigated though. - if (managerState == OSXBluetooth::CentralManagerUpdating) { - // Here we have to trick with a transient delegate not to - // delete the manager too early - or Core Bluetooth will crash. - // State was not updated yet, too early to release. - TransientDelegate *const transient = [[TransientDelegate alloc] initWithManager:manager]; - // On ARC the lifetime of a transient delegate will become a problem, since delegate itself - // is a weak reference in a manager. - [manager setDelegate:transient]; - } else { - [manager setDelegate:nil]; - [manager release]; - } + visitedServices.reset(nil); + servicesToVisit.reset(nil); + servicesToVisitNext.reset(nil); + + [manager setDelegate:nil]; + [manager release]; [peripheral setDelegate:nil]; [peripheral release]; @@ -269,16 +269,35 @@ using namespace QT_NAMESPACE; [peripheral discoverServices:nil]; } -- (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid +- (void)discoverIncludedServices { - Q_UNUSED(serviceUuid) - return false; -} + using namespace OSXBluetooth; -- (bool)discoverCharacteristics:(const QBluetoothUuid &)serviceUuid -{ - Q_UNUSED(serviceUuid) - return false; + Q_ASSERT_X(managerState == CentralManagerIdle, "-discoverIncludedServices", + "invalid state"); + Q_ASSERT_X(manager, "-discoverIncludedServices", "invalid manager (nil)"); + Q_ASSERT_X(peripheral, "-discoverIncludedServices", "invalid peripheral (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + NSArray *const services = peripheral.services; + if (!services || !services.count) { // Actually, !services.count works in both cases, but ... + // A peripheral without any services at all. + Q_ASSERT_X(delegate, "-discoverIncludedServices", + "invalid delegate (null)"); + delegate->serviceDiscoveryFinished(ObjCStrongReference()); + } else { + // 'reset' also calls retain on a parameter. + servicesToVisitNext.reset(nil); + servicesToVisit.reset([NSMutableArray arrayWithArray:services]); + currentService = 0; + visitedServices.reset([NSMutableSet setWithCapacity:peripheral.services.count]); + + CBService *const s = [services objectAtIndex:currentService]; + [visitedServices addObject:s]; + managerState = CentralManagerDiscovering; + [peripheral discoverIncludedServices:nil forService:s]; + } } // CBCentralManagerDelegate (the real one). @@ -441,7 +460,6 @@ using namespace QT_NAMESPACE; { Q_UNUSED(aPeripheral) - if (managerState != OSXBluetooth::CentralManagerDiscovering) { // Canceled by -disconnectFromDevice. return; @@ -455,10 +473,7 @@ using namespace QT_NAMESPACE; // TODO: better error mapping required. delegate->error(QLowEnergyController::UnknownError); } else { - QT_BT_MAC_AUTORELEASEPOOL; - - OSXBluetooth::ObjCStrongReference services(peripheral.services, true); - delegate->serviceDiscoveryFinished(services); + [self discoverIncludedServices]; } } @@ -467,8 +482,74 @@ using namespace QT_NAMESPACE; error:(NSError *)error { Q_UNUSED(aPeripheral) - Q_UNUSED(service) - Q_UNUSED(error) + + using namespace OSXBluetooth; + + if (managerState != CentralManagerDiscovering) { + // Canceled by disconnectFromDevice or -peripheralDidDisconnect... + return; + } + + QT_BT_MAC_AUTORELEASEPOOL; + + Q_ASSERT_X(delegate, "-peripheral:didDiscoverIncludedServicesForService:", + "invalid delegate (null)"); + Q_ASSERT_X(peripheral, "-peripheral:didDiscoverIncludedServicesForService:", + "invalid peripheral (nil)"); + // TODO: asserts on other "pointers" ... + + managerState = CentralManagerIdle; + + if (error) { + // NSLog, not qCWarning/Critical - to log the actual NSError and service UUID. + NSLog(@"-peripheral:didDiscoverIncludedServicesForService:, finished with error %@ for service %@", + error, service.UUID); + } else if (service.includedServices && service.includedServices.count) { + // Now we have even more services to do included services discovery ... + if (!servicesToVisitNext) + servicesToVisitNext.reset([NSMutableArray arrayWithArray:service.includedServices]); + else + [servicesToVisitNext addObjectsFromArray:service.includedServices]; + } + + // Do we have something else to discover on this 'level'? + ++currentService; + + for (const NSUInteger e = [servicesToVisit count]; currentService < e; ++currentService) { + CBService *const s = [servicesToVisit objectAtIndex:currentService]; + if (![visitedServices containsObject:s]) { + // Continue with discovery ... + [visitedServices addObject:s]; + managerState = CentralManagerDiscovering; + return [peripheral discoverIncludedServices:nil forService:s]; + } + } + + // No services to visit more on this 'level'. + + if (servicesToVisitNext && [servicesToVisitNext count]) { + servicesToVisit.resetWithoutRetain(servicesToVisitNext.take()); + + currentService = 0; + for (const NSUInteger e = [servicesToVisit count]; currentService < e; ++currentService) { + CBService *const s = [servicesToVisit objectAtIndex:currentService]; + if (![visitedServices containsObject:s]) { + [visitedServices addObject:s]; + managerState = CentralManagerDiscovering; + return [peripheral discoverIncludedServices:nil forService:s]; + } + } + } + + // Finally, if we're here, the service discovery is done! + + // Release all these things now, no need to prolong their lifetime. + visitedServices.reset(nil); + servicesToVisit.reset(nil); + servicesToVisitNext.reset(nil); + + const ObjCStrongReference services(peripheral.services, true); // true == retain. + delegate->serviceDiscoveryFinished(services); } - (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverCharacteristicsForService:(CBService *)service diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 5f836f42..7ad51fb6 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -72,10 +72,6 @@ public: virtual void LEnotSupported() = 0; virtual void connectSuccess() = 0; virtual void serviceDiscoveryFinished(LEServices services) = 0; - virtual void includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LEServices services) = 0; - virtual void characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LECharacteristics characteristics) = 0; virtual void disconnected() = 0; // General errors. @@ -107,21 +103,31 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerState managerState; bool disconnectPending; - QBluetoothUuid deviceUuid; + QT_PREPEND_NAMESPACE(QBluetoothUuid) deviceUuid; CBPeripheral *peripheral; QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *delegate; + + // Quite a verbose service discovery machinery + // (a "graph traversal"). + QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference servicesToVisit; + // The service we're discovering now (included services discovery): + NSUInteger currentService; + // Included services, we'll iterate through at the end of 'servicesToVisit': + QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference servicesToVisitNext; + // We'd like to avoid loops in a services' topology: + QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference visitedServices; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; - (void)dealloc; -- (QLowEnergyController::Error)connectToDevice:(const QBluetoothUuid &)aDeviceUuid; +- (QT_PREPEND_NAMESPACE(QLowEnergyController)::Error) + connectToDevice:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)aDeviceUuid; + - (void)disconnectFromDevice; - (void)discoverServices; -- (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid; -- (bool)discoverCharacteristics:(const QBluetoothUuid &)serviceUuid; @end diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index 8c4083d9..fb7b9363 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -150,6 +150,14 @@ public: } } + void resetWithoutRetain(T *newVal) + { + if (m_ptr != newVal) { + [m_ptr release]; + m_ptr = newVal; + } + } + operator T *() const { return m_ptr; diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index bb729c10..74dec4af 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -51,6 +51,76 @@ QT_BEGIN_NAMESPACE +namespace { + + +class QLowEnergyControllerMetaTypes +{ +public: + QLowEnergyControllerMetaTypes() + { + qRegisterMetaType(); + qRegisterMetaType(); + } +} qLowEnergyControllerMetaTypes; + + +typedef QSharedPointer ServicePrivate; + +// Convenience function, can return a smart pointer that 'isNull'. +ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CBService *cbService, bool included) +{ + Q_ASSERT_X(controller, "createLEService()", "invalid controller (null)"); + Q_ASSERT_X(cbService, "createLEService()", "invalid service (nil)"); + + CBUUID *const cbUuid = cbService.UUID; + if (!cbUuid) { + qCDebug(QT_BT_OSX) << "createLEService(), invalid service, " + "UUID is nil"; + return ServicePrivate(); + } + + const QBluetoothUuid qtUuid(OSXBluetooth::qt_uuid(cbUuid)); + if (qtUuid.isNull()) // Conversion error is reported by qt_uuid. + return ServicePrivate(); + + ServicePrivate newService(new QLowEnergyServicePrivate); + newService->uuid = qtUuid; + newService->setController(controller); + + if (included) + newService->type |= QLowEnergyService::IncludedService; + + #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) + if (!cbService.isPrimary) { + // Our guess included/not was probably wrong. + newService->type &= ~QLowEnergyService::PrimaryService; + newService->type |= QLowEnergyService::IncludedService; + } + #endif + // No such property before 10_9/6_0. + return newService; +} + +typedef QList UUIDList; + +UUIDList qt_servicesUuids(NSArray *services) +{ + QT_BT_MAC_AUTORELEASEPOOL; + + if (!services || !services.count) + return UUIDList(); + + UUIDList uuids; + + for (CBService *s in services) + uuids.append(OSXBluetooth::qt_uuid(s.UUID)); + + return uuids; +} + +} + QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q) : q_ptr(q), isConnecting(false), @@ -125,51 +195,93 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service Q_ASSERT_X(controllerState == QLowEnergyController::DiscoveringState, "serviceDiscoveryFinished", "invalid state"); + using namespace OSXBluetooth; + QT_BT_MAC_AUTORELEASEPOOL; - for (CBService *service in services.data()) { - if (CBUUID *const uuid = service.UUID) { - const QBluetoothUuid qtUuid(OSXBluetooth::qt_uuid(uuid)); - if (discoveredServices.find(qtUuid) != discoveredServices.end()) { - qCDebug(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " - "a duplicate service UUID found: " << qtUuid; + // Now we have to traverse the discovered services tree. + // Essentially it's an iterative version of more complicated code from the + // OSXBTCentralManager's code. + // All Obj-C entities either auto-release, or guarded by ObjCScopedReferences. + if (services && [services count]) { + QMap discoveredCBServices; + //1. The first pass - none of this services is 'included' yet (we'll discover 'included' + // during the pass 2); we also ignore duplicates (== services with the same UUID) + // - since we do not have a way to distinguish them later + // (our API is using uuids when creating QLowEnergyServices). + for (CBService *cbService in services.data()) { + const ServicePrivate newService(qt_createLEService(this, cbService, false)); + if (!newService.data()) + continue; + if (discoveredServices.contains(newService->uuid)) { + // It's a bit stupid we first created it ... + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " + << "discovered service with a duplicated UUID "<uuid; continue; } + discoveredServices.insert(newService->uuid, newService); + discoveredCBServices.insert(newService->uuid, cbService); + } + + ObjCStrongReference toVisit([[NSMutableArray alloc] initWithArray:services], false); + ObjCStrongReference toVisitNext([[NSMutableArray alloc] init], false); + ObjCStrongReference visited([[NSMutableSet alloc] init], false); + + while (true) { + for (NSUInteger i = 0, e = [toVisit count]; i < e; ++i) { + CBService *const s = [toVisit objectAtIndex:i]; + if (![visited containsObject:s]) { + [visited addObject:s]; + if (s.includedServices && s.includedServices.count) + [toVisitNext addObjectsFromArray:s.includedServices]; + } + + const QBluetoothUuid uuid(qt_uuid(s.UUID)); + if (discoveredServices.contains(uuid) && discoveredCBServices.value(uuid) == s) { + ServicePrivate qtService(discoveredServices.value(uuid)); + // Add included UUIDs: + qtService->includedServices.append(qt_servicesUuids(s.includedServices)); + }// Else - we ignored this CBService object. + } - QSharedPointer newService(new QLowEnergyServicePrivate); - newService->uuid = qtUuid; -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) - if (!service.isPrimary) { - newService->type &= ~QLowEnergyService::PrimaryService; - newService->type |= QLowEnergyService::IncludedService; + if (![toVisitNext count]) + break; + + for (NSUInteger i = 0, e = [toVisitNext count]; i < e; ++i) { + CBService *const s = [toVisitNext objectAtIndex:i]; + const QBluetoothUuid uuid(qt_uuid(s.UUID)); + if (discoveredServices.contains(uuid)) { + if (discoveredCBServices.value(uuid) == s) { + ServicePrivate qtService(discoveredServices.value(uuid)); + qtService->type |= QLowEnergyService::IncludedService; + } // Else this is the duplicate we ignored already. + } else { + // Oh, we do not even have it yet??? + ServicePrivate newService(qt_createLEService(this, s, true)); + discoveredServices.insert(newService->uuid, newService); + discoveredCBServices.insert(newService->uuid, s); + } } -#endif - newService->setController(this); - discoveredServices.insert(qtUuid, newService); - emit q_ptr->serviceDiscovered(qtUuid); + + toVisit.resetWithoutRetain(toVisitNext.take()); + toVisitNext.resetWithoutRetain([[NSMutableArray alloc] init]); } + } else { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " + "no services found"; } - controllerState = QLowEnergyController::DiscoveredState; - emit q_ptr->stateChanged(QLowEnergyController::DiscoveredState); - emit q_ptr->discoveryFinished(); -} - -void QLowEnergyControllerPrivateOSX::includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LEServices services) -{ - Q_UNUSED(serviceUuid) - Q_UNUSED(services) -} + foreach (const QBluetoothUuid &uuid, discoveredServices.keys()) { + QMetaObject::invokeMethod(q_ptr, "serviceDiscovered", Qt::QueuedConnection, + Q_ARG(QBluetoothUuid, uuid)); + } -void QLowEnergyControllerPrivateOSX::characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LECharacteristics characteristics) -{ - Q_UNUSED(serviceUuid) - Q_UNUSED(characteristics) + controllerState = QLowEnergyController::DiscoveredState; + QMetaObject::invokeMethod(q_ptr, "stateChanged", Qt::QueuedConnection, + Q_ARG(QLowEnergyController::ControllerState, controllerState)); + QMetaObject::invokeMethod(q_ptr, "discoveryFinished", Qt::QueuedConnection); } - void QLowEnergyControllerPrivateOSX::disconnected() { controllerState = QLowEnergyController::UnconnectedState; @@ -183,32 +295,27 @@ void QLowEnergyControllerPrivateOSX::disconnected() void QLowEnergyControllerPrivateOSX::error(QLowEnergyController::Error errorCode) { // Errors reported during connect and general errors. - lastError = errorCode; // We're still in connectToDevice, // some error was reported synchronously. // Return, the error will be correctly set later // by connectToDevice. - if (isConnecting) + if (isConnecting) { + lastError = errorCode; return; - - switch (lastError) { - case QLowEnergyController::UnknownRemoteDeviceError: - errorString = QLowEnergyController::tr("Remote device cannot be found"); - break; - case QLowEnergyController::InvalidBluetoothAdapterError: - errorString = QLowEnergyController::tr("Cannot find local adapter"); - break; - case QLowEnergyController::NetworkError: - errorString = QLowEnergyController::tr("Error occurred during connection I/O"); - break; - case QLowEnergyController::UnknownError: - default: - errorString = QLowEnergyController::tr("Unknown Error"); - break; } + setErrorDescription(errorCode); emit q_ptr->error(lastError); + + if (controllerState == QLowEnergyController::ConnectingState) { + controllerState = QLowEnergyController::UnconnectedState; + emit q_ptr->stateChanged(controllerState); + } else if (controllerState == QLowEnergyController::DiscoveringState) { + controllerState = QLowEnergyController::ConnectedState; + emit q_ptr->stateChanged(controllerState); + } // In any other case we stay in Discovered, it's + // a service/characteristic - related error. } void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, @@ -229,8 +336,7 @@ void QLowEnergyControllerPrivateOSX::connectToDevice() Q_ASSERT_X(!isConnecting, "connectToDevice", "recursive connectToDevice call"); - lastError = QLowEnergyController::NoError; - errorString.clear(); + setErrorDescription(QLowEnergyController::NoError); isConnecting = true;// Do not emit signals if some callback is executed synchronously. controllerState = QLowEnergyController::ConnectingState; @@ -272,6 +378,42 @@ void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid Q_UNUSED(serviceUuid); } +void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::Error errorCode) +{ + // This function does not emit! + + lastError = errorCode; + + switch (lastError) { + case QLowEnergyController::NoError: + errorString.clear(); + break; + case QLowEnergyController::UnknownRemoteDeviceError: + errorString = QLowEnergyController::tr("Remote device cannot be found"); + break; + case QLowEnergyController::InvalidBluetoothAdapterError: + errorString = QLowEnergyController::tr("Cannot find local adapter"); + break; + case QLowEnergyController::NetworkError: + errorString = QLowEnergyController::tr("Error occurred during connection I/O"); + break; + case QLowEnergyController::UnknownError: + default: + errorString = QLowEnergyController::tr("Unknown Error"); + break; + } +} + +void QLowEnergyControllerPrivateOSX::invalidateServices() +{ + foreach (const QSharedPointer service, discoveredServices.values()) { + service->setController(Q_NULLPTR); + service->setState(QLowEnergyService::InvalidService); + } + + discoveredServices.clear(); +} + QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddress, QObject *parent) : QObject(parent), @@ -380,6 +522,7 @@ void QLowEnergyController::disconnectFromDevice() osx_d_ptr->controllerState = ClosingState; emit stateChanged(ClosingState); + osx_d_ptr->invalidateServices(); [osx_d_ptr->centralManager disconnectFromDevice]; if (oldState == ConnectingState) { diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index 4162c764..36257e02 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -66,10 +66,6 @@ private: void connectSuccess() Q_DECL_OVERRIDE; void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; - void includedServicesDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LEServices services) Q_DECL_OVERRIDE; - void characteristicsDiscoveryFinished(const QBluetoothUuid &serviceUuid, - LECharacteristics characteristics) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; void error(QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; void error(const QBluetoothUuid &serviceUuid, @@ -79,6 +75,9 @@ private: void discoverServices(); void discoverServiceDetails(const QBluetoothUuid &serviceUuid); + void setErrorDescription(QLowEnergyController::Error errorCode); + void invalidateServices(); + QLowEnergyController *q_ptr; QBluetoothUuid deviceUuid; // To be sure we set controller's state correctly -- cgit v1.2.3 From 6ed49688149fd43b3d4c5aa0415191a8c1cdc1a5 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 18 Nov 2014 08:50:54 +0100 Subject: Android: characteristic changed notification support Change-Id: I4c50df7d758390989c2e2127f7646e5d2dc34712 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 39 +++++++++++++++++++--- src/bluetooth/android/jni_android.cpp | 2 ++ src/bluetooth/android/lowenergynotificationhub.cpp | 21 ++++++++++++ src/bluetooth/android/lowenergynotificationhub_p.h | 3 ++ src/bluetooth/qlowenergycontroller_android.cpp | 22 ++++++++++++ src/bluetooth/qlowenergycontroller_p.h | 1 + 6 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 988f3c3d..618be1ea 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -45,6 +45,7 @@ import android.bluetooth.BluetoothProfile; import android.util.Log; import java.util.ArrayList; +import java.util.Arrays; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; @@ -57,6 +58,7 @@ public class QtBluetoothLE { private BluetoothGatt mBluetoothGatt = null; private String mRemoteGattAddress; + final UUID clientCharacteristicUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); /* Pointer to the Qt object that "owns" the Java object */ @@ -271,7 +273,13 @@ public class QtBluetoothLE { public void onCharacteristicChanged(android.bluetooth.BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic) { - System.out.println("onCharacteristicChanged"); + int handle = handleForCharacteristic(characteristic); + if (handle == -1) { + Log.w(TAG,"onCharacteristicChanged: cannot find handle"); + return; + } + + leCharacteristicChanged(qtObject, handle+1, characteristic.getValue()); } public void onDescriptorRead(android.bluetooth.BluetoothGatt gatt, @@ -839,6 +847,31 @@ public class QtBluetoothLE { skip = true; break; case Descriptor: + if (nextJob.entry.descriptor.getUuid().compareTo(clientCharacteristicUuid) == 0) { + /* + For some reason, Android splits characteristic notifications + into two operations. BluetoothGatt.enableCharacteristicNotification + ensures the local Blueooth stack forwards the notifications. In addition, + BluetoothGattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE) + must be written to the peripheral + */ + + boolean enableNotifications = true; + if (Arrays.equals(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE, + nextJob.newValue)) + enableNotifications = false; + + result = mBluetoothGatt.setCharacteristicNotification( + nextJob.entry.descriptor.getCharacteristic(), enableNotifications); + if (!result) { + Log.w(TAG, "Cannot set characteristic notification"); + //we continue anyway to ensure that we write the requested value + //to the device + } + + Log.d(TAG, "Enable notifications: " + enableNotifications); + } + result = nextJob.entry.descriptor.setValue(nextJob.newValue); if (!result || !mBluetoothGatt.writeDescriptor(nextJob.entry.descriptor)) skip = true; @@ -847,7 +880,6 @@ public class QtBluetoothLE { case CharacteristicValue: skip = true; break; - } if (!skip) @@ -860,7 +892,6 @@ public class QtBluetoothLE { } } - public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); public native void leServicesDiscovered(long qtObject, int errorCode, String uuidList); public native void leServiceDetailDiscoveryFinished(long qtObject, final String serviceUuid, @@ -874,6 +905,6 @@ public class QtBluetoothLE { int errorCode); public native void leDescriptorWritten(long qtObject, int charHandle, byte[] newData, int errorCode); - + public native void leCharacteristicChanged(long qtObject, int charHandle, byte[] newData); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index 7eacd3bc..a877b6bf 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -213,6 +213,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_characteristicWritten}, {"leDescriptorWritten", "(JI[BI)V", (void *) LowEnergyNotificationHub::lowEnergy_descriptorWritten}, + {"leCharacteristicChanged", "(JI[B)V", + (void *) LowEnergyNotificationHub::lowEnergy_characteristicChanged}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 00ef4ff0..a0dbe565 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -260,4 +260,25 @@ void LowEnergyNotificationHub::lowEnergy_descriptorWritten( (QLowEnergyService::ServiceError)errorCode)); } +void LowEnergyNotificationHub::lowEnergy_characteristicChanged( + JNIEnv *env, jobject, jlong qtObject, jint charHandle, jbyteArray data) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QByteArray payload; + if (data) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(data); + payload.resize(length); + env->GetByteArrayRegion(data, 0, length, + reinterpret_cast(payload.data())); + } + + QMetaObject::invokeMethod(hub, "characteristicChanged", Qt::QueuedConnection, + Q_ARG(int, charHandle), Q_ARG(QByteArray, payload)); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index b3399a8d..286c8120 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -74,6 +74,8 @@ public: static void lowEnergy_descriptorWritten(JNIEnv *, jobject, jlong qtObject, jint descHandle, jbyteArray data, jint errorCode); + static void lowEnergy_characteristicChanged(JNIEnv *, jobject, jlong qtObject, + jint charHandle, jbyteArray data); QAndroidJniObject javaObject() { @@ -95,6 +97,7 @@ signals: QLowEnergyService::ServiceError errorCode); void descriptorWritten(int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); + void characteristicChanged(int charHandle, const QByteArray &data); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index a28feaf6..e2624a56 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -78,6 +78,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::characteristicWritten); connect(hub, &LowEnergyNotificationHub::descriptorWritten, this, &QLowEnergyControllerPrivate::descriptorWritten); + connect(hub, &LowEnergyNotificationHub::characteristicChanged, + this, &QLowEnergyControllerPrivate::characteristicChanged); } if (!hub->javaObject().isValid()) { @@ -432,4 +434,24 @@ void QLowEnergyControllerPrivate::descriptorWritten( emit service->descriptorWritten(descriptor, data); } +void QLowEnergyControllerPrivate::characteristicChanged( + int charHandle, const QByteArray &data) +{ + QSharedPointer service = + serviceForHandle(charHandle); + if (service.isNull()) + return; + + qCDebug(QT_BT_ANDROID) << "Characteristic change notification" << service->uuid + << charHandle << data.toHex(); + + QLowEnergyCharacteristic characteristic = characteristicForHandle(charHandle); + if (!characteristic.isValid()) { + qCWarning(QT_BT_ANDROID) << "characteristicChanged: Cannot find characteristic"; + return; + } + + emit service->characteristicChanged(characteristic, data); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 17c28cd6..add92b43 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -208,6 +208,7 @@ private slots: QLowEnergyService::ServiceError errorCode); void descriptorWritten(int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); + void characteristicChanged(int charHandle, const QByteArray &data); #endif private: QLowEnergyController *q_ptr; -- cgit v1.2.3 From 73563f571e6dfd37a0e4cf90f4679d9901b9233c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 24 Nov 2014 11:02:42 +0100 Subject: Improve lowenergyscanner status reporting Change-Id: If6fccce951c2f3c3787cde2fa593e65da26f4370 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- examples/bluetooth/lowenergyscanner/assets/Characteristics.qml | 3 ++- examples/bluetooth/lowenergyscanner/assets/Services.qml | 8 +++----- examples/bluetooth/lowenergyscanner/device.cpp | 7 ++++--- examples/bluetooth/lowenergyscanner/device.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml index ac3b7151..8e6e2868 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml @@ -141,10 +141,11 @@ Rectangle { id: menu anchors.bottom: parent.bottom menuWidth: parent.width - menuText: "Scanning" + menuText: device.update menuHeight: (parent.height/6) onButtonClick: { pageLoader.source = "Services.qml" + device.update = "Back" } } } diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml index a433d445..e3e05cac 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Services.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -76,10 +76,6 @@ Rectangle { else info.visible = false; } - - onDisconnected: { - pageLoader.source = "main.qml" - } } ListView { @@ -137,10 +133,12 @@ Rectangle { id: menu anchors.bottom: parent.bottom menuWidth: parent.width - menuText: "Back" + menuText: device.update menuHeight: (parent.height/6) onButtonClick: { device.disconnectFromDevice() + pageLoader.source = "main.qml" + device.update = "Search" } } } diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index 1f1e11c4..9175095c 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -155,7 +155,7 @@ void Device::scanServices(const QString &address) m_services.clear(); emit servicesUpdated(); - setUpdate("Connecting to device..."); + setUpdate("Back\n(Connecting to device...)"); if (controller && controller->remoteAddress() != currentDevice.getDevice().address()) { controller->disconnectFromDevice(); @@ -205,7 +205,7 @@ void Device::addLowEnergyService(const QBluetoothUuid &serviceUuid) void Device::serviceScanDone() { - setUpdate("Service scan done!"); + setUpdate("Back\n(Service scan done!)"); // force UI in case we didn't find anything if (m_services.isEmpty()) emit servicesUpdated(); @@ -234,6 +234,7 @@ void Device::connectToService(const QString &uuid) connect(service, SIGNAL(stateChanged(QLowEnergyService::ServiceState)), this, SLOT(serviceDetailsDiscovered(QLowEnergyService::ServiceState))); service->discoverDetails(); + setUpdate("Back\n(Discovering details...)"); //! [les-service-3] return; } @@ -250,7 +251,7 @@ void Device::connectToService(const QString &uuid) void Device::deviceConnected() { - setUpdate("Discovering services!"); + setUpdate("Back\n(Discovering services...)"); connected = true; //! [les-service-2] controller->discoverServices(); diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h index 049d1c61..a12f9e0e 100644 --- a/examples/bluetooth/lowenergyscanner/device.h +++ b/examples/bluetooth/lowenergyscanner/device.h @@ -63,7 +63,7 @@ class Device: public QObject Q_PROPERTY(QVariant devicesList READ getDevices NOTIFY devicesUpdated) Q_PROPERTY(QVariant servicesList READ getServices NOTIFY servicesUpdated) Q_PROPERTY(QVariant characteristicList READ getCharacteristics NOTIFY characteristicsUpdated) - Q_PROPERTY(QString update READ getUpdate NOTIFY updateChanged) + Q_PROPERTY(QString update READ getUpdate WRITE setUpdate NOTIFY updateChanged) Q_PROPERTY(bool useRandomAddress READ isRandomAddress WRITE setRandomAddress NOTIFY randomAddressChanged) Q_PROPERTY(bool state READ state NOTIFY stateChanged) Q_PROPERTY(bool controllerError READ hasControllerError) -- cgit v1.2.3 From ed7b872168020e1b3d22e1a475af00b7d5e252e6 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 24 Nov 2014 15:15:06 +0100 Subject: QLowEnergyService - primary/secondary (OS X and iOS) It looks like isPrimary property is always 'NO' on CBService objects discovered making this property ... hmm, TOTALLY USELESS? Change-Id: Ia38323c204e6cf1c3def3bbb3deb08bb8cdf90e4 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_osx.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 74dec4af..b576e76f 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -91,6 +91,7 @@ ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CB if (included) newService->type |= QLowEnergyService::IncludedService; + /* #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) if (!cbService.isPrimary) { // Our guess included/not was probably wrong. @@ -98,6 +99,7 @@ ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CB newService->type |= QLowEnergyService::IncludedService; } #endif + */ // No such property before 10_9/6_0. return newService; } -- cgit v1.2.3 From 101327b369e035ab1f4fbc157e4c411b7db4a3c8 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 24 Nov 2014 13:54:44 +0100 Subject: lowenergyscanned - update example (iOS and OS X) With Core Bluetooth low energy controller must be created using device info, not address (which is invalid on OS X and iOS). Change-Id: I30cb3a061e2cd882981d7e65d636c63e57c36f8e Reviewed-by: Alex Blasche --- examples/bluetooth/lowenergyscanner/device.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index b9c8b532..c8cd17bd 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -166,7 +166,11 @@ void Device::scanServices(const QString &address) //! [les-controller-1] if (!controller) { // Connecting signals and slots for connecting to LE services. +#ifdef Q_OS_MAC + controller = new QLowEnergyController(currentDevice.getDevice()); +#else controller = new QLowEnergyController(currentDevice.getDevice().address()); +#endif connect(controller, SIGNAL(connected()), this, SLOT(deviceConnected())); connect(controller, SIGNAL(error(QLowEnergyController::Error)), -- cgit v1.2.3 From 4c25743910622a4834d8ebb7f3acc59e025a3c41 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 21 Nov 2014 17:57:36 +0100 Subject: QLowEnergyController - service details discovery (OS X and iOS) Implement details discovery: characteristics, their values (if any), descriptors. We have to emulate handles (QLowEnergyHandle) - while Core Bluetooth internally has the notion of handles, it never exposes them as a public API. Change-Id: I09158433ce6835dd34fe8ad47d047212dab59e8e Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 449 ++++++++++++++++++++++++++++- src/bluetooth/osx/osxbtcentralmanager_p.h | 6 +- src/bluetooth/osx/osxbtutility.mm | 35 ++- src/bluetooth/osx/osxbtutility_p.h | 3 + src/bluetooth/qlowenergycontroller_osx.mm | 102 ++++++- src/bluetooth/qlowenergycontroller_osx_p.h | 8 + 6 files changed, 588 insertions(+), 15 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index dd36a91f..71622b1c 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -68,9 +68,18 @@ using namespace QT_NAMESPACE; - (QLowEnergyController::Error)connectToDevice; // "Device" is in Qt's world ... - (void)connectToPeripheral; // "Peripheral" is in Core Bluetooth. - (void)discoverIncludedServices; +- (void)readCharacteristics:(CBService *)service; +- (void)serviceDetailsDiscoveryFinished:(CBService *)service; // Aux. functions. -- (bool)connected; +- (CBService *)serviceForUUID:(const QBluetoothUuid &)qtUuid; +- (CBCharacteristic *)nextCharacteristicForService:(CBService*)service + startingFrom:(CBCharacteristic *)from; +- (CBCharacteristic *)nextCharacteristicForService:(CBService*)service + startingFrom:(CBCharacteristic *)from + withProperties:(CBCharacteristicProperties)properties; +- (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic + startingFrom:(CBDescriptor *)descriptor; @end @@ -233,6 +242,8 @@ using namespace QT_NAMESPACE; - (void)disconnectFromDevice { + servicesToDiscoverDetails.clear(); + if (managerState == OSXBluetooth::CentralManagerUpdating) { disconnectPending = true; } else { @@ -300,6 +311,291 @@ using namespace QT_NAMESPACE; } } +- (bool)discoverServiceDetails:(const QBluetoothUuid &)serviceUuid +{ + // This function does not change 'managerState', since it + // can be called concurrently (not waiting for the previous + // discovery to finish). + + using namespace OSXBluetooth; + + Q_ASSERT_X(managerState != CentralManagerUpdating, "-discoverServiceDetails:", + "invalid state"); + Q_ASSERT_X(!serviceUuid.isNull(), "-discoverServiceDetails:", + "invalid service UUID"); + Q_ASSERT_X(peripheral, "-discoverServiceDetailsl:", + "invalid peripheral (nil)"); + + if (servicesToDiscoverDetails.contains(serviceUuid)) { + qCWarning(QT_BT_OSX) << "-discoverServiceDetails: " + "already discovering for " << serviceUuid; + return true; + } + + QT_BT_MAC_AUTORELEASEPOOL; + + if (CBService *const service = [self serviceForUUID:serviceUuid]) { + servicesToDiscoverDetails.append(serviceUuid); + [peripheral discoverCharacteristics:nil forService:service]; + return true; + } + + qCWarning(QT_BT_OSX) << "-discoverServiceDetails:, invalid service - " + "unknown uuid " << serviceUuid; + + return false; +} + +- (void)readCharacteristics:(CBService *)service +{ + // This method does not change 'managerState', we can + // have several 'detail discoveries' active. + Q_ASSERT_X(service, "-readCharacteristics:", "invalid service (nil)"); + + using namespace OSXBluetooth; + + QT_BT_MAC_AUTORELEASEPOOL; + + Q_ASSERT_X(managerState != CentralManagerUpdating, "-readCharacteristics:", + "invalid state"); + Q_ASSERT_X(manager, "-readCharacteristics:", "invalid manager (nil)"); + Q_ASSERT_X(peripheral, "-readCharacteristics:", "invalid peripheral (nil)"); + Q_ASSERT_X(delegate, "-readCharacteristics:", "invalid delegate (null)"); + + if (!service.characteristics || !service.characteristics.count) + return [self serviceDetailsDiscoveryFinished:service]; + + NSArray *const cs = service.characteristics; + for (CBCharacteristic *c in cs) { + if (c.properties & CBCharacteristicPropertyRead) + return [peripheral readValueForCharacteristic:c]; + } + + // No readable properties? Discover descriptors then: + [self discoverDescriptors:service]; +} + +- (void)discoverDescriptors:(CBService *)service +{ + // This method does not change 'managerState', we can have + // several discoveries active. + Q_ASSERT_X(service, "-discoverDescriptors:", "invalid service (nil)"); + + using namespace OSXBluetooth; + + QT_BT_MAC_AUTORELEASEPOOL; + + Q_ASSERT_X(managerState != CentralManagerUpdating, "-discoverDescriptors", + "invalid state"); + Q_ASSERT_X(manager, "-discoverDescriptors:", "invalid manager (nil)"); + Q_ASSERT_X(peripheral, "-discoverDescriptors:", "invalid peripheral (nil)"); + + if (!service.characteristics || !service.characteristics.count) { + [self serviceDetailsDiscoveryFinished:service]; + } else { + // Start from 0 and continue in the callback. + [peripheral discoverDescriptorsForCharacteristic:[service.characteristics objectAtIndex:0]]; + } +} + +- (void)readDescriptors:(CBService *)service +{ + Q_ASSERT_X(service, "-readDescriptors:", + "invalid service (nil)"); + Q_ASSERT_X(managerState != OSXBluetooth::CentralManagerUpdating, + "-readDescriptors:", + "invalid state"); + Q_ASSERT_X(peripheral, "-readDescriptors:", + "invalid peripheral (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + NSArray *const cs = service.characteristics; + // We can never be here if we have no characteristics. + Q_ASSERT_X(cs && cs.count, "-readDescriptors:", + "invalid service"); + for (CBCharacteristic *c in cs) { + if (c.descriptors && c.descriptors.count) + return [peripheral readValueForDescriptor:[c.descriptors objectAtIndex:0]]; + } + + // No descriptors to read, done. + [self serviceDetailsDiscoveryFinished:service]; +} + +- (void)serviceDetailsDiscoveryFinished:(CBService *)service +{ + // + Q_ASSERT_X(service, "-serviceDetailsDiscoveryFinished:", + "invalid service (nil)"); + Q_ASSERT_X(delegate, "-serviceDetailsDiscoveryFinished:", + "invalid delegate (null)"); + + using namespace OSXBluetooth; + + servicesToDiscoverDetails.removeAll(qt_uuid(service.UUID)); + delegate->serviceDetailsDiscoveryFinished(ObjCStrongReference(service, true)); +} + +// Aux. methods: + +- (CBService *)serviceForUUID:(const QBluetoothUuid &)qtUuid +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(!qtUuid.isNull(), "-serviceForUUID:", + "invalid uuid"); + Q_ASSERT_X(peripheral, "-serviceForUUID:", + "invalid peripherla (nil)"); + + ObjCStrongReference toVisit([NSMutableArray arrayWithArray:peripheral.services], true); + ObjCStrongReference toVisitNext([[NSMutableArray alloc] init], false); + ObjCStrongReference visitedNodes([[NSMutableSet alloc] init], false); + + while (true) { + for (NSUInteger i = 0, e = [toVisit count]; i < e; ++i) { + CBService *const s = [toVisit objectAtIndex:i]; + if (equal_uuids(s.UUID, qtUuid)) + return s; + if ([visitedNodes containsObject:s] && s.includedServices && s.includedServices.count) { + [visitedNodes addObject:s]; + [toVisitNext addObjectsFromArray:s.includedServices]; + } + } + + if (![toVisitNext count]) + return nil; + + toVisit.resetWithoutRetain(toVisitNext.take()); + toVisitNext.resetWithoutRetain([[NSMutableArray alloc] init]); + } + + return nil; +} + +- (CBCharacteristic *)nextCharacteristicForService:(CBService*)service + startingFrom:(CBCharacteristic *)characteristic +{ + Q_ASSERT_X(service, "-nextCharacteristicForService:startingFrom:", + "invalid service (nil)"); + Q_ASSERT_X(characteristic, "-nextCharacteristicForService:startingFrom:", + "invalid characteristic (nil)"); + Q_ASSERT_X(service.characteristics, "-nextCharacteristicForService:startingFrom:", + "invalid service"); + Q_ASSERT_X(service.characteristics.count, "-nextCharacteristicForService:startingFrom:", + "invalid service"); + + QT_BT_MAC_AUTORELEASEPOOL; + + // TODO: test that we NEVER have the same characteristic twice in array! + // At the moment I just protect against this by iterating in a reverse + // order (at least avoiding a potential inifite loop with '-indexOfObject:'). + NSArray *const cs = service.characteristics; + if (cs.count == 1) + return nil; + + for (NSUInteger index = cs.count - 1; index != 0; --index) { + if ([cs objectAtIndex:index] == characteristic) { + if (index + 1 == cs.count) + return nil; + else + return [cs objectAtIndex:index + 1]; + } + } + + Q_ASSERT_X([cs objectAtIndex:0] == characteristic, + "-nextCharacteristicForService:startingFrom:", + "characteristic was not found in service.characteristics"); + + return [cs objectAtIndex:1]; +} + +- (CBCharacteristic *)nextCharacteristicForService:(CBService*)service + startingFrom:(CBCharacteristic *)characteristic + properties:(CBCharacteristicProperties)properties +{ + Q_ASSERT_X(service, "-nextCharacteristicForService:startingFrom:properties:", + "invalid service (nil)"); + Q_ASSERT_X(characteristic, "-nextCharacteristicForService:startingFrom:properties:", + "invalid characteristic (nil)"); + Q_ASSERT_X(service.characteristics, "-nextCharacteristicForService:startingFrom:properties:", + "invalid service"); + Q_ASSERT_X(service.characteristics.count, "-nextCharacteristicForService:startingFrom:properties:", + "invalid service"); + + QT_BT_MAC_AUTORELEASEPOOL; + + // TODO: test that we NEVER have the same characteristic twice in array! + // At the moment I just protect against this by iterating in a reverse + // order (at least avoiding a potential inifite loop with '-indexOfObject:'). + NSArray *const cs = service.characteristics; + if (cs.count == 1) + return nil; + + NSUInteger index = cs.count - 1; + for (; index != 0; --index) { + if ([cs objectAtIndex:index] == characteristic) { + if (index + 1 == cs.count) { + return nil; + } else { + index += 1; + break; + } + } + } + + if (!index) { + Q_ASSERT_X([cs objectAtIndex:0] == characteristic, + "-nextCharacteristicForService:startingFrom:properties:", + "characteristic not found in service.characteristics"); + index = 1; + } + + for (const NSUInteger e = cs.count; index < e; ++index) { + CBCharacteristic *const c = [cs objectAtIndex:index]; + if (c.properties & properties) + return c; + } + + return nil; +} + +- (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic + startingFrom:(CBDescriptor *)descriptor +{ + Q_ASSERT_X(characteristic, "-nextDescriptorForCharacteristic:startingFrom:", + "invalid characteristic (nil)"); + Q_ASSERT_X(descriptor, "-nextDescriptorForCharacteristic:startingFrom:", + "invalid descriptor (nil)"); + Q_ASSERT_X(characteristic.descriptors, + "-nextDescriptorForCharacteristic:startingFrom:", + "invalid characteristic"); + Q_ASSERT_X(characteristic.descriptors.count, + "-nextDescriptorForCharacteristic:startingFrom:", + "invalid characteristic"); + + QT_BT_MAC_AUTORELEASEPOOL; + + NSArray *const ds = characteristic.descriptors; + if (ds.count == 1) + return nil; + + for (NSUInteger index = ds.count - 1; index != 0; --index) { + if ([ds objectAtIndex:index] == descriptor) { + if (index + 1 == ds.count) + return nil; + else + return [ds objectAtIndex:index + 1]; + } + } + + Q_ASSERT_X([ds objectAtIndex:0] == descriptor, + "-nextDescriptorForCharacteristic:startingFrom:", + "descriptor was not found in characteristic.descriptors"); + + return [ds objectAtIndex:1]; +} + // CBCentralManagerDelegate (the real one). - (void)centralManagerDidUpdateState:(CBCentralManager *)central @@ -555,9 +851,156 @@ using namespace QT_NAMESPACE; - (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { + // This method does not change 'managerState', we can have several + // discoveries active. Q_UNUSED(aPeripheral) - Q_UNUSED(service) - Q_UNUSED(error) + + // TODO: check that this can never be called after cancelPeripheralConnection was executed. + + using namespace OSXBluetooth; + + Q_ASSERT_X(managerState != CentralManagerUpdating, + "-peripheral:didDiscoverCharacteristicsForService:", + "invalid state"); + Q_ASSERT_X(delegate, "-peripheral:didDiscoverCharacteristicsForService:", + "invalid delegate (null)"); + + if (error) { + // NSLog to show the actual NSError (can contain something interesting). + NSLog(@"-peripheral:didDiscoverCharacteristicsForService:error, failed with error: %@", + error); + // We did not discover any characteristics and can not discover descriptors, + // inform our delegate (it will set a service state also). + delegate->error(qt_uuid(service.UUID), QLowEnergyController::UnknownError); + } else { + [self readCharacteristics:service]; + } +} + +- (void)peripheral:(CBPeripheral *)aPeripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + + using namespace OSXBluetooth; + + Q_ASSERT_X(managerState != CentralManagerUpdating, + "-peripheral:didUpdateValueForCharacteristic:error:", + "invalid state"); + Q_ASSERT_X(peripheral, "-peripheral:didUpdateValueForCharacteristic:error:", + "invalid peripheral (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + // First, let's check if we're discovering a service details now. + CBService *const service = characteristic.service; + const QBluetoothUuid qtUuid(qt_uuid(service.UUID)); + const bool isDetailsDiscovery = servicesToDiscoverDetails.contains(qtUuid); + + if (error) { + // Use NSLog, not qCDebug/qCWarning to log the actual error. + NSLog(@"-peripheral:didUpdateValueForCharacteristic:error:, failed with error %@", + error); + + if (!isDetailsDiscovery) { + // TODO: this can be something else in a future (if needed at all). + return; + } + } + + if (isDetailsDiscovery) { + // Test if we have any other characteristic to read yet. + CBCharacteristic *const next = [self nextCharacteristicForService:characteristic.service + startingFrom:characteristic properties:CBCharacteristicPropertyRead]; + if (next) + [peripheral readValueForCharacteristic:next]; + else + [self discoverDescriptors:characteristic.service]; + } else { + // TODO: this can be something else in a future (if needed at all). + } +} + +- (void)peripheral:(CBPeripheral *)aPeripheral + didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error +{ + // This method does not change 'managerState', we can + // have several discoveries active at the same time. + Q_UNUSED(aPeripheral) + + QT_BT_MAC_AUTORELEASEPOOL; + + using namespace OSXBluetooth; + + if (error) { + // Log the error using NSLog: + NSLog(@"-peripheral:didDiscoverDescriptorsForCharacteristic:error:, failed with error %@", + error); + // Probably, we can continue though ... + } + + // Do we have more characteristics on this service to discover descriptors? + CBCharacteristic *const next = [self nextCharacteristicForService:characteristic.service + startingFrom:characteristic]; + if (next) + [peripheral discoverDescriptorsForCharacteristic:next]; + else + [self readDescriptors:characteristic.service]; +} + +- (void)peripheral:(CBPeripheral *)aPeripheral + didUpdateValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + + Q_ASSERT_X(peripheral, "-peripheral:didUpdateValueForDescriptor:error:", + "invalid peripheral (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + using namespace OSXBluetooth; + + CBService *const service = descriptor.characteristic.service; + const QBluetoothUuid qtUuid(qt_uuid(service.UUID)); + const bool isDetailsDiscovery = servicesToDiscoverDetails.contains(qtUuid); + + if (error) { + // NSLog to log the actual error ... + NSLog(@"-peripheral:didUpdateValueForDescriptor:error:, failed with error %@", + error); + if (!isDetailsDiscovery) { + // TODO: probably will be required in a future. + return; + } + } + + if (isDetailsDiscovery) { + // Test if we have any other characteristic to read yet. + CBDescriptor *const next = [self nextDescriptorForCharacteristic:descriptor.characteristic + startingFrom:descriptor]; + if (next) { + [peripheral readValueForDescriptor:next]; + } else { + // We either have to read a value for a next descriptor + // on a given characteristic, or continue with the + // next characteristic in a given service (if any). + CBCharacteristic *const ch = descriptor.characteristic; + CBCharacteristic *nextCh = [self nextCharacteristicForService:ch.service + startingFrom:ch]; + while (nextCh) { + if (nextCh.descriptors && nextCh.descriptors.count) + return [peripheral readValueForDescriptor:[nextCh.descriptors objectAtIndex:0]]; + + nextCh = [self nextCharacteristicForService:ch.service + startingFrom:nextCh]; + } + + [self serviceDetailsDiscoveryFinished:service]; + } + } else { + // TODO: this can be something else in a future (if needed at all). + } } @end diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 7ad51fb6..25faab78 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -65,13 +65,14 @@ class CentralManagerDelegate public: typedef QT_MANGLE_NAMESPACE(OSXBTCentralManager) ObjCCentralManager; typedef ObjCStrongReference LEServices; - typedef LEServices LECharacteristics; + typedef ObjCStrongReference LEService; virtual ~CentralManagerDelegate(); virtual void LEnotSupported() = 0; virtual void connectSuccess() = 0; virtual void serviceDiscoveryFinished(LEServices services) = 0; + virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; virtual void disconnected() = 0; // General errors. @@ -117,6 +118,8 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference servicesToVisitNext; // We'd like to avoid loops in a services' topology: QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference visitedServices; + + QT_PREPEND_NAMESPACE(QList) servicesToDiscoverDetails; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; @@ -128,6 +131,7 @@ QT_END_NAMESPACE - (void)disconnectFromDevice; - (void)discoverServices; +- (bool)discoverServiceDetails:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid; @end diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index 69e94434..1b07e2cb 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -43,6 +43,7 @@ #include "osxbtutility_p.h" #include "qbluetoothuuid.h" +#include #include #ifndef QT_IOS_BLUETOOTH @@ -176,12 +177,10 @@ QBluetoothUuid qt_uuid(CBUUID *uuid) QT_BT_MAC_AUTORELEASEPOOL; if (uuid.data.length == 2) { - // TODO: this is .. UGLY :) - quint16 qtUuidData = 0; - const quint8 *const source = static_cast(uuid.data.bytes); - std::copy(source, source + 2, &qtUuidData); - - return QBluetoothUuid(qtUuidData); + // CBUUID's docs say nothing about byte-order. + // Seems to be in big-endian. + const uchar *const src = static_cast(uuid.data.bytes); + return QBluetoothUuid(qFromBigEndian(src)); } else if (uuid.data.length == 16) { quint128 qtUuidData = {}; const quint8 *const source = static_cast(uuid.data.bytes); @@ -223,6 +222,30 @@ ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid) return cbUuid; } +bool equal_uuids(const QBluetoothUuid &qtUuid, CBUUID *cbUuid) +{ + const QBluetoothUuid qtUuid2(qt_uuid(cbUuid)); + return qtUuid == qtUuid2; +} + +bool equal_uuids(CBUUID *cbUuid, const QBluetoothUuid &qtUuid) +{ + return equal_uuids(qtUuid, cbUuid); +} + +QByteArray qt_bytearray(NSData *data) +{ + QByteArray value; + if (!data || !data.length) + return value; + + value.resize(data.length); + const char *const src = static_cast(data.bytes); + std::copy(src, src + data.length, value.data()); + + return value; +} + } QT_END_NAMESPACE diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index fb7b9363..6e226a25 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -285,6 +285,9 @@ QString qt_error_string(IOReturn errorCode); QBluetoothUuid qt_uuid(CBUUID *uuid); CFStrongReference cf_uuid(const QBluetoothUuid &qtUuid); ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid); +bool equal_uuids(const QBluetoothUuid &qtUuid, CBUUID *cbUuid); +bool equal_uuids(CBUUID *cbUuid, const QBluetoothUuid &qtUuid); +QByteArray qt_bytearray(NSData *data); } // namespace OSXBluetooth diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index b576e76f..9a86c392 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -91,6 +91,7 @@ ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CB if (included) newService->type |= QLowEnergyService::IncludedService; + // TODO: isPrimary is ... always 'NO' - to be investigated. /* #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) if (!cbService.isPrimary) { @@ -128,7 +129,8 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), - addressType(QLowEnergyController::PublicAddress) + addressType(QLowEnergyController::PublicAddress), + lastValidHandle(0) // 0 == invalid. { // This is the "wrong" constructor - no valid device UUID to connect later. Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); @@ -149,7 +151,8 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), - addressType(QLowEnergyController::PublicAddress) + addressType(QLowEnergyController::PublicAddress), + lastValidHandle(0) // 0 == invalid. { Q_ASSERT_X(q, "QLowEnergyControllerPrivateOSX", "invalid q_ptr (null)"); centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); @@ -284,6 +287,64 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service QMetaObject::invokeMethod(q_ptr, "discoveryFinished", Qt::QueuedConnection); } +void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService service) +{ + if (!service) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(), " + "invalid service (nil)"; + return; + } + + QT_BT_MAC_AUTORELEASEPOOL; + + const QBluetoothUuid qtUuid(OSXBluetooth::qt_uuid(service.data().UUID)); + if (!discoveredServices.contains(qtUuid)) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(), " + "unknown service uuid: " << qtUuid; + return; + } + + ServicePrivate qtService(discoveredServices.value(qtUuid)); + qtService->startHandle = ++lastValidHandle; + // Now we iterate on characteristics and descriptors (if any). + NSArray *const cs = service.data().characteristics; + if (cs && cs.count) { + QHash charList; + // That's not a real handle - just a key into a hash map. + for (CBCharacteristic *c in cs) { + QLowEnergyServicePrivate::CharData newChar = {}; + newChar.uuid = OSXBluetooth::qt_uuid(c.UUID); + // CBCharacteristicProperty enum has the same values as Qt + + // a couple of values above 'extended' we do not support yet - mask them out. + // All other possible enumerators are the same: + const int cbProps = c.properties & 0xff; + newChar.properties = static_cast(cbProps); + newChar.value = OSXBluetooth::qt_bytearray(c.value); + newChar.valueHandle = ++lastValidHandle; + + NSArray *const ds = c.descriptors; + if (ds && ds.count) { + QHash descList; + for (CBDescriptor *d in ds) { + QLowEnergyServicePrivate::DescData newDesc = {}; + newDesc.uuid = OSXBluetooth::qt_uuid(d.UUID); + newDesc.value = OSXBluetooth::qt_bytearray(d.value); + descList[++lastValidHandle] = newDesc; + } + + newChar.descriptorList = descList; + } + + charList[newChar.valueHandle] = newChar; + } + + qtService->characteristicList = charList; + } + + qtService->endHandle = lastValidHandle; + qtService->stateChanged(QLowEnergyService::ServiceDiscovered); +} + void QLowEnergyControllerPrivateOSX::disconnected() { controllerState = QLowEnergyController::UnconnectedState; @@ -324,8 +385,16 @@ void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error errorCode) { // Errors reported while discovering service details etc. - Q_UNUSED(serviceUuid) - Q_UNUSED(errorCode) + Q_UNUSED(errorCode) // TODO: setError? + + // We failed to discover any characteristics/descriptors. + if (discoveredServices.contains(serviceUuid)) { + ServicePrivate qtService(discoveredServices.value(serviceUuid)); + qtService->stateChanged(QLowEnergyService::InvalidService); + } else { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::error(), " + "error reported for unknown service "<stateChanged(QLowEnergyService::DiscoveringServices); + } else { + // The error is returned by CentralManager - no + // service with a given UUID found on a peripheral. + qtService->stateChanged(QLowEnergyService::InvalidService); + } } void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::Error errorCode) @@ -413,6 +504,7 @@ void QLowEnergyControllerPrivateOSX::invalidateServices() service->setState(QLowEnergyService::InvalidService); } + lastValidHandle = 0; discoveredServices.clear(); } diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index 36257e02..f9764c03 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -66,6 +66,7 @@ private: void connectSuccess() Q_DECL_OVERRIDE; void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; + void serviceDetailsDiscoveryFinished(LEService service) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; void error(QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; void error(const QBluetoothUuid &serviceUuid, @@ -103,6 +104,13 @@ private: typedef ServiceMap::const_iterator ConstServiceIterator; typedef ServiceMap::iterator ServiceIterator; ServiceMap discoveredServices; + + // While Core Bluetooth has _startHandle/_endHandle for + // CBServices, this information is not a part of a public + // API and can not be used. Instead we have to 'emulate' + // these handles using something that looks like/works like + // handles: + QLowEnergyHandle lastValidHandle; }; QT_END_NAMESPACE -- cgit v1.2.3 From 9966c69e301a041ad224ef08bc3da45ca249041d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 26 Nov 2014 12:17:00 +0100 Subject: Document Android's caching of BTLE service data. It can be confusing. As more platforms are supported, this behavior needs to be verified too. The Bluez implementation does not exhibit this cache behavior. Change-Id: I42dd003f2ac2632c32e48b1b1784e4ca529950f3 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index d50c691d..906a6af1 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -570,6 +570,13 @@ void QLowEnergyController::disconnectFromDevice() If the controller instance is not connected or the controller has performed the service discovery already this function will do nothing. + + \note Some platforms internally cache the service list of a device + which was discovered in the past. This can be problematic if the remote device + changed its list of services or their inclusion tree. If this behavior is a + problem, the best workaround is to temporarily turn Bluetooth off. This + causes a reset of the cache data. Currently Android exhibits such a + cache behavior. */ void QLowEnergyController::discoverServices() { -- cgit v1.2.3 From be750788c7f5276b0a8686e1f11bf4ca12ee9231 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Sun, 23 Nov 2014 18:02:09 +0100 Subject: QLowEnergyService::writeCharacteristic - implementation for OS X and iOS writeCharacteristic - implemented with Core Bluetooth for OS X and iOS. Change-Id: Ia228ff451e1e6d7b6fb7de6cad29198aa9257602 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 114 ++++++++++++++++++ src/bluetooth/osx/osxbtcentralmanager_p.h | 15 +++ src/bluetooth/osx/osxbtutility.mm | 9 ++ src/bluetooth/osx/osxbtutility_p.h | 1 + src/bluetooth/qlowenergycharacteristic.h | 1 + src/bluetooth/qlowenergycontroller_osx.mm | 186 +++++++++++++++++++++++++++++ src/bluetooth/qlowenergycontroller_osx_p.h | 24 ++++ src/bluetooth/qlowenergyservice_osx.mm | 133 ++++++++++++++++++--- 8 files changed, 468 insertions(+), 15 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 71622b1c..025313d0 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -78,6 +78,8 @@ using namespace QT_NAMESPACE; - (CBCharacteristic *)nextCharacteristicForService:(CBService*)service startingFrom:(CBCharacteristic *)from withProperties:(CBCharacteristicProperties)properties; +- (CBCharacteristic *)characteristicForService:(CBService *)service + withIndex:(NSUInteger)index; - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor; @@ -437,6 +439,60 @@ using namespace QT_NAMESPACE; delegate->serviceDetailsDiscoveryFinished(ObjCStrongReference(service, true)); } +- (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value + characteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle + serviceUuid:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid + serviceHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))serviceHandle + withResponse:(bool)withResponse +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(!serviceUuid.isNull(), "-write:characteristic:serviceUuid:serviceHandle:withResponse:", + "invalid service uuid"); + Q_ASSERT_X(serviceHandle, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", + "invalid service handle (0)"); + Q_ASSERT_X(serviceHandle < charHandle, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", + "invalid characteristic handle (<= serviceHandle)"); + + + QT_BT_MAC_AUTORELEASEPOOL; + + CBService *const service = [self serviceForUUID:serviceUuid]; + if (!service) { + qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " + "service with uuid: " << serviceUuid << " not found"; + return false; + } + + // 'Convert' charHandle into the 'index' and find a characteristic. + CBCharacteristic *const ch = [self characteristicForService:service + withIndex:charHandle - serviceHandle - 1]; + + if (!ch) { + qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " + "characteristic with handle: " << charHandle << " not " + "found on service: " << serviceUuid; + return false; + } + + Q_ASSERT_X(peripheral, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", + "invalid peripheral (nil)"); + + ObjCStrongReference data(data_from_bytearray(value)); + if (!data) { + // Even if qtData.size() == 0, we still need NSData object. + qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " + "failed to allocate NSData object"; + return false; + } + + // TODO: check what happens if I'm using NSData with length 0. + [peripheral writeValue:data.data() forCharacteristic:ch + type: withResponse? CBCharacteristicWriteWithResponse : CBCharacteristicWriteWithoutResponse]; + + return true; +} + // Aux. methods: - (CBService *)serviceForUUID:(const QBluetoothUuid &)qtUuid @@ -560,6 +616,30 @@ using namespace QT_NAMESPACE; return nil; } +- (CBCharacteristic *)characteristicForService:(CBService *)service + withIndex:(NSUInteger)index +{ + Q_ASSERT_X(service, "-characteristicForService:withIndex:", + "invalid service (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + NSArray *const chars = service.characteristics; + + if (!chars || !chars.count) + return nil; + + for (NSUInteger i = 0, j = 0, e = chars.count; i < e; ++i) { + CBCharacteristic *const ch = [chars objectAtIndex:i]; + if (j == index) + return ch; + if (ch.descriptors) + j += ch.descriptors.count + 1; // + 1 for characteristic itself. + } + + return nil; +} + - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor { @@ -1003,4 +1083,38 @@ using namespace QT_NAMESPACE; } } +- (void)peripheral:(CBPeripheral *)aPeripheral + didWriteValueForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error +{ + // From docs: + // + // "This method is invoked only when your app calls the writeValue:forCharacteristic:type: + // method with the CBCharacteristicWriteWithResponse constant specified as the write type. + // If successful, the error parameter is nil. If unsuccessful, + // the error parameter returns the cause of the failure." + + using namespace OSXBluetooth; + + Q_UNUSED(aPeripheral) + Q_UNUSED(characteristic) + Q_UNUSED(error) + + Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", + "invalid delegate (null)"); + + if (error) { + // Use NSLog to log the actual error: + NSLog(@"-peripheral:didWriteValueForCharacteristic:error:, failed with error: %@", + error); + // TODO: no char handle at the moment, have to change to char index instead + // and calculate the right handle in the LE controller. + delegate->error(qt_uuid(characteristic.service.UUID), 0, + QLowEnergyService::CharacteristicWriteError); + } else { + ObjCStrongReference ch(characteristic, true); + delegate->characteristicWriteNotification(ch); + } +} + @end diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 25faab78..1e3028d6 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -43,6 +43,7 @@ #define OSXBTCENTRALMANAGER_P_H #include "qlowenergycontroller.h" +#include "qlowenergyservice.h" #include "qbluetoothuuid.h" #include "osxbtutility_p.h" @@ -66,6 +67,7 @@ public: typedef QT_MANGLE_NAMESPACE(OSXBTCentralManager) ObjCCentralManager; typedef ObjCStrongReference LEServices; typedef ObjCStrongReference LEService; + typedef ObjCStrongReference LECharacteristic; virtual ~CentralManagerDelegate(); @@ -73,6 +75,7 @@ public: virtual void connectSuccess() = 0; virtual void serviceDiscoveryFinished(LEServices services) = 0; virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; + virtual void characteristicWriteNotification(LECharacteristic ch) = 0; virtual void disconnected() = 0; // General errors. @@ -80,6 +83,10 @@ public: // Service related errors. virtual void error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error error) = 0; + // Characteristics related errors. + virtual void error(const QBluetoothUuid &serviceUuid, + QLowEnergyHandle charHandle, + QLowEnergyService::ServiceError error) = 0; }; enum CentralManagerState @@ -133,6 +140,14 @@ QT_END_NAMESPACE - (void)discoverServices; - (bool)discoverServiceDetails:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid; +// Characteristic's handle here is a 'relative' == valueHandle - service->startHandle +// to simplify mapping between Qt's handles and Core Bluetooth's data structures. +- (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value + characteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle + serviceUuid:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid + serviceHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))serviceHandle + withResponse:(bool)writeWithResponse; + @end #endif diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index 1b07e2cb..26f33e6e 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -246,6 +246,15 @@ QByteArray qt_bytearray(NSData *data) return value; } +ObjCStrongReference data_from_bytearray(const QByteArray & qtData) +{ + if (!qtData.size()) + return ObjCStrongReference([[NSData alloc] init], false); + + ObjCStrongReference result([NSData dataWithBytes:qtData.constData() length:qtData.size()], true); + return result; +} + } QT_END_NAMESPACE diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index 6e226a25..d30ee93c 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -288,6 +288,7 @@ ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid); bool equal_uuids(const QBluetoothUuid &qtUuid, CBUUID *cbUuid); bool equal_uuids(CBUUID *cbUuid, const QBluetoothUuid &qtUuid); QByteArray qt_bytearray(NSData *data); +ObjCStrongReference data_from_bytearray(const QByteArray & qtData); } // namespace OSXBluetooth diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index e0ed2976..256aea68 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -91,6 +91,7 @@ protected: friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateOSX; QLowEnergyCharacteristicPrivate *data; QLowEnergyCharacteristic(QSharedPointer p, QLowEnergyHandle handle); diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 9a86c392..f41423d8 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -122,6 +122,36 @@ UUIDList qt_servicesUuids(NSArray *services) return uuids; } +QLowEnergyHandle qt_findCharacteristicHandle(QLowEnergyHandle serviceHandle, + CBService *service, CBCharacteristic *ch) +{ + // This mapping from CB -> Qt Qt -> CB is quite verbose and annoying, + // but duplicating data structures (CB char-tree, Qt char-tree, etc.) + // is even more annoying. + + Q_ASSERT_X(serviceHandle, "qt_findCharacteristicHandle", + "invalid service handle (0)"); + Q_ASSERT_X(service, "qt_findCharacteristicHandle", + "invalid service (nil)"); + Q_ASSERT_X(ch, "qt_findCharacteristicHandle", + "invalid characteristic (nil)"); + + NSArray *const chars = service.characteristics; + if (!chars || !chars.count) + return 0; // Invalid handle, to be .. handled by the caller. + + QLowEnergyHandle handle = serviceHandle + 1; + for (CBCharacteristic *candidate in chars) { + if (candidate == ch) + return handle; + NSArray *const ds = candidate.descriptors; + if (ds && ds.count) + handle += ds.count + 1; // + 1 is for char itself. + } + + return 0; +} + } QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q) @@ -345,6 +375,46 @@ void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService s qtService->stateChanged(QLowEnergyService::ServiceDiscovered); } +void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(LECharacteristic ch) +{ + Q_ASSERT_X(ch, "characteristicWriteNotification", "invalid characteristic (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + CBService *const cbService = [ch service]; + const QBluetoothUuid serviceUuid(OSXBluetooth::qt_uuid(cbService.UUID)); + if (!discoveredServices.contains(serviceUuid)) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " + "unknown service uuid: " << serviceUuid; + return; + } + + ServicePrivate service(discoveredServices.value(serviceUuid)); + Q_ASSERT_X(service->startHandle, "characteristicWriteNotification", + "invalid service handle (0)"); + + const QLowEnergyHandle charHandle = + qt_findCharacteristicHandle(service->startHandle, cbService, ch); + + if (!charHandle) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " + "unknown characteristic"; + return; + } + + QLowEnergyCharacteristic characteristic(characteristicForHandle(charHandle)); + if (!characteristic.isValid()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " + "unknown characteristic"; + return; + } + + // TODO: check that this 'value' is what we need! + const QByteArray data(OSXBluetooth::qt_bytearray([ch value])); + updateValueOfCharacteristic(charHandle, data, false); + emit service->characteristicWritten(characteristic, data); +} + void QLowEnergyControllerPrivateOSX::disconnected() { controllerState = QLowEnergyController::UnconnectedState; @@ -397,6 +467,22 @@ void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, } } +void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, + QLowEnergyHandle charHandle, + QLowEnergyService::ServiceError errorCode) +{ + Q_UNUSED(charHandle) + + if (!discoveredServices.contains(serviceUuid)) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::error(), " + "unknown service uuid: " << serviceUuid; + return; + } + + ServicePrivate service(discoveredServices.value(serviceUuid)); + service->setError(errorCode); +} + void QLowEnergyControllerPrivateOSX::connectToDevice() { Q_ASSERT_X(isValid(), "connectToDevice", "invalid private controller"); @@ -471,6 +557,106 @@ void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid } } +void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointer service, + QLowEnergyHandle charHandle, const QByteArray &newValue, + bool writeWithResponse) +{ + Q_ASSERT_X(!service.isNull(), "writeCharacteristic", "invalid service (null)"); + + if (!isValid()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " + "invalid controller"; + return; + } + + // We can work only with services, found on a given peripheral + // (== created by the given LE controller), + // otherwise we can not write anything at all. + if (!discoveredServices.contains(service->uuid)) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " + "no service with uuid: " << service << "found"; + return; + } + + if (!service->characteristicList.contains(charHandle)) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " + "no characteristic with handle: " << charHandle << "found"; + return; + } + + const bool result = [centralManager write:newValue + characteristic:charHandle + serviceUuid:service->uuid + serviceHandle:service->startHandle + withResponse:writeWithResponse]; + if (!result) + service->setError(QLowEnergyService::CharacteristicWriteError); +} + +quint16 QLowEnergyControllerPrivateOSX::updateValueOfCharacteristic(QLowEnergyHandle charHandle, + const QByteArray &value, + bool appendValue) +{ + QSharedPointer service = serviceForHandle(charHandle); + if (!service.isNull() && service->characteristicList.contains(charHandle)) { + if (appendValue) + service->characteristicList[charHandle].value += value; + else + service->characteristicList[charHandle].value = value; + + return service->characteristicList[charHandle].value.size(); + } + + return 0; +} + +void QLowEnergyControllerPrivateOSX::writeDescriptor(QSharedPointer service, + QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue) +{ + Q_UNUSED(service) + Q_UNUSED(charHandle) + Q_UNUSED(descriptorHandle) + Q_UNUSED(newValue) +} + +QSharedPointer QLowEnergyControllerPrivateOSX::serviceForHandle(QLowEnergyHandle handle) +{ + foreach (QSharedPointer service, discoveredServices.values()) { + if (service->startHandle <= handle && handle <= service->endHandle) + return service; + } + + return QSharedPointer(); +} + +QLowEnergyCharacteristic QLowEnergyControllerPrivateOSX::characteristicForHandle(QLowEnergyHandle charHandle) +{ + QSharedPointer service(serviceForHandle(charHandle)); + if (service.isNull()) + return QLowEnergyCharacteristic(); + + if (service->characteristicList.isEmpty()) + return QLowEnergyCharacteristic(); + + // Check whether it is the handle of a characteristic header + if (service->characteristicList.contains(charHandle)) + return QLowEnergyCharacteristic(service, charHandle); + + // Check whether it is the handle of the characteristic value or its descriptors + QList charHandles(service->characteristicList.keys()); + std::sort(charHandles.begin(), charHandles.end()); + + for (int i = charHandles.size() - 1; i >= 0; --i) { + if (charHandles.at(i) > charHandle) + continue; + + return QLowEnergyCharacteristic(service, charHandles.at(i)); + } + + return QLowEnergyCharacteristic(); +} + void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::Error errorCode) { // This function does not emit! diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index f9764c03..a8f8aaa0 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -34,6 +34,7 @@ #ifndef QLOWENERGYCONTROLLER_OSX_P_H #define QLOWENERGYCONTROLLER_OSX_P_H +#include "qlowenergyserviceprivate_p.h" #include "osx/osxbtcentralmanager_p.h" #include "qlowenergycontroller_p.h" #include "qlowenergycontroller.h" @@ -41,6 +42,7 @@ #include "qbluetoothaddress.h" #include "qbluetoothuuid.h" +#include #include #include #include @@ -52,6 +54,7 @@ class QLowEnergyControllerPrivateOSX : public QLowEnergyControllerPrivate, public OSXBluetooth::CentralManagerDelegate { friend class QLowEnergyController; + friend class QLowEnergyService; public: QLowEnergyControllerPrivateOSX(QLowEnergyController *q); QLowEnergyControllerPrivateOSX(QLowEnergyController *q, @@ -67,15 +70,36 @@ private: void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; void serviceDetailsDiscoveryFinished(LEService service) Q_DECL_OVERRIDE; + void characteristicWriteNotification(LECharacteristic ch) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; void error(QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; void error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; + void error(const QBluetoothUuid &serviceUuid, + QLowEnergyHandle charHandle, + QLowEnergyService::ServiceError error) Q_DECL_OVERRIDE; void connectToDevice(); void discoverServices(); void discoverServiceDetails(const QBluetoothUuid &serviceUuid); + void writeCharacteristic(QSharedPointer service, + QLowEnergyHandle charHandle, const QByteArray &newValue, + bool writeWithResponse); + + quint16 updateValueOfCharacteristic(QLowEnergyHandle charHandle, + const QByteArray &value, + bool appendValue); + + void writeDescriptor(QSharedPointer service, + QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue); + + + // 'Lookup' functions: + QSharedPointer serviceForHandle(QLowEnergyHandle serviceHandle); + QLowEnergyCharacteristic characteristicForHandle(QLowEnergyHandle charHandle); + void setErrorDescription(QLowEnergyController::Error errorCode); void invalidateServices(); diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index e2f5d35f..f9c124e4 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Javier S. Pedro ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtBluetooth module of the Qt Toolkit. @@ -31,18 +32,50 @@ ** ****************************************************************************/ +#include "qlowenergycontroller_osx_p.h" +#include "qlowenergyserviceprivate_p.h" #include "qlowenergycharacteristic.h" #include "qlowenergydescriptor.h" #include "qlowenergyservice.h" #include "qbluetoothuuid.h" +#include #include #include +#include + +QT_BEGIN_NAMESPACE + +namespace { + +QLowEnergyControllerPrivateOSX *qt_mac_le_controller(QSharedPointer d_ptr) +{ + if (d_ptr.isNull()) + return Q_NULLPTR; + + return static_cast(d_ptr->controller.data()); +} + +} + QLowEnergyService::QLowEnergyService(QSharedPointer d, QObject *parent) : QObject(parent), d_ptr(d) { + qRegisterMetaType("QLowEnergyService::ServiceState"); + qRegisterMetaType("QLowEnergyService::ServiceError"); + + connect(d.data(), SIGNAL(error(QLowEnergyService::ServiceError)), + this, SIGNAL(error(QLowEnergyService::ServiceError))); + connect(d.data(), SIGNAL(stateChanged(QLowEnergyService::ServiceState)), + this, SIGNAL(stateChanged(QLowEnergyService::ServiceState))); + connect(d.data(), SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray)), + this, SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray))); + connect(d.data(), SIGNAL(characteristicWritten(QLowEnergyCharacteristic, QByteArray)), + this, SIGNAL(characteristicWritten(QLowEnergyCharacteristic, QByteArray))); + connect(d.data(), SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray)), + this, SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray))); } QLowEnergyService::~QLowEnergyService() @@ -51,69 +84,137 @@ QLowEnergyService::~QLowEnergyService() QList QLowEnergyService::includedServices() const { - return QList(); + return d_ptr->includedServices; } QLowEnergyService::ServiceTypes QLowEnergyService::type() const { - return PrimaryService; + return d_ptr->type; } QLowEnergyService::ServiceState QLowEnergyService::state() const { - return InvalidService; + return d_ptr->state; } QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const { - Q_UNUSED(uuid) + foreach (const QLowEnergyHandle handle, d_ptr->characteristicList.keys()) { + if (d_ptr->characteristicList[handle].uuid == uuid) + return QLowEnergyCharacteristic(d_ptr, handle); + } return QLowEnergyCharacteristic(); } QList QLowEnergyService::characteristics() const { - return QList(); + QList result; + QList handles(d_ptr->characteristicList.keys()); + + std::sort(handles.begin(), handles.end()); + + foreach (const QLowEnergyHandle &handle, handles) { + QLowEnergyCharacteristic characteristic(d_ptr, handle); + result.append(characteristic); + } + + return result; } QBluetoothUuid QLowEnergyService::serviceUuid() const { - return QBluetoothUuid(); + return d_ptr->uuid; } QString QLowEnergyService::serviceName() const { - return QString(); + bool ok = false; + const quint16 clsId = d_ptr->uuid.toUInt16(&ok); + if (ok) { + QBluetoothUuid::ServiceClassUuid uuid + = static_cast(clsId); + const QString name = QBluetoothUuid::serviceClassToString(uuid); + if (!name.isEmpty()) + return name; + } + + return qApp ? qApp->translate("QBluetoothServiceDiscoveryAgent", "Unknown Service") : + QStringLiteral("Unknown Service"); } void QLowEnergyService::discoverDetails() { + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + + if (!controller || d_ptr->state == InvalidService) { + d_ptr->setError(OperationError); + return; + } + + if (d_ptr->state != DiscoveryRequired) + return; + + d_ptr->setState(QLowEnergyService::DiscoveringServices); + controller->discoverServiceDetails(d_ptr->uuid); } QLowEnergyService::ServiceError QLowEnergyService::error() const { - return NoError; + return d_ptr->lastError; } bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const { - Q_UNUSED(characteristic) + if (characteristic.d_ptr.isNull() || !characteristic.data) + return false; + + if (d_ptr == characteristic.d_ptr + && d_ptr->characteristicList.contains(characteristic.attributeHandle())) { + return true; + } return false; } -void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, - const QByteArray &newValue, +void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, const QByteArray &newValue, WriteMode mode) { - Q_UNUSED(characteristic) - Q_UNUSED(newValue) - Q_UNUSED(mode) + // Not a characteristic of this service + if (!contains(ch)) + return; + + if (state() != ServiceDiscovered) + d_ptr->setError(QLowEnergyService::OperationError); + + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + if (!controller) + return; + + // Don't write if properties don't permit it + if (mode == WriteWithResponse && (ch.properties() & QLowEnergyCharacteristic::Write)) + controller->writeCharacteristic(ch.d_ptr, ch.attributeHandle(), newValue, true); + else if (mode == WriteWithoutResponse && (ch.properties() & QLowEnergyCharacteristic::WriteNoResponse)) + controller->writeCharacteristic(ch.d_ptr, ch.attributeHandle(), newValue, false); + else + d_ptr->setError(QLowEnergyService::OperationError); } bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const { - Q_UNUSED(descriptor) + if (descriptor.d_ptr.isNull() || !descriptor.data) + return false; + + const QLowEnergyHandle charHandle = descriptor.characteristicHandle(); + if (!charHandle) + return false; + + if (d_ptr == descriptor.d_ptr && d_ptr->characteristicList.contains(charHandle) + && d_ptr->characteristicList[charHandle].descriptorList.contains(descriptor.handle())) + { + return true; + } + return false; } @@ -123,3 +224,5 @@ void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, Q_UNUSED(descriptor) Q_UNUSED(newValue) } + +QT_END_NAMESPACE -- cgit v1.2.3 From 0e3046f29b0e86affeb33c8f6687618cfd1dfae2 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 25 Nov 2014 10:46:37 +0100 Subject: Fix missing update of cached characteristic value When we receive a characteristic update we have to update the cached value on the Qt side. This was accidentally missed during an earlier commit. Change-Id: I0f84e35ee44e38d1e46b7ddcd4e78b7e216e49d5 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_android.cpp | 2 ++ tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index e2624a56..16298c96 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -451,6 +451,8 @@ void QLowEnergyControllerPrivate::characteristicChanged( return; } + updateValueOfCharacteristic(characteristic.attributeHandle(), + data, false); emit service->characteristicChanged(characteristic, data); } diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index a91f8096..67ae1872 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -1858,6 +1858,13 @@ void tst_QLowEnergyController::tst_writeDescriptor() const QLowEnergyCharacteristic ch = entry[0].value(); QCOMPARE(tempData, ch); + + //check last characteristic changed value matches the characteristics current value + if (i == (charChangedSpy.count() - 1)) { + writtenValue = entry[1].toByteArray(); + QCOMPARE(ch.value(), writtenValue); + QCOMPARE(tempData.value(), writtenValue); + } } service->writeCharacteristic(tempConfig, QByteArray::fromHex("00")); -- cgit v1.2.3 From 68332a47fbcc124efedf73b106b7e06bfacd65fd Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 28 Nov 2014 13:42:18 +0100 Subject: Bluetooth LE - handles/chars/descriptors/services (OS X and iOS) In Qt we work with handles (real for Bluez, emulated for Android/iOS/OS X). Core Bluetooth has its own (quite primitive and inconvenient) data structures (arrays of objects, containing nested arrays). To make things not so ugly I'm adding several maps to be able to find a characteristic/descriptor/service using a handle from Qt's layer. Also modify writeCharacteristic to use this new 'addressing scheme'. Change-Id: Ic822c9aa82a4df1e9c4cf4c673451cac8006b9ba Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 176 ++++++++++++++++++++--------- src/bluetooth/osx/osxbtcentralmanager_p.h | 25 +++- src/bluetooth/qlowenergycontroller_osx.mm | 67 ++++------- src/bluetooth/qlowenergycontroller_osx_p.h | 5 + 4 files changed, 165 insertions(+), 108 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 025313d0..da4e6c34 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -39,12 +39,16 @@ ** ****************************************************************************/ +#include "qlowenergyserviceprivate_p.h" +#include "qlowenergycharacteristic.h" #include "osxbtcentralmanager_p.h" + #include #include #include +#include QT_BEGIN_NAMESPACE @@ -54,6 +58,31 @@ CentralManagerDelegate::~CentralManagerDelegate() { } +NSUInteger qt_countGATTEntries(CBService *service) +{ + // Identify, how many characteristics/descriptors we have on a given service, + // +1 for the service itself. + // No checks if NSUInteger is big enough :) + // Let's assume such number of entries is not possible :) + + Q_ASSERT_X(service, "qt_countGATTEntries", "invalid service (nil)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + NSArray *const cs = service.characteristics; + if (!cs || !cs.count) + return 1; + + NSUInteger n = 1 + cs.count; + for (CBCharacteristic *c in cs) { + NSArray *const ds = c.descriptors; + if (ds) + n += ds.count; + } + + return n; +} + } QT_END_NAMESPACE @@ -78,8 +107,6 @@ using namespace QT_NAMESPACE; - (CBCharacteristic *)nextCharacteristicForService:(CBService*)service startingFrom:(CBCharacteristic *)from withProperties:(CBCharacteristicProperties)properties; -- (CBCharacteristic *)characteristicForService:(CBService *)service - withIndex:(NSUInteger)index; - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor; @@ -98,6 +125,7 @@ using namespace QT_NAMESPACE; peripheral = nil; delegate = aDelegate; currentService = 0; + lastValidHandle = 0; } return self; @@ -277,6 +305,12 @@ using namespace QT_NAMESPACE; //parameter to nil is considerably slower and is not recommended." // // ... but we'd like to have them all: + + lastValidHandle = 0; + serviceMap.clear(); + charMap.clear(); + descMap.clear(); + [peripheral setDelegate:self]; managerState = OSXBluetooth::CentralManagerDiscovering; [peripheral discoverServices:nil]; @@ -435,53 +469,107 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - servicesToDiscoverDetails.removeAll(qt_uuid(service.UUID)); - delegate->serviceDetailsDiscoveryFinished(ObjCStrongReference(service, true)); + QT_BT_MAC_AUTORELEASEPOOL; + + const QBluetoothUuid serviceUuid(qt_uuid(service.UUID)); + servicesToDiscoverDetails.removeAll(serviceUuid); + + const NSUInteger nHandles = qt_countGATTEntries(service); + Q_ASSERT_X(nHandles, "-serviceDetailsDiscoveryFinished:", + "unexpected number of GATT entires"); + + const QLowEnergyHandle maxHandle = std::numeric_limits::max(); + if (nHandles >= maxHandle || lastValidHandle > maxHandle - nHandles) { + // Well, that's unlikely :) But we must be sure. + qCWarning(QT_BT_OSX) << "-serviceDetailsDiscoveryFinished:", + "can not allocate more handles"; + // TODO: add more 'error' functions not to use fake handles (0)? + delegate->error(serviceUuid, 0, QLowEnergyService::OperationError); + return; + } + + // A temporary service object to pass the details. + // Set only uuid, characteristics and descriptors (and probably values), + // nothing else is needed. + QSharedPointer qtService(new QLowEnergyServicePrivate); + qtService->uuid = serviceUuid; + // We 'register' handles/'CBentities' even if qlowenergycontroller (delegate) + // later fails to do this with some error. Otherwise, if we try to implement + // rollback/transaction logic interface is getting too ugly/complicated. + ++lastValidHandle; + serviceMap[lastValidHandle] = service; + qtService->startHandle = lastValidHandle; + + NSArray *const cs = service.characteristics; + // Now map chars/descriptors and handles. + if (cs && cs.count) { + QHash charList; + + for (CBCharacteristic *c in cs) { + ++lastValidHandle; + // Register this characteristic: + charMap[lastValidHandle] = c; + // Create a Qt's internal characteristic: + QLowEnergyServicePrivate::CharData newChar = {}; + newChar.uuid = qt_uuid(c.UUID); + const int cbProps = c.properties & 0xff; + newChar.properties = static_cast(cbProps); + newChar.value = qt_bytearray(c.value); + newChar.valueHandle = lastValidHandle; + + NSArray *const ds = c.descriptors; + if (ds && ds.count) { + QHash descList; + for (CBDescriptor *d in ds) { + // Register this descriptor: + ++lastValidHandle; + descMap[lastValidHandle] = d; + // Create a Qt's internal descriptor: + QLowEnergyServicePrivate::DescData newDesc = {}; + newDesc.uuid = qt_uuid(d.UUID); + newDesc.value = qt_bytearray(d.value); + descList[lastValidHandle] = newDesc; + } + + newChar.descriptorList = descList; + } + + charList[newChar.valueHandle] = newChar; + } + + qtService->characteristicList = charList; + } + + qtService->endHandle = lastValidHandle; + + ObjCStrongReference leService(service, true); + delegate->serviceDetailsDiscoveryFinished(qtService); } - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value - characteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle - serviceUuid:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid - serviceHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))serviceHandle + charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)withResponse { using namespace OSXBluetooth; - Q_ASSERT_X(!serviceUuid.isNull(), "-write:characteristic:serviceUuid:serviceHandle:withResponse:", - "invalid service uuid"); - Q_ASSERT_X(serviceHandle, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", - "invalid service handle (0)"); - Q_ASSERT_X(serviceHandle < charHandle, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", - "invalid characteristic handle (<= serviceHandle)"); - + Q_ASSERT_X(charHandle, "-write:charHandle:withResponse:", "invalid characteristic handle (0)"); QT_BT_MAC_AUTORELEASEPOOL; - CBService *const service = [self serviceForUUID:serviceUuid]; - if (!service) { - qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " - "service with uuid: " << serviceUuid << " not found"; + if (!charMap.contains(charHandle)) { + qCWarning(QT_BT_OSX) << "-write:charHandle:withResponse:, " + "characteristic: " << charHandle << " not found"; return false; } - // 'Convert' charHandle into the 'index' and find a characteristic. - CBCharacteristic *const ch = [self characteristicForService:service - withIndex:charHandle - serviceHandle - 1]; - - if (!ch) { - qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " - "characteristic with handle: " << charHandle << " not " - "found on service: " << serviceUuid; - return false; - } - - Q_ASSERT_X(peripheral, "-write:characteristic:serviceUuid:serviceHandle:withResponse:", - "invalid peripheral (nil)"); + CBCharacteristic *const ch = charMap.value(charHandle); + Q_ASSERT_X(ch, "-write:charHandle:withResponse:", "invalid characteristic (nil) for a give handle"); + Q_ASSERT_X(peripheral, "-write:charHandle:withResponse:", "invalid peripheral (nil)"); ObjCStrongReference data(data_from_bytearray(value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << "-write:characteristic:serviceUuid:serviceHandle:withResponse:, " + qCWarning(QT_BT_OSX) << "-write:charHandle:withResponse:, " "failed to allocate NSData object"; return false; } @@ -616,30 +704,6 @@ using namespace QT_NAMESPACE; return nil; } -- (CBCharacteristic *)characteristicForService:(CBService *)service - withIndex:(NSUInteger)index -{ - Q_ASSERT_X(service, "-characteristicForService:withIndex:", - "invalid service (nil)"); - - QT_BT_MAC_AUTORELEASEPOOL; - - NSArray *const chars = service.characteristics; - - if (!chars || !chars.count) - return nil; - - for (NSUInteger i = 0, j = 0, e = chars.count; i < e; ++i) { - CBCharacteristic *const ch = [chars objectAtIndex:i]; - if (j == index) - return ch; - if (ch.descriptors) - j += ch.descriptors.count + 1; // + 1 for characteristic itself. - } - - return nil; -} - - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor { diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 1e3028d6..f5692c38 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -48,6 +48,7 @@ #include "osxbtutility_p.h" #include +#include // Foundation.h must be included before corebluetoothwrapper_p.h - // a workaround for a broken 10.9 SDK. @@ -59,6 +60,9 @@ QT_BEGIN_NAMESPACE +class QLowEnergyServicePrivate; +class QByteArray; + namespace OSXBluetooth { class CentralManagerDelegate @@ -66,7 +70,7 @@ class CentralManagerDelegate public: typedef QT_MANGLE_NAMESPACE(OSXBTCentralManager) ObjCCentralManager; typedef ObjCStrongReference LEServices; - typedef ObjCStrongReference LEService; + typedef QSharedPointer LEService; typedef ObjCStrongReference LECharacteristic; virtual ~CentralManagerDelegate(); @@ -101,6 +105,15 @@ enum CentralManagerState CentralManagerDisconnecting }; +// In Qt we work with handles and UUIDs. Core Bluetooth +// has NSArrays (and nested NSArrays inside servces/characteristics). +// To simplify a navigation, I need a simple way to map from a handle +// to a Core Bluetooth object. These are weak pointers, +// will probably require '__weak' with ARC. +typedef QHash ServiceHash; +typedef QHash CharHash; +typedef QHash DescHash; + } QT_END_NAMESPACE @@ -127,6 +140,12 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCStrongReference visitedServices; QT_PREPEND_NAMESPACE(QList) servicesToDiscoverDetails; + + QT_PREPEND_NAMESPACE(OSXBluetooth)::ServiceHash serviceMap; + QT_PREPEND_NAMESPACE(OSXBluetooth)::CharHash charMap; + QT_PREPEND_NAMESPACE(OSXBluetooth)::DescHash descMap; + + QLowEnergyHandle lastValidHandle; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; @@ -143,9 +162,7 @@ QT_END_NAMESPACE // Characteristic's handle here is a 'relative' == valueHandle - service->startHandle // to simplify mapping between Qt's handles and Core Bluetooth's data structures. - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value - characteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle - serviceUuid:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid - serviceHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))serviceHandle + charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)writeWithResponse; @end diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index f41423d8..88ec6421 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -43,6 +43,7 @@ #include #include +#include #include #include #include @@ -319,59 +320,23 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService service) { - if (!service) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(), " - "invalid service (nil)"; - return; - } + Q_ASSERT_X(!service.isNull(), "serviceDetailsDiscoveryFinished", + "invalid service (null)"); QT_BT_MAC_AUTORELEASEPOOL; - const QBluetoothUuid qtUuid(OSXBluetooth::qt_uuid(service.data().UUID)); - if (!discoveredServices.contains(qtUuid)) { + if (!discoveredServices.contains(service->uuid)) { qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(), " - "unknown service uuid: " << qtUuid; + "unknown service uuid: " << service->uuid; return; } - ServicePrivate qtService(discoveredServices.value(qtUuid)); - qtService->startHandle = ++lastValidHandle; - // Now we iterate on characteristics and descriptors (if any). - NSArray *const cs = service.data().characteristics; - if (cs && cs.count) { - QHash charList; - // That's not a real handle - just a key into a hash map. - for (CBCharacteristic *c in cs) { - QLowEnergyServicePrivate::CharData newChar = {}; - newChar.uuid = OSXBluetooth::qt_uuid(c.UUID); - // CBCharacteristicProperty enum has the same values as Qt + - // a couple of values above 'extended' we do not support yet - mask them out. - // All other possible enumerators are the same: - const int cbProps = c.properties & 0xff; - newChar.properties = static_cast(cbProps); - newChar.value = OSXBluetooth::qt_bytearray(c.value); - newChar.valueHandle = ++lastValidHandle; - - NSArray *const ds = c.descriptors; - if (ds && ds.count) { - QHash descList; - for (CBDescriptor *d in ds) { - QLowEnergyServicePrivate::DescData newDesc = {}; - newDesc.uuid = OSXBluetooth::qt_uuid(d.UUID); - newDesc.value = OSXBluetooth::qt_bytearray(d.value); - descList[++lastValidHandle] = newDesc; - } - - newChar.descriptorList = descList; - } - - charList[newChar.valueHandle] = newChar; - } + ServicePrivate qtService(discoveredServices.value(service->uuid)); + // Assert on handles? + qtService->startHandle = service->startHandle; + qtService->endHandle = service->endHandle; + qtService->characteristicList = service->characteristicList; - qtService->characteristicList = charList; - } - - qtService->endHandle = lastValidHandle; qtService->stateChanged(QLowEnergyService::ServiceDiscovered); } @@ -557,6 +522,14 @@ void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid } } +void QLowEnergyControllerPrivateOSX::setNotifyValue(QSharedPointer service, + QLowEnergyHandle charHandle, const QByteArray &newValue) +{ + Q_UNUSED(service) + Q_UNUSED(charHandle) + Q_UNUSED(newValue) +} + void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointer service, QLowEnergyHandle charHandle, const QByteArray &newValue, bool writeWithResponse) @@ -585,9 +558,7 @@ void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointeruuid - serviceHandle:service->startHandle + charHandle:charHandle withResponse:writeWithResponse]; if (!result) service->setError(QLowEnergyService::CharacteristicWriteError); diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index a8f8aaa0..2aec6200 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -49,6 +49,8 @@ QT_BEGIN_NAMESPACE +class QByteArray; + // The suffix OSX is not the very right, it's also iOS. class QLowEnergyControllerPrivateOSX : public QLowEnergyControllerPrivate, public OSXBluetooth::CentralManagerDelegate @@ -83,6 +85,9 @@ private: void discoverServices(); void discoverServiceDetails(const QBluetoothUuid &serviceUuid); + void setNotifyValue(QSharedPointer service, + QLowEnergyHandle charHandle, const QByteArray &newValue); + void writeCharacteristic(QSharedPointer service, QLowEnergyHandle charHandle, const QByteArray &newValue, bool writeWithResponse); -- cgit v1.2.3 From ae3847db3a4cb17113372cb59955bdaffcec1bea Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 26 Nov 2014 14:42:16 +0100 Subject: Android: Implements QLEService::includedServices() and type() Unfortunately it is not possible to say whether a service is primary or secondary on Android. The platform doesn't expose this information. Change-Id: I9b0aad191308120d2d1992a5e7736b985a375e30 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 31 ++++++++++++++++++++++ src/bluetooth/qlowenergycontroller_android.cpp | 26 ++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 618be1ea..12935b6a 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -657,6 +657,37 @@ public class QtBluetoothLE { return true; } + /* + Returns the uuids of the services included by the given service. Otherwise returns null. + Directly called from Qt. + */ + public String includedServices(String serviceUuid) + { + UUID uuid; + try { + uuid = UUID.fromString(serviceUuid); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + + //TODO Breaks in case of two services with same uuid + BluetoothGattService service = mBluetoothGatt.getService(uuid); + if (service == null) + return null; + + final List includes = service.getIncludedServices(); + if (includes.isEmpty()) + return null; + + StringBuilder builder = new StringBuilder(); + for (BluetoothGattService includedService: includes) { + builder.append(includedService.getUuid().toString()).append(" "); //space is separator + } + + return builder.toString(); + } + private void finishCurrentServiceDiscovery() { int currentEntry = currentServiceInDiscovery; diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 16298c96..25bd35d7 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -321,6 +321,32 @@ void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( pointer->startHandle = startHandle; pointer->endHandle = endHandle; + if (hub && hub->javaObject().isValid()) { + QAndroidJniObject uuid = QAndroidJniObject::fromString(serviceUuid); + QAndroidJniObject javaIncludes = hub->javaObject().callObjectMethod( + "includedServices", + "(Ljava/lang/String;)Ljava/lang/String;", + uuid.object()); + if (javaIncludes.isValid()) { + const QStringList list = javaIncludes.toString() + .split(QStringLiteral(" "), + QString::SkipEmptyParts); + foreach (const QString &entry, list) { + const QBluetoothUuid service(entry); + if (service.isNull()) + return; + + pointer->includedServices.append(service); + + // update the type of the included service + QSharedPointer otherService = + serviceList.value(service); + if (!otherService.isNull()) + otherService->type |= QLowEnergyService::IncludedService; + } + } + } + qCDebug(QT_BT_ANDROID) << "Service" << serviceUuid << "discovered (start:" << startHandle << "end:" << endHandle << ")" << pointer.data(); -- cgit v1.2.3 From ae3d26661aeaa2917ed35e5892648dea4caced04 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 26 Nov 2014 14:48:41 +0100 Subject: Update QLEService::Type() documentation for Android specifics Android doesn't expose the required API elements to set the correct service type. Therefore all services are by definition primary services too. Change-Id: Ifae4a1baa856382d481ab377b98f05b5b9974a85 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergyservice.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 0ae9ca67..10307332 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -357,6 +357,10 @@ QLowEnergyService::ServiceState QLowEnergyService::state() const /*! Returns the type of the service. + + \note On Android, it is not possible to determine whether a service + is a primary or secondary service. Therefore all services + have the \l PrimaryService flag set. */ QLowEnergyService::ServiceTypes QLowEnergyService::type() const { -- cgit v1.2.3 From 63a158b2d53a4f18f118a95796c0386911e1e5fa Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 25 Nov 2014 16:11:48 +0100 Subject: QLowEnergyController - writeDescriptor (OS X/iOS) Core Bluetooth - based implementation. Change-Id: Ie642a13ae9a4d75401dd10648fac6eeee4123a3b Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 117 +++++++++++++++++++++++++++-- src/bluetooth/osx/osxbtcentralmanager_p.h | 27 ++++++- src/bluetooth/qlowenergycontroller_osx.mm | 89 ++++++++++++++++++---- src/bluetooth/qlowenergycontroller_osx_p.h | 10 ++- src/bluetooth/qlowenergydescriptor.h | 1 + src/bluetooth/qlowenergyservice_osx.mm | 26 ++++++- 6 files changed, 241 insertions(+), 29 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index da4e6c34..35a284c2 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -99,6 +99,7 @@ using namespace QT_NAMESPACE; - (void)discoverIncludedServices; - (void)readCharacteristics:(CBService *)service; - (void)serviceDetailsDiscoveryFinished:(CBService *)service; +- (void)performNextWriteRequest; // Aux. functions. - (CBService *)serviceForUUID:(const QBluetoothUuid &)qtUuid; @@ -110,6 +111,9 @@ using namespace QT_NAMESPACE; - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor; +// TODO: check _what_ exactly I have to reset ... +- (void)reset; + @end @implementation QT_MANGLE_NAMESPACE(OSXBTCentralManager) @@ -126,6 +130,7 @@ using namespace QT_NAMESPACE; delegate = aDelegate; currentService = 0; lastValidHandle = 0; + writePending = false; } return self; @@ -272,7 +277,7 @@ using namespace QT_NAMESPACE; - (void)disconnectFromDevice { - servicesToDiscoverDetails.clear(); + [self reset]; if (managerState == OSXBluetooth::CentralManagerUpdating) { disconnectPending = true; @@ -306,11 +311,6 @@ using namespace QT_NAMESPACE; // // ... but we'd like to have them all: - lastValidHandle = 0; - serviceMap.clear(); - charMap.clear(); - descMap.clear(); - [peripheral setDelegate:self]; managerState = OSXBluetooth::CentralManagerDiscovering; [peripheral discoverServices:nil]; @@ -546,6 +546,41 @@ using namespace QT_NAMESPACE; delegate->serviceDetailsDiscoveryFinished(qtService); } +- (void)performNextWriteRequest +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(peripheral, "-performNextWriteRequest", + "invalid peripheral (nil)"); + + if (writePending || !writeQueue.size()) + return; + + LEWriteRequest request(writeQueue.dequeue()); + + if (request.isDescriptor) { + if (!descMap.contains(request.handle)) { + qCWarning(QT_BT_OSX) << "-performNextWriteRequest, descriptor with " + "handle: " << request.handle << " not found"; + [self performNextWriteRequest]; + } + + CBDescriptor *const d = descMap[request.handle]; + ObjCStrongReference data(data_from_bytearray(request.value)); + if (!data) { + // Even if qtData.size() == 0, we still need NSData object. + qCWarning(QT_BT_OSX) << "-write:descHandle:, failed " + "to allocate an NSData object"; + [self performNextWriteRequest]; + } + + writePending = true; + return [peripheral writeValue:data.data() forDescriptor:d]; + } else { + // TODO: characteristics write requests. + } +} + - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)withResponse @@ -562,7 +597,7 @@ using namespace QT_NAMESPACE; return false; } - CBCharacteristic *const ch = charMap.value(charHandle); + CBCharacteristic *const ch = charMap[charHandle]; Q_ASSERT_X(ch, "-write:charHandle:withResponse:", "invalid characteristic (nil) for a give handle"); Q_ASSERT_X(peripheral, "-write:charHandle:withResponse:", "invalid peripheral (nil)"); @@ -581,6 +616,32 @@ using namespace QT_NAMESPACE; return true; } +- (bool)write:(const QByteArray &)value descHandle:(QLowEnergyHandle)descHandle +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(descHandle, "-write:descHandle:", + "invalid descriptor handle (0)"); + + if (!descMap.contains(descHandle)) { + qCWarning(QT_BT_OSX) << "-write:descHandle:, descriptor with " + "handle: " << descHandle << " not found"; + return false; + } + + LEWriteRequest request; + request.isDescriptor = true; + request.handle = descHandle; + request.value = value; + + writeQueue.enqueue(request); + [self performNextWriteRequest]; + // TODO: this is quite ugly: true value can be returned after + // write actually. If I have any problems with the order later, + // I'll use performSelector afterDelay with some delay. + return true; +} + // Aux. methods: - (CBService *)serviceForUUID:(const QBluetoothUuid &)qtUuid @@ -740,6 +801,17 @@ using namespace QT_NAMESPACE; return [ds objectAtIndex:1]; } +- (void)reset +{ + writePending = false; + writeQueue.clear(); + servicesToDiscoverDetails.clear(); + lastValidHandle = 0; + serviceMap.clear(); + charMap.clear(); + descMap.clear(); +} + // CBCentralManagerDelegate (the real one). - (void)centralManagerDidUpdateState:(CBCentralManager *)central @@ -1162,7 +1234,6 @@ using namespace QT_NAMESPACE; Q_UNUSED(aPeripheral) Q_UNUSED(characteristic) - Q_UNUSED(error) Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", "invalid delegate (null)"); @@ -1181,4 +1252,34 @@ using namespace QT_NAMESPACE; } } +- (void)peripheral:(CBPeripheral *)aPeripheral + didWriteValueForDescriptor:(CBDescriptor *)descriptor + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + + using namespace OSXBluetooth; + + writePending = false; + + if (error) { + // NSLog to log the actual NSError: + NSLog(@"-peripheral:didWriteValueForDescriptor:error:, failed with error %@", + error); + // TODO: this error function is not good at all - it takes charHandle, + // which is noop at the moment and ... we actually work with a descriptor handle + // here. + delegate->error(qt_uuid(descriptor.characteristic.service.UUID), 0, + QLowEnergyService::DescriptorWriteError); + } else { + // We know that keys are unique, so can find a key for a given descriptor. + const QLowEnergyHandle dHandle = descMap.key(descriptor); + Q_ASSERT_X(dHandle, "-peripheral:didWriteValueForDescriptor:error:", + "invalid descriptor, not found in a descMap"); + delegate->descriptorWriteNotification(dHandle, qt_bytearray(descriptor.value)); + } + + [self performNextWriteRequest]; +} + @end diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index f5692c38..2bdea3c0 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -47,7 +47,9 @@ #include "qbluetoothuuid.h" #include "osxbtutility_p.h" +#include #include +#include #include // Foundation.h must be included before corebluetoothwrapper_p.h - @@ -61,7 +63,6 @@ QT_BEGIN_NAMESPACE class QLowEnergyServicePrivate; -class QByteArray; namespace OSXBluetooth { @@ -80,6 +81,8 @@ public: virtual void serviceDiscoveryFinished(LEServices services) = 0; virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; virtual void characteristicWriteNotification(LECharacteristic ch) = 0; + virtual void descriptorWriteNotification(QLowEnergyHandle descHandle, + const QByteArray &value) = 0; virtual void disconnected() = 0; // General errors. @@ -114,6 +117,19 @@ typedef QHash ServiceHash; typedef QHash CharHash; typedef QHash DescHash; +// Descriptor write request - we have to serialize 'concurrent' write requests. +struct LEWriteRequest +{ + LEWriteRequest() : isDescriptor(false), handle(0) + {} + + bool isDescriptor; + QLowEnergyHandle handle; + QByteArray value; +}; + +typedef QQueue WriteQueue; + } QT_END_NAMESPACE @@ -145,7 +161,10 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(OSXBluetooth)::CharHash charMap; QT_PREPEND_NAMESPACE(OSXBluetooth)::DescHash descMap; - QLowEnergyHandle lastValidHandle; + QT_PREPEND_NAMESPACE(QLowEnergyHandle) lastValidHandle; + + bool writePending; + QT_PREPEND_NAMESPACE(OSXBluetooth)::WriteQueue writeQueue; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; @@ -159,12 +178,12 @@ QT_END_NAMESPACE - (void)discoverServices; - (bool)discoverServiceDetails:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid; -// Characteristic's handle here is a 'relative' == valueHandle - service->startHandle -// to simplify mapping between Qt's handles and Core Bluetooth's data structures. - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)writeWithResponse; +- (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value + descHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))descHandle; @end #endif diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 88ec6421..7a938ae9 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -123,6 +123,7 @@ UUIDList qt_servicesUuids(NSArray *services) return uuids; } +// TODO: get rid of this. QLowEnergyHandle qt_findCharacteristicHandle(QLowEnergyHandle serviceHandle, CBService *service, CBCharacteristic *ch) { @@ -130,12 +131,9 @@ QLowEnergyHandle qt_findCharacteristicHandle(QLowEnergyHandle serviceHandle, // but duplicating data structures (CB char-tree, Qt char-tree, etc.) // is even more annoying. - Q_ASSERT_X(serviceHandle, "qt_findCharacteristicHandle", - "invalid service handle (0)"); - Q_ASSERT_X(service, "qt_findCharacteristicHandle", - "invalid service (nil)"); - Q_ASSERT_X(ch, "qt_findCharacteristicHandle", - "invalid characteristic (nil)"); + Q_ASSERT_X(serviceHandle, "qt_findCharacteristicHandle", "invalid service handle (0)"); + Q_ASSERT_X(service, "qt_findCharacteristicHandle", "invalid service (nil)"); + Q_ASSERT_X(ch, "qt_findCharacteristicHandle", "invalid characteristic (nil)"); NSArray *const chars = service.characteristics; if (!chars || !chars.count) @@ -374,12 +372,28 @@ void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(LECharacter return; } - // TODO: check that this 'value' is what we need! const QByteArray data(OSXBluetooth::qt_bytearray([ch value])); updateValueOfCharacteristic(charHandle, data, false); emit service->characteristicWritten(characteristic, data); } +void QLowEnergyControllerPrivateOSX::descriptorWriteNotification(QLowEnergyHandle dHandle, const QByteArray &value) +{ + Q_ASSERT_X(dHandle, "descriptorWriteNotification", "invalid descriptor handle (0)"); + + const QLowEnergyDescriptor qtDescriptor(descriptorForHandle(dHandle)); + if (!qtDescriptor.isValid()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::descriptorWriteNotification(), " + "unknown descriptor " << dHandle; + return; + } + + ServicePrivate service(serviceForHandle(qtDescriptor.characteristicHandle())); + // TODO: test if this data is what we expected. + updateValueOfDescriptor(qtDescriptor.characteristicHandle(), dHandle, value, false); + emit service->descriptorWritten(qtDescriptor, value); +} + void QLowEnergyControllerPrivateOSX::disconnected() { controllerState = QLowEnergyController::UnconnectedState; @@ -547,13 +561,13 @@ void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointeruuid)) { qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " - "no service with uuid: " << service << "found"; + "no service with uuid: " << service->uuid << " found"; return; } if (!service->characteristicList.contains(charHandle)) { qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " - "no characteristic with handle: " << charHandle << "found"; + "no characteristic with handle: " << charHandle << " found"; return; } @@ -582,13 +596,46 @@ quint16 QLowEnergyControllerPrivateOSX::updateValueOfCharacteristic(QLowEnergyHa } void QLowEnergyControllerPrivateOSX::writeDescriptor(QSharedPointer service, - QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, + QLowEnergyHandle descriptorHandle, const QByteArray &newValue) { - Q_UNUSED(service) - Q_UNUSED(charHandle) - Q_UNUSED(descriptorHandle) - Q_UNUSED(newValue) + Q_ASSERT_X(!service.isNull(), "writeDescriptor", "invalid service (null)"); + + if (!isValid()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeDescriptor(), " + "invalid controller"; + return; + } + + // We can work only with services found on a given peripheral + // (== created by the given LE controller), + // otherwise we can not write anything at all. + if (!discoveredServices.contains(service->uuid)) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeDescriptor(), " + "no service with uuid: " << service->uuid << " found"; + return; + } + + if (![centralManager write:newValue descHandle:descriptorHandle]) + service->setError(QLowEnergyService::DescriptorWriteError); +} + +quint16 QLowEnergyControllerPrivateOSX::updateValueOfDescriptor(QLowEnergyHandle charHandle, QLowEnergyHandle descHandle, + const QByteArray &value, bool appendValue) +{ + ServicePrivate service(serviceForHandle(charHandle)); + if (service.isNull() || !service->characteristicList.contains(charHandle)) + return 0; + + if (!service->characteristicList[charHandle].descriptorList.contains(descHandle)) + return 0; + + if (appendValue) + service->characteristicList[charHandle].descriptorList[descHandle].value += value; + else + service->characteristicList[charHandle].descriptorList[descHandle].value = value; + + return service->characteristicList[charHandle].descriptorList[descHandle].value.size(); } QSharedPointer QLowEnergyControllerPrivateOSX::serviceForHandle(QLowEnergyHandle handle) @@ -628,6 +675,20 @@ QLowEnergyCharacteristic QLowEnergyControllerPrivateOSX::characteristicForHandle return QLowEnergyCharacteristic(); } +QLowEnergyDescriptor QLowEnergyControllerPrivateOSX::descriptorForHandle(QLowEnergyHandle descriptorHandle) +{ + const QLowEnergyCharacteristic ch(characteristicForHandle(descriptorHandle)); + if (!ch.isValid()) + return QLowEnergyDescriptor(); + + const QLowEnergyServicePrivate::CharData charData = ch.d_ptr->characteristicList[ch.attributeHandle()]; + + if (charData.descriptorList.contains(descriptorHandle)) + return QLowEnergyDescriptor(ch.d_ptr, ch.attributeHandle(), descriptorHandle); + + return QLowEnergyDescriptor(); +} + void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::Error errorCode) { // This function does not emit! diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index 2aec6200..df25e88a 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -73,6 +73,8 @@ private: void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; void serviceDetailsDiscoveryFinished(LEService service) Q_DECL_OVERRIDE; void characteristicWriteNotification(LECharacteristic ch) Q_DECL_OVERRIDE; + void descriptorWriteNotification(QLowEnergyHandle descHandle, + const QByteArray &newValue) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; void error(QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; void error(const QBluetoothUuid &serviceUuid, @@ -97,13 +99,19 @@ private: bool appendValue); void writeDescriptor(QSharedPointer service, - QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, + QLowEnergyHandle descriptorHandle, const QByteArray &newValue); + quint16 updateValueOfDescriptor(QLowEnergyHandle charHandle, + QLowEnergyHandle descHandle, + const QByteArray &value, + bool appendValue); + // 'Lookup' functions: QSharedPointer serviceForHandle(QLowEnergyHandle serviceHandle); QLowEnergyCharacteristic characteristicForHandle(QLowEnergyHandle charHandle); + QLowEnergyDescriptor descriptorForHandle(QLowEnergyHandle descriptorHandle); void setErrorDescription(QLowEnergyController::Error errorCode); void invalidateServices(); diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index edbac253..eb0ae54f 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -73,6 +73,7 @@ protected: friend class QLowEnergyCharacteristic; friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateOSX; QLowEnergyDescriptorPrivate *data; QLowEnergyDescriptor(QSharedPointer p, diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index f9c124e4..996de64b 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -221,8 +221,30 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) { - Q_UNUSED(descriptor) - Q_UNUSED(newValue) + if (!contains(descriptor)) + return; + + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + if (!controller) + return; + + if (state() != ServiceDiscovered) { + d_ptr->setError(OperationError); + return; + } + + if (descriptor.uuid() == QBluetoothUuid::ClientCharacteristicConfiguration) { + // Core Bluetooth: + // + // "You cannot use this method to write the value of a client configuration descriptor + // (represented by the CBUUIDClientCharacteristicConfigurationString constant), + // which describes how notification or indications are configured for a + // characteristic’s value with respect to a client. If you want to manage + // notifications or indications for a characteristic’s value, you must + // use the setNotifyValue:forCharacteristic: method instead." + } else { + controller->writeDescriptor(descriptor.d_ptr, descriptor.handle(), newValue); + } } QT_END_NAMESPACE -- cgit v1.2.3 From 78954716c7dfb5334386ba28d09363468a7fead2 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 24 Nov 2014 15:09:33 +0100 Subject: Android: Add characteristic indication support At this point in time characteristic indication is very much under- documented. We have to make some guesses along the way notifications work. Also, it turns out the code already supported indications but was not very future proof. If the ClientCharacteristicConfiguration is expanded by future Bluetooth specifications the notifications could have been enabled despite the two relevant bits not being set. All that was required was to write {0xFC FF} and the notifications would have been enabled. This was due to assumption that only the byte array {0x00 0xFF} being the disabling data set. Change-Id: I6c54d557f51977418f91baf658b62e1121785029 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 12935b6a..ea5d6ce6 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -887,10 +887,21 @@ public class QtBluetoothLE { must be written to the peripheral */ - boolean enableNotifications = true; - if (Arrays.equals(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE, - nextJob.newValue)) - enableNotifications = false; + + /* There is no documentation on indication behavior. The assumption is + that when indication or notification are requested we call + BluetoothGatt.setCharacteristicNotification. Furthermore it is assumed + indications are send via onCharacteristicChanged too and Android itself + will do the confirmation required for an indication as per + Bluetooth spec Vol 3, Part G, 4.11 . If neither of the two bits are set + we disable the signals. + */ + boolean enableNotifications = false; + int value = (nextJob.newValue[0] & 0xff); + // first or second bit must be set + if (((value & 0x1) == 1) || (((value >> 1) & 0x1) == 1)) { + enableNotifications = true; + } result = mBluetoothGatt.setCharacteristicNotification( nextJob.entry.descriptor.getCharacteristic(), enableNotifications); -- cgit v1.2.3 From b82007fd2425bf7cae13dd525087bf390047a8cd Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 28 Nov 2014 16:13:39 +0100 Subject: QLowEnergyController - concurrent characteristic writes Qt's API assumes that several write operations must be serialized (this is not guaranteed with Core Bluetooth AFAIK). I can enqueu only write with response operations, otherwise I never know when to do the next write. Change-Id: Iaa83514748358437e2c39335ab142d084ff197e3 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 61 ++++++++++++++++++++++---- src/bluetooth/osx/osxbtcentralmanager_p.h | 8 +++- src/bluetooth/qlowenergycontroller_osx.mm | 70 +++++------------------------- src/bluetooth/qlowenergycontroller_osx_p.h | 10 +---- src/bluetooth/qlowenergyservice_osx.mm | 4 +- 5 files changed, 75 insertions(+), 78 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 35a284c2..2b4a2dd4 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -577,7 +577,27 @@ using namespace QT_NAMESPACE; writePending = true; return [peripheral writeValue:data.data() forDescriptor:d]; } else { - // TODO: characteristics write requests. + CBCharacteristic *const ch = charMap[request.handle]; + Q_ASSERT_X(ch, "-performNextWriteRequest", "invalid characteristic (nil)"); + + ObjCStrongReference data(data_from_bytearray(request.value)); + if (!data) { + // Even if qtData.size() == 0, we still need NSData object. + qCWarning(QT_BT_OSX) << "-performNextWriteRequest, " + "failed to allocate NSData object"; + [self performNextWriteRequest]; + } + + // TODO: check what happens if I'm using NSData with length 0. + if (request.withResponse) { + writePending = true; + [peripheral writeValue:data.data() forCharacteristic:ch + type:CBCharacteristicWriteWithResponse]; + } else { + [peripheral writeValue:data.data() forCharacteristic:ch + type:CBCharacteristicWriteWithoutResponse]; + [self performNextWriteRequest]; + } } } @@ -597,6 +617,22 @@ using namespace QT_NAMESPACE; return false; } + LEWriteRequest request; + request.isDescriptor = false; + request.withResponse = withResponse; + request.handle = charHandle; + request.value = value; + + writeQueue.enqueue(request); + [self performNextWriteRequest]; + // TODO: this is quite ugly: true value can be returned after + // write actually. If I have any problems with the order later, + // I'll use performSelector afterDelay with some delay. + return true; +/* + // Write without responce is not serialized - no way I can + // know about the write operation success/failure - and + // I will never perform the next write. CBCharacteristic *const ch = charMap[charHandle]; Q_ASSERT_X(ch, "-write:charHandle:withResponse:", "invalid characteristic (nil) for a give handle"); Q_ASSERT_X(peripheral, "-write:charHandle:withResponse:", "invalid peripheral (nil)"); @@ -611,9 +647,9 @@ using namespace QT_NAMESPACE; // TODO: check what happens if I'm using NSData with length 0. [peripheral writeValue:data.data() forCharacteristic:ch - type: withResponse? CBCharacteristicWriteWithResponse : CBCharacteristicWriteWithoutResponse]; + type:CBCharacteristicWriteWithoutResponse]; - return true; + return true;*/ } - (bool)write:(const QByteArray &)value descHandle:(QLowEnergyHandle)descHandle @@ -1223,6 +1259,9 @@ using namespace QT_NAMESPACE; didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { + Q_UNUSED(aPeripheral) + Q_UNUSED(characteristic) + // From docs: // // "This method is invoked only when your app calls the writeValue:forCharacteristic:type: @@ -1232,8 +1271,7 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - Q_UNUSED(aPeripheral) - Q_UNUSED(characteristic) + writePending = false; Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", "invalid delegate (null)"); @@ -1247,9 +1285,14 @@ using namespace QT_NAMESPACE; delegate->error(qt_uuid(characteristic.service.UUID), 0, QLowEnergyService::CharacteristicWriteError); } else { - ObjCStrongReference ch(characteristic, true); - delegate->characteristicWriteNotification(ch); + // Keys are unique. + const QLowEnergyHandle cHandle = charMap.key(characteristic); + Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", + "invalid handle, not found in the characteristics map"); + delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); } + + [self performNextWriteRequest]; } - (void)peripheral:(CBPeripheral *)aPeripheral @@ -1272,10 +1315,10 @@ using namespace QT_NAMESPACE; delegate->error(qt_uuid(descriptor.characteristic.service.UUID), 0, QLowEnergyService::DescriptorWriteError); } else { - // We know that keys are unique, so can find a key for a given descriptor. + // We know that keys are unique, so we can find a key for a given descriptor. const QLowEnergyHandle dHandle = descMap.key(descriptor); Q_ASSERT_X(dHandle, "-peripheral:didWriteValueForDescriptor:error:", - "invalid descriptor, not found in a descMap"); + "invalid descriptor, not found in the descriptors map"); delegate->descriptorWriteNotification(dHandle, qt_bytearray(descriptor.value)); } diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 2bdea3c0..86c621c2 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -80,7 +80,8 @@ public: virtual void connectSuccess() = 0; virtual void serviceDiscoveryFinished(LEServices services) = 0; virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; - virtual void characteristicWriteNotification(LECharacteristic ch) = 0; + virtual void characteristicWriteNotification(QLowEnergyHandle charHandle, + const QByteArray &value) = 0; virtual void descriptorWriteNotification(QLowEnergyHandle descHandle, const QByteArray &value) = 0; virtual void disconnected() = 0; @@ -120,10 +121,13 @@ typedef QHash DescHash; // Descriptor write request - we have to serialize 'concurrent' write requests. struct LEWriteRequest { - LEWriteRequest() : isDescriptor(false), handle(0) + LEWriteRequest() : isDescriptor(false), + withResponse(false), + handle(0) {} bool isDescriptor; + bool withResponse; QLowEnergyHandle handle; QByteArray value; }; diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 7a938ae9..7191c160 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -123,34 +123,6 @@ UUIDList qt_servicesUuids(NSArray *services) return uuids; } -// TODO: get rid of this. -QLowEnergyHandle qt_findCharacteristicHandle(QLowEnergyHandle serviceHandle, - CBService *service, CBCharacteristic *ch) -{ - // This mapping from CB -> Qt Qt -> CB is quite verbose and annoying, - // but duplicating data structures (CB char-tree, Qt char-tree, etc.) - // is even more annoying. - - Q_ASSERT_X(serviceHandle, "qt_findCharacteristicHandle", "invalid service handle (0)"); - Q_ASSERT_X(service, "qt_findCharacteristicHandle", "invalid service (nil)"); - Q_ASSERT_X(ch, "qt_findCharacteristicHandle", "invalid characteristic (nil)"); - - NSArray *const chars = service.characteristics; - if (!chars || !chars.count) - return 0; // Invalid handle, to be .. handled by the caller. - - QLowEnergyHandle handle = serviceHandle + 1; - for (CBCharacteristic *candidate in chars) { - if (candidate == ch) - return handle; - NSArray *const ds = candidate.descriptors; - if (ds && ds.count) - handle += ds.count + 1; // + 1 is for char itself. - } - - return 0; -} - } QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q) @@ -158,8 +130,7 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), - addressType(QLowEnergyController::PublicAddress), - lastValidHandle(0) // 0 == invalid. + addressType(QLowEnergyController::PublicAddress) { // This is the "wrong" constructor - no valid device UUID to connect later. Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); @@ -180,8 +151,7 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl isConnecting(false), lastError(QLowEnergyController::NoError), controllerState(QLowEnergyController::UnconnectedState), - addressType(QLowEnergyController::PublicAddress), - lastValidHandle(0) // 0 == invalid. + addressType(QLowEnergyController::PublicAddress) { Q_ASSERT_X(q, "QLowEnergyControllerPrivateOSX", "invalid q_ptr (null)"); centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); @@ -338,30 +308,16 @@ void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService s qtService->stateChanged(QLowEnergyService::ServiceDiscovered); } -void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(LECharacteristic ch) +void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyHandle charHandle, + const QByteArray &value) { - Q_ASSERT_X(ch, "characteristicWriteNotification", "invalid characteristic (nil)"); + Q_ASSERT_X(charHandle, "characteristicWriteNotification", + "invalid characteristic handle(0)"); - QT_BT_MAC_AUTORELEASEPOOL; - - CBService *const cbService = [ch service]; - const QBluetoothUuid serviceUuid(OSXBluetooth::qt_uuid(cbService.UUID)); - if (!discoveredServices.contains(serviceUuid)) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " - "unknown service uuid: " << serviceUuid; - return; - } - - ServicePrivate service(discoveredServices.value(serviceUuid)); - Q_ASSERT_X(service->startHandle, "characteristicWriteNotification", - "invalid service handle (0)"); - - const QLowEnergyHandle charHandle = - qt_findCharacteristicHandle(service->startHandle, cbService, ch); - - if (!charHandle) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " - "unknown characteristic"; + ServicePrivate service(serviceForHandle(charHandle)); + if (service.isNull()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " + "can not find service for characteristic handle " << charHandle; return; } @@ -372,9 +328,8 @@ void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(LECharacter return; } - const QByteArray data(OSXBluetooth::qt_bytearray([ch value])); - updateValueOfCharacteristic(charHandle, data, false); - emit service->characteristicWritten(characteristic, data); + updateValueOfCharacteristic(charHandle, value, false); + emit service->characteristicWritten(characteristic, value); } void QLowEnergyControllerPrivateOSX::descriptorWriteNotification(QLowEnergyHandle dHandle, const QByteArray &value) @@ -722,7 +677,6 @@ void QLowEnergyControllerPrivateOSX::invalidateServices() service->setState(QLowEnergyService::InvalidService); } - lastValidHandle = 0; discoveredServices.clear(); } diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index df25e88a..c723b1a5 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -72,7 +72,8 @@ private: void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; void serviceDetailsDiscoveryFinished(LEService service) Q_DECL_OVERRIDE; - void characteristicWriteNotification(LECharacteristic ch) Q_DECL_OVERRIDE; + void characteristicWriteNotification(QLowEnergyHandle charHandle, + const QByteArray &newValue) Q_DECL_OVERRIDE; void descriptorWriteNotification(QLowEnergyHandle descHandle, const QByteArray &newValue) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; @@ -141,13 +142,6 @@ private: typedef ServiceMap::const_iterator ConstServiceIterator; typedef ServiceMap::iterator ServiceIterator; ServiceMap discoveredServices; - - // While Core Bluetooth has _startHandle/_endHandle for - // CBServices, this information is not a part of a public - // API and can not be used. Instead we have to 'emulate' - // these handles using something that looks like/works like - // handles: - QLowEnergyHandle lastValidHandle; }; QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index 996de64b..05763811 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -184,8 +184,10 @@ void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, if (!contains(ch)) return; - if (state() != ServiceDiscovered) + if (state() != ServiceDiscovered) { d_ptr->setError(QLowEnergyService::OperationError); + return; + } QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); if (!controller) -- cgit v1.2.3 From 944dbb9b558719b3ff9e2d129a328142c0ae6228 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 26 Nov 2014 11:22:35 +0100 Subject: Improve documentation for undiscovered QLEService The class' behavior strongly deponds on its state. This can be confusing. This patch reduces the behavior uncertainties. Change-Id: Ib5cd8e821f2bb9aca5b579abf4ae98918f951f24 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergyservice.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 0ec92d45..d3461a96 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -149,6 +149,9 @@ QT_BEGIN_NAMESPACE to be a secondary service. Each service may be included by another service which is indicated by IncludedService. \value IncludedService The service is included by another service. + On some platforms, this flag cannot be determined until + the service that includes the current service was + discovered. */ /*! @@ -306,6 +309,9 @@ QLowEnergyService::~QLowEnergyService() Returns the UUIDs of all services which are included by the current service. + The returned list is empty if this service instance's \l discoverDetails() + was not yet called or there are no known characteristics. + It is possible that an included service contains yet another service. Such second level includes have to be obtained via their relevant first level QLowEnergyService instance. Technically, this could create @@ -331,7 +337,6 @@ QList QLowEnergyService::includedServices() const Therefore any service object instance created after the first one has a state equal to already existing instances. - A service becomes invalid if the \l QLowEnergyController disconnects from the remote device. An invalid service retains its internal state at the time of the disconnect event. This implies that once the service @@ -353,6 +358,11 @@ QLowEnergyService::ServiceState QLowEnergyService::state() const /*! Returns the type of the service. + + \note The type attribute cannot be relied upon until the service has + reached the \l ServiceDiscovered state. This field is initialised + with \l PrimaryService. + */ QLowEnergyService::ServiceTypes QLowEnergyService::type() const { @@ -363,6 +373,9 @@ QLowEnergyService::ServiceTypes QLowEnergyService::type() const Returns the matching characteristic for \a uuid; otherwise an invalid characteristic. + The returned characteristic is invalid if this service instance's \l discoverDetails() + was not yet called or there are no characteristics with a matching \a uuid. + \sa characteristics() */ QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const -- cgit v1.2.3 From 913de211b3971d03e1e12bf31a5bbd7fd366952f Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 1 Dec 2014 12:06:31 +0100 Subject: QLowEnergyController - service state (OS X/iOS) Fix a bug - call setState on a service instead of stateChanged (which is just a signal not actually chanding the service's state). Change-Id: I243f1f6c6775a5592357a443a2f180e4afcf8219 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_osx.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 7191c160..365f918b 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -305,7 +305,7 @@ void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService s qtService->endHandle = service->endHandle; qtService->characteristicList = service->characteristicList; - qtService->stateChanged(QLowEnergyService::ServiceDiscovered); + qtService->setState(QLowEnergyService::ServiceDiscovered); } void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyHandle charHandle, @@ -394,7 +394,7 @@ void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, // We failed to discover any characteristics/descriptors. if (discoveredServices.contains(serviceUuid)) { ServicePrivate qtService(discoveredServices.value(serviceUuid)); - qtService->stateChanged(QLowEnergyService::InvalidService); + qtService->setState(QLowEnergyService::InvalidService); } else { qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::error(), " "error reported for unknown service "<stateChanged(QLowEnergyService::DiscoveringServices); + qtService->setState(QLowEnergyService::DiscoveringServices); } else { // The error is returned by CentralManager - no // service with a given UUID found on a peripheral. - qtService->stateChanged(QLowEnergyService::InvalidService); + qtService->setState(QLowEnergyService::InvalidService); } } -- cgit v1.2.3 From 78d90f1ec64fc7d588346c26d4270dc58c395e54 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 1 Dec 2014 15:00:49 +0100 Subject: QBluetoothLocalDevice - bug on OS X (isValid) If BT adapter is off local device is invalid on OS X: no way to access information like address/name, no way to turn the device on, all operations fail. Considering it's valid breaks the logic: you can pass any address to such a device (invalid non-null address) and device can not check if it's valid or not. Change-Id: I25f70723d566d4de8f993fc9c9a9e6867f936b7f Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice_osx.mm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_osx.mm b/src/bluetooth/qbluetoothlocaldevice_osx.mm index 38f15b8c..7e5cb12a 100644 --- a/src/bluetooth/qbluetoothlocaldevice_osx.mm +++ b/src/bluetooth/qbluetoothlocaldevice_osx.mm @@ -120,7 +120,11 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice QT_BT_MAC_AUTORELEASEPOOL; HostController defaultController([[IOBluetoothHostController defaultController] retain]); - if (!defaultController) { + if (!defaultController || [defaultController powerState] != kBluetoothHCIPowerStateON) { + // IOBluetooth can return non-null host controller without working adapter. + // Unfortunately, a local device in such a state is totally useless: + // you can not access any information like address/name or change the device + // state to powered on. So it's not valid. qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), failed to " "init a host controller object"; return; -- cgit v1.2.3 From 828603893f24db24975a327ad8141cb66826b0b0 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 2 Dec 2014 15:50:38 +0100 Subject: Bluetooth auto test - OS X and iOS Since now we run OS X on virtual machines without BT adapters, tests will fail unless specially adjusted. Disable them for the moment. Change-Id: I23e1c8be30354f4c1c481d1e3c6fb38ce4804630 Reviewed-by: Alex Blasche --- .../qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro | 2 +- tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro | 2 +- tests/auto/qbluetoothserver/qbluetoothserver.pro | 1 + .../qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro | 2 +- tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro | 1 + tests/auto/qbluetoothsocket/qbluetoothsocket.pro | 1 + 6 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro b/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro index a7868123..01ad617b 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro +++ b/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro @@ -4,5 +4,5 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets - +osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro b/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro index 7322cd70..f0d658ff 100644 --- a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro +++ b/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro @@ -4,5 +4,5 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets - +osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qbluetoothserver/qbluetoothserver.pro b/tests/auto/qbluetoothserver/qbluetoothserver.pro index ad0d1fab..870a28d7 100644 --- a/tests/auto/qbluetoothserver/qbluetoothserver.pro +++ b/tests/auto/qbluetoothserver/qbluetoothserver.pro @@ -4,6 +4,7 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets +osx:CONFIG += insignificant_test OTHER_FILES += \ README.txt diff --git a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro b/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro index 8d3d3669..2cc4a9e8 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro +++ b/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro @@ -4,7 +4,7 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets - +osx:CONFIG += insignificant_test blackberry { LIBS += -lbtapi } diff --git a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro b/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro index e55bac3a..a1bfc58e 100644 --- a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro +++ b/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro @@ -4,6 +4,7 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets +osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro b/tests/auto/qbluetoothsocket/qbluetoothsocket.pro index 3c0f9e44..cd0dc861 100644 --- a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro +++ b/tests/auto/qbluetoothsocket/qbluetoothsocket.pro @@ -5,6 +5,7 @@ testcase.timeout = 250 # this test is slow QT = core concurrent network bluetooth testlib osx:QT += widgets +osx:CONFIG += insignificant_test OTHER_FILES += \ README.txt -- cgit v1.2.3 From 493013ab2b8b89a6f1b7a0b46bbf4cf5465c4502 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 28 Nov 2014 10:51:45 +0100 Subject: QLowEnergyService - ClientCharacteristicConfiguration Core Bluetooth has a special method to enable/disable char update notifications and even more - Core Bluetooth does not allow to use writeValue:forDescriptor: with ClientCharacteristicConfiguration - that's why need this 'workaround'. Change-Id: I4a01690a76aabf62397321ca6ba22c4abb1c420c Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 186 ++++++++++++++++++++++++++--- src/bluetooth/osx/osxbtcentralmanager_p.h | 19 +++ src/bluetooth/qlowenergycontroller_osx.mm | 63 +++++++--- src/bluetooth/qlowenergycontroller_osx_p.h | 2 + src/bluetooth/qlowenergyservice_osx.mm | 4 +- 5 files changed, 238 insertions(+), 36 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 2b4a2dd4..73d9d5bc 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -110,7 +110,8 @@ using namespace QT_NAMESPACE; withProperties:(CBCharacteristicProperties)properties; - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor; - +- (CBDescriptor *)descriptor:(const QBluetoothUuid &)dUuid + forCharacteristic:(CBCharacteristic *)ch; // TODO: check _what_ exactly I have to reset ... - (void)reset; @@ -527,7 +528,7 @@ using namespace QT_NAMESPACE; // Create a Qt's internal descriptor: QLowEnergyServicePrivate::DescData newDesc = {}; newDesc.uuid = qt_uuid(d.UUID); - newDesc.value = qt_bytearray(d.value); + newDesc.value = qt_bytearray(static_cast(d.value)); descList[lastValidHandle] = newDesc; } @@ -580,27 +581,72 @@ using namespace QT_NAMESPACE; CBCharacteristic *const ch = charMap[request.handle]; Q_ASSERT_X(ch, "-performNextWriteRequest", "invalid characteristic (nil)"); - ObjCStrongReference data(data_from_bytearray(request.value)); - if (!data) { - // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << "-performNextWriteRequest, " - "failed to allocate NSData object"; - [self performNextWriteRequest]; - } - - // TODO: check what happens if I'm using NSData with length 0. - if (request.withResponse) { + if (request.isClientConfiguration) { + if (valuesToWrite.remove(request.handle)) { + // It can happen if something went wrong - we + // tried to set notification value and never received + // a callback. + qCDebug(QT_BT_OSX) << "-performNextWriteRequest:, " + "valuesToWrite already contains " + "a value for a given client configuration " + "descriptor, replacing it"; + } + // We save the original value to report it later ... + valuesToWrite[request.handle] = request.value; + const bool enable = request.value[0] & 3; writePending = true; - [peripheral writeValue:data.data() forCharacteristic:ch - type:CBCharacteristicWriteWithResponse]; + [peripheral setNotifyValue:enable forCharacteristic:ch]; } else { - [peripheral writeValue:data.data() forCharacteristic:ch - type:CBCharacteristicWriteWithoutResponse]; - [self performNextWriteRequest]; + ObjCStrongReference data(data_from_bytearray(request.value)); + if (!data) { + // Even if qtData.size() == 0, we still need NSData object. + qCWarning(QT_BT_OSX) << "-performNextWriteRequest, " + "failed to allocate NSData object"; + [self performNextWriteRequest]; + } + + // TODO: check what happens if I'm using NSData with length 0. + if (request.withResponse) { + NSLog(@"trying to write %@", data.data()); + NSLog(@"initial value: %@", ch.value); + writePending = true; + [peripheral writeValue:data.data() forCharacteristic:ch + type:CBCharacteristicWriteWithResponse]; + } else { + [peripheral writeValue:data.data() forCharacteristic:ch + type:CBCharacteristicWriteWithoutResponse]; + [self performNextWriteRequest]; + } } } } +- (bool)setNotifyValue:(const QByteArray &)value + forCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle +{ + Q_ASSERT_X(charHandle, "-setNotifyValue:forCharacteristic:", + "invalid characteristic handle (0)"); + + if (!charMap.contains(charHandle)) { + qCWarning(QT_BT_OSX) << "-setNotifyValue:forCharacteristic:, " + "unknown characteristic handle " << charHandle; + return false; + } + + OSXBluetooth::LEWriteRequest request; + request.isDescriptor = false; + request.isClientConfiguration = true; + request.handle = charHandle; + request.value = value; + + writeQueue.enqueue(request); + [self performNextWriteRequest]; + // TODO: check if I need a special map - to reset notify to NO + // before disconnect/dealloc later! Also, this can be needed if notify was set + // to YES from another application - to be tested. + return true; +} + - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)withResponse @@ -837,15 +883,40 @@ using namespace QT_NAMESPACE; return [ds objectAtIndex:1]; } +- (CBDescriptor *)descriptor:(const QBluetoothUuid &)qtUuid + forCharacteristic:(CBCharacteristic *)ch +{ + if (qtUuid.isNull() || !ch) + return nil; + + QT_BT_MAC_AUTORELEASEPOOL; + + CBDescriptor *descriptor = nil; + NSArray *const ds = ch.descriptors; + if (ds && ds.count) { + for (CBDescriptor *d in ds) { + if (OSXBluetooth::equal_uuids(d.UUID, qtUuid)) { + descriptor = d; + break; + } + } + } + + return descriptor; +} + - (void)reset { writePending = false; + valuesToWrite.clear(); writeQueue.clear(); servicesToDiscoverDetails.clear(); lastValidHandle = 0; serviceMap.clear(); charMap.clear(); descMap.clear(); + + // TODO: also serviceToVisit/VisitNext and visitedServices ? } // CBCentralManagerDelegate (the real one). @@ -990,6 +1061,9 @@ using namespace QT_NAMESPACE; Q_ASSERT_X(delegate, "-centralManager:didDisconnectPeripheral:error:", "invalid delegate (null)"); + // Clear internal caches/data. + [self reset]; + if (error && managerState == OSXBluetooth::CentralManagerDisconnecting) { managerState = OSXBluetooth::CentralManagerIdle; qCWarning(QT_BT_OSX) << "-centralManager:didDisconnectPeripheral:, " @@ -1168,7 +1242,23 @@ using namespace QT_NAMESPACE; else [self discoverDescriptors:characteristic.service]; } else { - // TODO: this can be something else in a future (if needed at all). + // This is (probably) the result of update notification. + const QLowEnergyHandle chHandle = charMap.key(characteristic); + // It's very possible we can have an invalid handle here (0) - + // if something esle is wrong (we subscribed for a notification), + // disconnected (but other application is connected) and still receiveing + // updated values ... + // TODO: this must be properly tested. + if (!chHandle) { + qCCritical(QT_BT_OSX) << "-peripheral:didUpdateValueForCharacteristic:error:, " + "unexpected update notification, no characteristic handle found"; + return; + } + + Q_ASSERT_X(delegate, "-peripheral:didUpdateValueForCharacteristic:error:", + "invalid delegate (null)"); + delegate->characteristicUpdateNotification(chHandle, + qt_bytearray(characteristic.value)); } } @@ -1271,6 +1361,8 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; + QT_BT_MAC_AUTORELEASEPOOL; + writePending = false; Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", @@ -1289,6 +1381,7 @@ using namespace QT_NAMESPACE; const QLowEnergyHandle cHandle = charMap.key(characteristic); Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", "invalid handle, not found in the characteristics map"); + NSLog(@"characteristic written, the value is %@", characteristic.value); delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); } @@ -1303,8 +1396,12 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; + QT_BT_MAC_AUTORELEASEPOOL; + writePending = false; + using namespace OSXBluetooth; + if (error) { // NSLog to log the actual NSError: NSLog(@"-peripheral:didWriteValueForDescriptor:error:, failed with error %@", @@ -1319,7 +1416,58 @@ using namespace QT_NAMESPACE; const QLowEnergyHandle dHandle = descMap.key(descriptor); Q_ASSERT_X(dHandle, "-peripheral:didWriteValueForDescriptor:error:", "invalid descriptor, not found in the descriptors map"); - delegate->descriptorWriteNotification(dHandle, qt_bytearray(descriptor.value)); + delegate->descriptorWriteNotification(dHandle, qt_bytearray(static_cast(descriptor.value))); + } + + [self performNextWriteRequest]; +} + +- (void)peripheral:(CBPeripheral *)aPeripheral + didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic + error:(NSError *)error +{ + Q_UNUSED(aPeripheral) + + using namespace OSXBluetooth; + + QT_BT_MAC_AUTORELEASEPOOL; + + writePending = false; + + Q_ASSERT_X(delegate, "-peripheral:didUpdateNotificationStateForCharacteristic:", + "invalid delegate (nil)"); + + const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); + CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:characteristic]; + const QLowEnergyHandle dHandle = descMap.key(descriptor);// 0 if descriptor is nil or unknown. + const QByteArray valueToReport(valuesToWrite.value(dHandle, QByteArray())); + + if (!valuesToWrite.remove(dHandle)) { + // In future it can be a special case: we can, in principle, + // set notify value on a characteristic without 'writeDescriptor'. + // It can also be some error. Right now we report it as error, can change. + qCWarning(QT_BT_OSX) << "-peripheral:didUpdateNotificationStateForCharacteristic:, " + "setNotifyValue called, but no client characteristic descriptor " + "found or no writeDescriptor call"; + } + + if (error) { + // NSLog to log the actual NSError: + NSLog(@"-peripheral:didUpdateNotificationStateForCharacteristic:, failed with error %@", + error); + delegate->error(qt_uuid(characteristic.service.UUID), 0, + // In Qt's API it's a descriptor write actually. + QLowEnergyService::DescriptorWriteError); + } else { + if (!valueToReport.isNull()) { + delegate->descriptorWriteNotification(dHandle, valueToReport); + } else { + // TODO: can we in future have another way to set notify value without writeDescriptor? + qCWarning(QT_BT_OSX) << "-peripheral:didUpdateNotificationStateForCharacteristic:, " + "notification value set to " << int(characteristic.isNotifying) + << " but no client characteristic configuration descriptor found" + "or no previous writeDescriptor request found"; + } } [self performNextWriteRequest]; diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 86c621c2..6d93816f 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -82,6 +82,8 @@ public: virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; virtual void characteristicWriteNotification(QLowEnergyHandle charHandle, const QByteArray &value) = 0; + virtual void characteristicUpdateNotification(QLowEnergyHandle charHandle, + const QByteArray &value) = 0; virtual void descriptorWriteNotification(QLowEnergyHandle descHandle, const QByteArray &value) = 0; virtual void disconnected() = 0; @@ -122,11 +124,13 @@ typedef QHash DescHash; struct LEWriteRequest { LEWriteRequest() : isDescriptor(false), + isClientConfiguration(false), withResponse(false), handle(0) {} bool isDescriptor; + bool isClientConfiguration; bool withResponse; QLowEnergyHandle handle; QByteArray value; @@ -134,6 +138,16 @@ struct LEWriteRequest typedef QQueue WriteQueue; +// It can happen that Qt's API wants to write something +// and expects the confirmation about this value written, +// but under the hood (Core Bluetooth) we have something like +// a special method without any values at all. +// To report our user a successful write, we have this map: +// handle -> value for a write operation. +// Since write operations are serialized, the key is guaranteed +// to be unique. +typedef QHash ValueHash; + } QT_END_NAMESPACE @@ -169,6 +183,8 @@ QT_END_NAMESPACE bool writePending; QT_PREPEND_NAMESPACE(OSXBluetooth)::WriteQueue writeQueue; + + QT_PREPEND_NAMESPACE(OSXBluetooth)::ValueHash valuesToWrite; } - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate; @@ -182,6 +198,9 @@ QT_END_NAMESPACE - (void)discoverServices; - (bool)discoverServiceDetails:(const QT_PREPEND_NAMESPACE(QBluetoothUuid) &)serviceUuid; +- (bool)setNotifyValue:(const QT_PREPEND_NAMESPACE(QByteArray) &)value + forCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle; + - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)writeWithResponse; diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 365f918b..48e144cc 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -332,6 +332,32 @@ void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyH emit service->characteristicWritten(characteristic, value); } +void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergyHandle charHandle, + const QByteArray &value) +{ + // TODO: write/update notifications are quite similar (except asserts/warnings messages + // and different signals emitted). Merge them into one function? + Q_ASSERT_X(charHandle, "characteristicUpdateNotification", + "invalid characteristic handle(0)"); + + ServicePrivate service(serviceForHandle(charHandle)); + if (service.isNull()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(), " + "can not find service for characteristic handle " << charHandle; + return; + } + + QLowEnergyCharacteristic characteristic(characteristicForHandle(charHandle)); + if (!characteristic.isValid()) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(), " + "unknown characteristic"; + return; + } + + updateValueOfCharacteristic(charHandle, value, false); + emit service->characteristicChanged(characteristic, value); +} + void QLowEnergyControllerPrivateOSX::descriptorWriteNotification(QLowEnergyHandle dHandle, const QByteArray &value) { Q_ASSERT_X(dHandle, "descriptorWriteNotification", "invalid descriptor handle (0)"); @@ -492,11 +518,26 @@ void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid } void QLowEnergyControllerPrivateOSX::setNotifyValue(QSharedPointer service, - QLowEnergyHandle charHandle, const QByteArray &newValue) + QLowEnergyHandle charHandle, + const QByteArray &newValue) { - Q_UNUSED(service) - Q_UNUSED(charHandle) - Q_UNUSED(newValue) + Q_ASSERT_X(!service.isNull(), "setNotifyValue", "invalid service (null)"); + Q_ASSERT_X(isValid(), "setNotifyValue", "invalid controller"); + + if (!discoveredServices.contains(service->uuid)) { + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " + "no service with uuid: " << service->uuid << " found"; + return; + } + + if (!service->characteristicList.contains(charHandle)) { + qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " + "no characteristic with handle: " << charHandle << " found"; + return; + } + + if (![centralManager setNotifyValue:newValue forCharacteristic:charHandle]) + service->setError(QLowEnergyService::DescriptorWriteError); } void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointer service, @@ -504,12 +545,7 @@ void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointersetNotifyValue(descriptor.d_ptr, descriptor.characteristicHandle(), newValue); } else { controller->writeDescriptor(descriptor.d_ptr, descriptor.handle(), newValue); } -- cgit v1.2.3 From 43536fcb2970bcf3fa67b36777a9cf16ff46363d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 2 Dec 2014 15:33:10 +0100 Subject: Android: Fix automatic notification sending when device demands it Some BTLE devices enable notifications be default. However since Android's BTLE API requires a call to BluetoothGatt.setCharacteristicNotification(..) to forward them, we have to peek at the ClientCharacteristicConfigurations during the service detail discovery and tell Android to forward the notification when required. Change-Id: Ief419404694d70a1373218c1b8275ef868a49ddb Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qtproject/qt5/android/bluetooth/QtBluetoothLE.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index ea5d6ce6..edeacb82 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -347,6 +347,24 @@ public class QtBluetoothLE { leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), descriptor.getCharacteristic().getUuid().toString(), runningHandle+1, descriptor.getUuid().toString(), descriptor.getValue()); + + /* Some devices preset ClientCharacteristicConfiguration descriptors + * to enable notifications out of the box. However the additional + * BluetoothGatt.setCharacteristicNotification call prevents + * automatic notifications from coming through. Hence we manually set them + * up here. + */ + + if (descriptor.getUuid().compareTo(clientCharacteristicUuid) == 0) { + final int value = descriptor.getValue()[0]; + // notification or indication bit set? + if ((value & 0x03) > 0) { + Log.d(TAG, "Found descriptor with automatic notifications."); + mBluetoothGatt.setCharacteristicNotification( + descriptor.getCharacteristic(), true); + } + } + performServiceDetailDiscoveryForHandle(runningHandle + 1, false); } -- cgit v1.2.3 From ff28b5529c7620f57130f24ce4fd6d55ab49c0af Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 13:08:48 +0100 Subject: QBluetoothLocalDevice - isValid, tests (OS X and iOS) Cancel the previous modification - even if BT is off, the device is valid unless we create it with some address (in the 'OFF' state I can not verify any address and the device is considered invalid). Enable (back) auto-test - if BT is off we just skip the test (as it's done in other test functions). Change-Id: I8b013af6a73eab9699a91834e197716836b00e78 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice_osx.mm | 6 +----- tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro | 1 - tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp | 8 ++++++++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_osx.mm b/src/bluetooth/qbluetoothlocaldevice_osx.mm index 7e5cb12a..38f15b8c 100644 --- a/src/bluetooth/qbluetoothlocaldevice_osx.mm +++ b/src/bluetooth/qbluetoothlocaldevice_osx.mm @@ -120,11 +120,7 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice QT_BT_MAC_AUTORELEASEPOOL; HostController defaultController([[IOBluetoothHostController defaultController] retain]); - if (!defaultController || [defaultController powerState] != kBluetoothHCIPowerStateON) { - // IOBluetooth can return non-null host controller without working adapter. - // Unfortunately, a local device in such a state is totally useless: - // you can not access any information like address/name or change the device - // state to powered on. So it's not valid. + if (!defaultController) { qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), failed to " "init a host controller object"; return; diff --git a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro b/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro index f0d658ff..a95f9a63 100644 --- a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro +++ b/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro @@ -4,5 +4,4 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets -osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp index 65aff3fb..b2e43068 100644 --- a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp +++ b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp @@ -241,6 +241,14 @@ void tst_QBluetoothLocalDevice::tst_name() } void tst_QBluetoothLocalDevice::tst_isValid() { +#ifdef Q_OS_OSX + // On OS X we can have a valid device (device.isValid() == true), + // that has neither a name nor a valid address - this happens + // if a Bluetooth adapter is OFF. + if (!QBluetoothLocalDevice::allDevices().count()) + QSKIP("Skipping test due to missing Bluetooth device"); +#endif + QBluetoothLocalDevice localDevice; QBluetoothAddress invalidAddress("FF:FF:FF:FF:FF:FF"); -- cgit v1.2.3 From eec48542c7de7e3e4b729268756f3bcf0c13fde0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 3 Dec 2014 15:18:02 +0100 Subject: Bluez: Do not update char value() if char is non-readable Change-Id: Ia075bfb4174c7a2b90376b215f3366076d9ae1c9 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_bluez.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 55acfc36..63de6edb 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -908,8 +908,9 @@ void QLowEnergyControllerPrivate::processReply( const QByteArray newValue = request.reference2.toByteArray(); if (!descriptorHandle) { - updateValueOfCharacteristic(charHandle, newValue, NEW_VALUE); QLowEnergyCharacteristic ch(service, charHandle); + if (ch.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, newValue, NEW_VALUE); emit service->characteristicWritten(ch, newValue); } else { updateValueOfDescriptor(charHandle, descriptorHandle, newValue, NEW_VALUE); @@ -976,8 +977,9 @@ void QLowEnergyControllerPrivate::processReply( attrHandle, newValue, NEW_VALUE); emit service->descriptorWritten(descriptor, newValue); } else { - updateValueOfCharacteristic(attrHandle, newValue, NEW_VALUE); QLowEnergyCharacteristic ch(service, attrHandle); + if (ch.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(attrHandle, newValue, NEW_VALUE); emit service->characteristicWritten(ch, newValue); } } @@ -1236,7 +1238,8 @@ void QLowEnergyControllerPrivate::processUnsolicitedReply(const QByteArray &payl const QLowEnergyCharacteristic ch = characteristicForHandle(changedHandle); if (ch.isValid() && ch.handle() == changedHandle) { - updateValueOfCharacteristic(ch.attributeHandle(), payload.mid(3), NEW_VALUE); + if (ch.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(ch.attributeHandle(), payload.mid(3), NEW_VALUE); emit ch.d_ptr->characteristicChanged(ch, payload.mid(3)); } else { qCWarning(QT_BT_BLUEZ) << "Cannot find matching characteristic for " -- cgit v1.2.3 From 2b0b8344bdd13f91d0cb21a568d6b50a320156a2 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 14:26:24 +0100 Subject: QBluetoothServer - auto test on OS X Modify the test to deal with Bluetooth adapter OFF on OS X. Change-Id: If45b620bb7a7c86016da0bb1cd04ed60af73662b Reviewed-by: Alex Blasche --- tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp index 084d923c..01a79a03 100644 --- a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp +++ b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp @@ -126,6 +126,10 @@ void tst_QBluetoothServer::initTestCase() return; initialHostMode = device.hostMode(); +#ifdef Q_OS_OSX + if (initialHostMode == QBluetoothLocalDevice::HostPoweredOff) + return; +#endif setHostMode(device.address(), QBluetoothLocalDevice::HostConnectable); @@ -177,6 +181,10 @@ void tst_QBluetoothServer::tst_receive() QFETCH(QBluetoothLocalDevice::HostMode, hostmode); QBluetoothLocalDevice localDev; +#ifdef Q_OS_OSX + if (localDev.hostMode() == QBluetoothLocalDevice::HostPoweredOff) + QSKIP("On OS X this test requires Bluetooth adapter ON"); +#endif const QBluetoothAddress address = localDev.address(); bool localDeviceAvailable = localDev.isValid(); -- cgit v1.2.3 From d91c0269e780a0522af23560033380fc7f50abb6 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 13:19:46 +0100 Subject: QBluetoothDeviceDiscoveryAgent - test on OS X This test works ok even if BT is OFF. Change-Id: I5b3ce3f0aebc2b58df5e59d42e620385116daba1 Reviewed-by: Alex Blasche --- .../qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro b/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro index 01ad617b..dc0851ad 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro +++ b/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro @@ -4,5 +4,4 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets -osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 -- cgit v1.2.3 From a0dc82fc83b43ca1f3ab6b580657517f53890c73 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 14:00:15 +0100 Subject: QBluetoothSocket - auto test on OS X The test works ok even with BT adapter off. Change-Id: I3b1743fd92f41a57803a5c9df82fb1fc0788834b Reviewed-by: Alex Blasche --- tests/auto/qbluetoothsocket/qbluetoothsocket.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro b/tests/auto/qbluetoothsocket/qbluetoothsocket.pro index cd0dc861..3c0f9e44 100644 --- a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro +++ b/tests/auto/qbluetoothsocket/qbluetoothsocket.pro @@ -5,7 +5,6 @@ testcase.timeout = 250 # this test is slow QT = core concurrent network bluetooth testlib osx:QT += widgets -osx:CONFIG += insignificant_test OTHER_FILES += \ README.txt -- cgit v1.2.3 From 9af938515ef88ccf8f6acca78bbb558487a22414 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 13:51:48 +0100 Subject: QBluetoothServiceInfo - auto test on OS X This test was already protected against 'Bluetooth is OFF' state. Change-Id: I03f58ed740baab24bfbe331e80df92193af5428b Reviewed-by: Alex Blasche --- tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro b/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro index a1bfc58e..e55bac3a 100644 --- a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro +++ b/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro @@ -4,7 +4,6 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets -osx:CONFIG += insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 -- cgit v1.2.3 From 523ff2cf52ff32c270fcdbed4da85db65baea44d Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 1 Dec 2014 17:40:28 +0100 Subject: QLowEnergyController/Service - enable for iOS Enable Core Bluetooth-based version for iOS. Change-Id: Ica13fdc6c01744713483771e7c8ad6153c9fccdf Reviewed-by: Alex Blasche --- src/bluetooth/bluetooth.pro | 10 +++++++++- src/bluetooth/osx/osxbt.pri | 6 ++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index b6783425..593431c3 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -183,7 +183,12 @@ config_bluez:qtHaveModule(dbus) { LIBS += -framework Foundation -framework CoreBluetooth OBJECTIVE_SOURCES += \ - qbluetoothdevicediscoveryagent_ios.mm + qbluetoothdevicediscoveryagent_ios.mm \ + qlowenergycontroller_osx.mm \ + qlowenergyservice_osx.mm + + PRIVATE_HEADERS += \ + qlowenergycontroller_osx_p.h include(osx/osxbt.pri) SOURCES += \ @@ -196,6 +201,9 @@ config_bluez:qtHaveModule(dbus) { qlowenergycontroller_p.cpp SOURCES -= qbluetoothdevicediscoveryagent.cpp + SOURCES -= qlowenergycontroller_p.cpp + SOURCES -= qlowenergyservice.cpp + SOURCES -= qlowenergycontroller.cpp } else { message("Unsupported Bluetooth platform, will not build a working QtBluetooth library.") message("Either no Qt D-Bus found or no BlueZ headers.") diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 1eddcf4c..96ad3905 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -33,9 +33,11 @@ CONFIG(osx) { PRIVATE_HEADERS += osx/osxbtutility_p.h \ osx/osxbtledeviceinquiry_p.h \ osx/corebluetoothwrapper_p.h \ - osx/osxbtcentralmanagerdelegate_p.h + osx/osxbtcentralmanagerdelegate_p.h \ + osx/osxbtcentralmanager_p.h OBJECTIVE_SOURCES += osx/osxbtutility.mm \ osx/osxbtledeviceinquiry.mm \ - osx/osxbtcentralmanagerdelegate.mm + osx/osxbtcentralmanagerdelegate.mm \ + osx/osxbtcentralmanager.mm } -- cgit v1.2.3 From 6d399ac04e1a1cb67444ff6557f425392031d37a Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 3 Dec 2014 13:32:37 +0100 Subject: QBluetoothServiceDiscoveryAgent - auto test on OS X Enable this test back (removing 'insignificant') + modify a test to make it pass if BT adapter is OFF. Change-Id: Ia2951eeed75a6695ed9ac8fc803cb2ba6668e469 Reviewed-by: Alex Blasche --- .../qbluetoothservicediscoveryagent.pro | 1 - .../tst_qbluetoothservicediscoveryagent.cpp | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro b/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro index 2cc4a9e8..9ae5d71d 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro +++ b/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro @@ -4,7 +4,6 @@ CONFIG += testcase QT = core concurrent bluetooth testlib osx:QT += widgets -osx:CONFIG += insignificant_test blackberry { LIBS += -lbtapi } diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp index f9e7ef1a..341c6918 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp +++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp @@ -84,6 +84,7 @@ tst_QBluetoothServiceDiscoveryAgent::tst_QBluetoothServiceDiscoveryAgent() QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); // start Bluetooth if not started +#ifndef Q_OS_OSX QBluetoothLocalDevice *device = new QBluetoothLocalDevice(); localDeviceAvailable = device->isValid(); if (localDeviceAvailable) { @@ -92,6 +93,10 @@ tst_QBluetoothServiceDiscoveryAgent::tst_QBluetoothServiceDiscoveryAgent() QTest::qWait(1000); } delete device; +#else + QBluetoothLocalDevice device; + localDeviceAvailable = QBluetoothLocalDevice().hostMode() != QBluetoothLocalDevice::HostPoweredOff; +#endif qRegisterMetaType("QBluetoothDeviceInfo"); qRegisterMetaType("QBluetoothServiceInfo"); @@ -147,6 +152,10 @@ void tst_QBluetoothServiceDiscoveryAgent::initTestCase() void tst_QBluetoothServiceDiscoveryAgent::tst_invalidBtAddress() { +#ifdef Q_OS_OSX + if (!localDeviceAvailable) + QSKIP("On OS X this test requires Bluetooth adapter in powered ON state"); +#endif QBluetoothServiceDiscoveryAgent *discoveryAgent = new QBluetoothServiceDiscoveryAgent(QBluetoothAddress("11:11:11:11:11:11")); QCOMPARE(discoveryAgent->error(), QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError); -- cgit v1.2.3 From 01ea948742b649ad482c2e3e6d914fc1ac5f4917 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 2 Dec 2014 14:41:38 +0100 Subject: Android: enable writing of characteristics without response mode Change-Id: I9c26aaa11857db8dc33a99d42347a9b7f6281ad7 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 19 ++++++++++++++++++- src/bluetooth/qlowenergycontroller_android.cpp | 10 ++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index edeacb82..748d709e 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -450,6 +450,7 @@ public class QtBluetoothLE { { public GattEntry entry; public byte[] newValue; + public int requestedWriteType; } private final Hashtable> uuidToEntry = new Hashtable>(100); @@ -805,7 +806,8 @@ public class QtBluetoothLE { /* Write Characteristics */ /*************************************************************/ - public boolean writeCharacteristic(int charHandle, byte[] newValue) + public boolean writeCharacteristic(int charHandle, byte[] newValue, + int writeMode) { if (mBluetoothGatt == null) return false; @@ -822,6 +824,17 @@ public class QtBluetoothLE { newJob.newValue = newValue; newJob.entry = entry; + // writeMode must be in sync with QLowEnergyService::WriteMode + // For now we ignore SignedWriteType as Qt doesn't support it yet. + switch (writeMode) { + case 1: //WriteWithoutResponse + newJob.requestedWriteType = BluetoothGattCharacteristic. WRITE_TYPE_NO_RESPONSE; + break; + default: + newJob.requestedWriteType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT; + break; + } + boolean result; synchronized (writeQueue) { result = writeQueue.add(newJob); @@ -856,6 +869,7 @@ public class QtBluetoothLE { WriteJob newJob = new WriteJob(); newJob.newValue = newValue; newJob.entry = entry; + newJob.requestedWriteType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT; boolean result; synchronized (writeQueue) { @@ -891,6 +905,9 @@ public class QtBluetoothLE { boolean result; switch (nextJob.entry.type) { case Characteristic: + if (nextJob.entry.characteristic.getWriteType() != nextJob.requestedWriteType) { + nextJob.entry.characteristic.setWriteType(nextJob.requestedWriteType); + } result = nextJob.entry.characteristic.setValue(nextJob.newValue); if (!result || !mBluetoothGatt.writeCharacteristic(nextJob.entry.characteristic)) skip = true; diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 25bd35d7..9be5cff0 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -165,7 +165,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, - bool /*writeWithResponse*/) + bool writeWithResponse) { //TODO don't ignore WriteWithResponse, right now we assume responses Q_ASSERT(!service.isNull()); @@ -182,9 +182,11 @@ void QLowEnergyControllerPrivate::writeCharacteristic( bool result = false; if (hub) { qCDebug(QT_BT_ANDROID) << "Write characteristic with handle " << charHandle - << newValue.toHex() << "(service:" << service->uuid << ")"; - result = hub->javaObject().callMethod("writeCharacteristic", "(I[B)Z", - charHandle, payload); + << newValue.toHex() << "(service:" << service->uuid + << ", writeWithResponse:" << writeWithResponse << ")"; + result = hub->javaObject().callMethod("writeCharacteristic", "(I[BI)Z", + charHandle, payload, + writeWithResponse ? QLowEnergyService::WriteWithResponse : QLowEnergyService::WriteWithoutResponse); } if (env->ExceptionOccurred()) { -- cgit v1.2.3 From 90491cb94b5aaad8c9aded106fea0aba09ac4be9 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 3 Dec 2014 14:19:48 +0100 Subject: Don't update cached char value when property is not readable In addition we update the documentation to reflect the slightly changed API behavior. Change-Id: Ieddee750aa35a32d3c01213dfbf678ee2a1d88d7 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java | 2 +- src/bluetooth/qlowenergycharacteristic.cpp | 8 +++++--- src/bluetooth/qlowenergycontroller_android.cpp | 10 ++++++++-- src/bluetooth/qlowenergyservice.cpp | 9 +++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 748d709e..b9f7e184 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -919,7 +919,7 @@ public class QtBluetoothLE { into two operations. BluetoothGatt.enableCharacteristicNotification ensures the local Blueooth stack forwards the notifications. In addition, BluetoothGattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE) - must be written to the peripheral + must be written to the peripheral. */ diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp index 2f8bd6fa..91e9d94d 100644 --- a/src/bluetooth/qlowenergycharacteristic.cpp +++ b/src/bluetooth/qlowenergycharacteristic.cpp @@ -195,9 +195,11 @@ QLowEnergyCharacteristic::PropertyTypes QLowEnergyCharacteristic::properties() c \l {QLowEnergyService::writeCharacteristic()}{write operation} or when an update notification is received. - The returned \l QByteArray is empty if the characteristic does not have the - \l {QLowEnergyCharacteristic::Read}{read permission}. However, a non-readable - characteristic may obtain a non-empty value via a related notification or write operation. + The returned \l QByteArray always remains empty if the characteristic does not + have the \l {QLowEnergyCharacteristic::Read}{read permission}. In such cases only + the \l QLowEnergyService::characteristicChanged() or + \l QLowEnergyService::characteristicWritten() may provice information about the + value of this characteristic. */ QByteArray QLowEnergyCharacteristic::value() const { diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 9be5cff0..e1b668ca 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -431,7 +431,10 @@ void QLowEnergyControllerPrivate::characteristicWritten( return; } - updateValueOfCharacteristic(charHandle, data, false); + // only update cache when property is readable. Otherwise it remains + // empty. + if (characteristic.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, data, false); emit service->characteristicWritten(characteristic, data); } @@ -479,7 +482,10 @@ void QLowEnergyControllerPrivate::characteristicChanged( return; } - updateValueOfCharacteristic(characteristic.attributeHandle(), + // only update cache when property is readable. Otherwise it remains + // empty. + if (characteristic.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(characteristic.attributeHandle(), data, false); emit service->characteristicChanged(characteristic, data); } diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 10307332..96c3bbeb 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -242,6 +242,15 @@ QT_BEGIN_NAMESPACE by calling \l writeCharacteristic(). If the write operation is not successful, the \l error() signal is emitted using the \l CharacteristicWriteError flag. + Since this signal is an indication of a successful write operation \a newValue + generally matches the value that was passed to the associated + \l writeCharacteristic() call. However, it may happen that the two values differ + from each other. This can occur in cases when the written value is + used by the remote device to trigger an operation and it returns some other value via + the written and/or change notification. Such cases are very specific to the + target device. In any case, the reception of the written signal can still be considered + as a sign that the target device received the to-be-written value. + \note If \l writeCharacteristic() is called using the \l WriteWithoutResponse mode, this signal and the \l error() are never emitted. -- cgit v1.2.3 From 02e69e4ee1b45761bb7240afd5a6a897ff80f3f2 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 2 Dec 2014 14:58:11 +0100 Subject: Low energy descriptor - value on iOS On OS X CBDescriptor's value is always NSData, on iOS it can be NSData, NSString, NSNumber. Change-Id: I6ffa4b813238ec26759508a012fa6e236db04c63 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtutility.mm | 58 ++++++++++++++++++++++++++++++++++++++ src/bluetooth/osx/osxbtutility_p.h | 1 + 2 files changed, 59 insertions(+) diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index 26f33e6e..ae4bae77 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -246,6 +246,64 @@ QByteArray qt_bytearray(NSData *data) return value; } +template +QByteArray qt_bytearray(Integer n) +{ + QByteArray value; + value.resize(sizeof n); + const char *const src = reinterpret_cast(&n); + std::copy(src, src + sizeof n, value.data()); + + return value; +} + +QByteArray qt_bytearray(NSString *string) +{ + if (!string) + return QByteArray(); + + QT_BT_MAC_AUTORELEASEPOOL; + NSData *const utf8Data = [string dataUsingEncoding:NSUTF8StringEncoding]; + + return qt_bytearray(utf8Data); +} + +QByteArray qt_bytearray(NSObject *obj) +{ + // descriptor.value has type 'id'. + // While the Apple's docs say this about descriptors: + // + // - CBUUIDCharacteristicExtendedPropertiesString + // The string representation of the UUID for the extended properties descriptor. + // The corresponding value for this descriptor is an NSNumber object. + // + // - CBUUIDCharacteristicUserDescriptionString + // The string representation of the UUID for the user description descriptor. + // The corresponding value for this descriptor is an NSString object. + // + // ... etc. + // + // This is not true. On OS X, they all seem to be NSData (or derived from NSData), + // and they can be something else on iOS (NSNumber, NSString, etc.) + if (!obj) + return QByteArray(); + + QT_BT_MAC_AUTORELEASEPOOL; + + if ([obj isKindOfClass:[NSData class]]) { + return qt_bytearray(static_cast(obj)); + } else if ([obj isKindOfClass:[NSString class]]) { + return qt_bytearray(static_cast(obj)); + } else if ([obj isKindOfClass:[NSNumber class]]) { + NSNumber *const nsNumber = static_cast(obj); + return qt_bytearray([nsNumber unsignedShortValue]); + } + // TODO: Where can be more types, but Core Bluetooth does not support them, + // or at least it's not documented. + + return QByteArray(); +} + ObjCStrongReference data_from_bytearray(const QByteArray & qtData) { if (!qtData.size()) diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index d30ee93c..cc80d25a 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -288,6 +288,7 @@ ObjCStrongReference cb_uuid(const QBluetoothUuid &qtUuid); bool equal_uuids(const QBluetoothUuid &qtUuid, CBUUID *cbUuid); bool equal_uuids(CBUUID *cbUuid, const QBluetoothUuid &qtUuid); QByteArray qt_bytearray(NSData *data); +QByteArray qt_bytearray(NSObject *data); ObjCStrongReference data_from_bytearray(const QByteArray & qtData); } // namespace OSXBluetooth -- cgit v1.2.3 From 13ad39d1b1512ed352718050a58a35c7f6e85d0b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 3 Dec 2014 14:21:49 +0100 Subject: Make QLEController unit test pass on Android 1.) Android needs some time in between disconnect/connect attempts. 2.) Adjust unit test to modified charWritten/charChanged signals 3.) Make tst pass on Android when using WriteWithoutResponse mode when writing characteristics. Android seems to ignore this property as the platform keeps sending characteristicWritten() signals. Change-Id: I9879af989471b32ff28acc64c9897da018910515 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../tst_qlowenergycontroller.cpp | 32 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 67ae1872..80c3e532 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -74,6 +74,7 @@ public: private slots: void initTestCase(); + void init(); void cleanupTestCase(); void tst_emptyCtor(); void tst_connect(); @@ -159,6 +160,20 @@ void tst_QLowEnergyController::initTestCase() foundServices << QBluetoothUuid(QString("f000ffc0-0451-4000-b000-000000000000")); } +/* + * Executed in between each test function call. + */ +void tst_QLowEnergyController::init() +{ +#ifdef Q_OS_ANDROID + /* + * Add a delay to give Android stack time to catch up in between + * the multiple connect/disconnects within each test function. + */ + QTest::qWait(2000); +#endif +} + void tst_QLowEnergyController::cleanupTestCase() { @@ -2119,7 +2134,7 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QLowEnergyCharacteristic second = entry[0].value(); QByteArray val2 = entry[1].toByteArray(); QCOMPARE(imageIdentityChar, second); - QCOMPARE(val2, QByteArray::fromHex("0")); + QVERIFY(val2 == QByteArray::fromHex("0") || val2 == val1); charChangedSpy.clear(); charWrittenSpy.clear(); @@ -2145,7 +2160,12 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() second = entry[0].value(); val2 = entry[1].toByteArray(); QCOMPARE(imageIdentityChar, second); - QCOMPARE(val2, QByteArray::fromHex("1")); + + /* Bluez resends the last confirmed write value, other platforms + * send the value received by the change notification value. + */ + qDebug() << "Image B(1):" << val1.toHex() << val2.toHex(); + QVERIFY(val2 == QByteArray::fromHex("1") || val2 == val1); QVERIFY2(foundOneImage, "The SensorTag doesn't have a valid image? (1)"); @@ -2168,6 +2188,10 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() first = entry[0].value(); val1 = entry[1].toByteArray(); +#ifdef Q_OS_ANDROID + QEXPECT_FAIL("", "Android sends write confirmation when using WriteWithoutResponse", + Continue); +#endif QVERIFY(charWrittenSpy.isEmpty()); if (val1.size() == 8) { QCOMPARE(first, imageIdentityChar); @@ -2193,6 +2217,10 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() first = entry[0].value(); val1 = entry[1].toByteArray(); +#ifdef Q_OS_ANDROID + QEXPECT_FAIL("", "Android sends write confirmation when using WriteWithoutResponse", + Continue); +#endif QVERIFY(charWrittenSpy.isEmpty()); if (val1.size() == 8) { QCOMPARE(first, imageIdentityChar); -- cgit v1.2.3 From 1169df5311cf4f3c13d232ed2cba810725877e08 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 3 Dec 2014 15:16:27 +0100 Subject: Extend QLEController test to cover non-readable char updates When characteristicWritten() and characteristicChanged() signal is emitted for a non-readable characteristic, value() should not update. Change-Id: I28e377e75397e2bf01df535bc8f4b55c3561cdff Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../tst_qlowenergycontroller.cpp | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 80c3e532..d589b61a 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -2091,6 +2091,9 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QSignalSpy charWrittenSpy(service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); + // by default the defvice enables the notificatioin bit already + // no need to enable it. If notifications fail to arrive the + // platform must check default enabled notifications. if (notification.value() != QByteArray::fromHex("0100")) { service->writeDescriptor(notification, QByteArray::fromHex("0100")); QTRY_VERIFY_WITH_TIMEOUT(!descWrittenSpy.isEmpty(), 3000); @@ -2126,6 +2129,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QCOMPARE(imageIdentityChar, first); foundOneImage = true; } else { + // we received a notification for imageBlockChar without explicitly + // enabling them. This is caused by the device's default settings. QCOMPARE(imageBlockChar, first); qWarning() << "Invalid image A ident info"; } @@ -2136,6 +2141,10 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QCOMPARE(imageIdentityChar, second); QVERIFY(val2 == QByteArray::fromHex("0") || val2 == val1); + // notifications on non-readable characteristics do not update cache + QVERIFY(imageIdentityChar.value().isEmpty()); + QVERIFY(imageBlockChar.value().isEmpty()); + charChangedSpy.clear(); charWrittenSpy.clear(); @@ -2152,6 +2161,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QCOMPARE(imageIdentityChar, first); foundOneImage = true; } else { + // we received a notification for imageBlockChar without explicitly + // enabling them. This is caused by the device's default settings. QCOMPARE(imageBlockChar, first); qWarning() << "Invalid image B ident info"; } @@ -2161,6 +2172,10 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() val2 = entry[1].toByteArray(); QCOMPARE(imageIdentityChar, second); + // notifications on non-readable characteristics do not update cache + QVERIFY(imageIdentityChar.value().isEmpty()); + QVERIFY(imageBlockChar.value().isEmpty()); + /* Bluez resends the last confirmed write value, other platforms * send the value received by the change notification value. */ @@ -2197,10 +2212,16 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QCOMPARE(first, imageIdentityChar); foundOneImage = true; } else { + // we received a notification for imageBlockChar without explicitly + // enabling them. This is caused by the device's default settings. QCOMPARE(imageBlockChar, first); qWarning() << "Image A not set?"; } + // notifications on non-readable characteristics do not update cache + QVERIFY(imageIdentityChar.value().isEmpty()); + QVERIFY(imageBlockChar.value().isEmpty()); + charChangedSpy.clear(); // Image B @@ -2226,10 +2247,17 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QCOMPARE(first, imageIdentityChar); foundOneImage = true; } else { + // we received a notification for imageBlockChar without explicitly + // enabling them. This is caused by the device's default settings. QCOMPARE(imageBlockChar, first); qWarning() << "Image B not set?"; } + // notifications on non-readable characteristics do not update cache + QVERIFY(imageIdentityChar.value().isEmpty()); + QVERIFY(imageBlockChar.value().isEmpty()); + + QVERIFY2(foundOneImage, "The SensorTag doesn't have a valid image? (2)"); delete service; -- cgit v1.2.3 From d21201f0536230848e419b71bdd2d025b3ae1468 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 4 Dec 2014 13:25:06 +0100 Subject: QLowEnergyCharacteristic - cached values (OS X and iOS) Cache a characteristic's value in update/write notification only if characteristic has a 'Read' property. Change-Id: Idc705e0c4f2ee704a80bf37b4e59e1dd09ca9e4f Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_osx.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 48e144cc..ea22ac36 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -328,7 +328,9 @@ void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyH return; } - updateValueOfCharacteristic(charHandle, value, false); + if (characteristic.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, value, false); + emit service->characteristicWritten(characteristic, value); } @@ -354,7 +356,9 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy return; } - updateValueOfCharacteristic(charHandle, value, false); + if (characteristic.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, value, false); + emit service->characteristicChanged(characteristic, value); } -- cgit v1.2.3 From ffbb91da8e8f14d7d5ffa8bbeace3e6c42eb525b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 4 Dec 2014 15:09:07 +0100 Subject: Update supported platforms and feature in QtBluetooth The Low Energy API is final from Qt 5.5 onwards and OSX and iOS are platform additions. Change-Id: I73f18b3169c5e1438af4d90c6655eabb515e0d39 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/doc/src/bluetooth-index.qdoc | 12 ++++-------- src/bluetooth/doc/src/bluetooth-le-overview.qdoc | 13 ++++--------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/bluetooth/doc/src/bluetooth-index.qdoc b/src/bluetooth/doc/src/bluetooth-index.qdoc index 112444a8..af2c2421 100644 --- a/src/bluetooth/doc/src/bluetooth-index.qdoc +++ b/src/bluetooth/doc/src/bluetooth-index.qdoc @@ -33,11 +33,9 @@ The Bluetooth API provides connectivity between Bluetooth enabled devices. -Currently the API is supported on \l{Qt for Android}{Android}, -\l{Qt for BlackBerry}{BlackBerry 10} and -\l{Qt for Linux/X11}{Linux} (\l{http://www.bluez.org}{BlueZ 4.x/5.x}). - - +Currently, the API is supported on the following platforms: \l{Qt for Android}{Android}, +\l{Qt for BlackBerry}{BlackBerry 10}, \l{Qt for iOS}{iOS}, \l{Qt for Linux/X11}{Linux} +(\l{http://www.bluez.org}{BlueZ 4.x/5.x}) and \l{Qt for OS X}{OS X}. \section1 Overview @@ -47,11 +45,9 @@ for transferring data between devices. Bluetooth connectivity is based on basic device management, such as scanning for devices, gathering information about them, and exchanging data between them. -This Qt release contains a Technology Preview of the new Qt Bluetooth +Qt 5.5 contains the first full release of the new Qt Bluetooth Low Energy API. Further details can be found in the \l {Bluetooth Low Energy Overview}{Bluetooth Low Energy Overview} section. -The Tech Preview supports BlueZ 4 & 5 based Linux systems. Support for -further platforms is being planned. \section1 Getting Started diff --git a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc index 029171f4..a56e43fc 100644 --- a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc +++ b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc @@ -36,15 +36,10 @@ Low Energy devices. \section1 Technology Preview - The Qt Bluetooth Low Energy API has been introduced in Qt 5.4. - The API is considered to be a preview of the technology and currently only works - on BlueZ 4 & 5 based Linux systems. Support for further platforms, for example Android, - is currently being worked on and will be added by later Qt releases. In addition, - Qt only supports the central role. For more details on this limitation see below. - - While the API is not yet frozen it is close to its final stage. - We would like to encourage you to send us feedback and bug reports related to - this new feature. + The Qt Bluetooth Low Energy API was introduced by Qt 5.4. Since Qt 5.5 the API + is frozen and a compatibility guarantee is given for future releases. + At the moment, Qt only supports the Bluetooth Low Energy central role. + For more details on this limitation see below. \section1 What Is Bluetooth Low Energy -- cgit v1.2.3 From a7e67ace12d71162583b00b306060d21ad0a5580 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 4 Dec 2014 14:37:37 +0100 Subject: Client characteristic configuration (OS X and iOS) If client characteristic configuration descriptor has an indication/notification bit set - enable ("automatically" == no explicit user's request) notifications. Change-Id: I839aabd6f5513141f66c8e4467618b3edd523350 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 5 +++++ src/bluetooth/qlowenergycontroller_osx.mm | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 73d9d5bc..733d73a6 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -530,6 +530,11 @@ using namespace QT_NAMESPACE; newDesc.uuid = qt_uuid(d.UUID); newDesc.value = qt_bytearray(static_cast(d.value)); descList[lastValidHandle] = newDesc; + // Check, if it's client characteristic configuration descriptor: + if (newDesc.uuid == QBluetoothUuid::ClientCharacteristicConfiguration) { + if (newDesc.value.size() && (newDesc.value[0] & 3)) + [peripheral setNotifyValue:YES forCharacteristic:c]; + } } newChar.descriptorList = descList; diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index ea22ac36..cde11f67 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -344,8 +344,11 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy ServicePrivate service(serviceForHandle(charHandle)); if (service.isNull()) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(), " - "can not find service for characteristic handle " << charHandle; + // This can be an error (no characteristic found for this handle), + // it can also be that we set notify value before the service + // was reported (serviceDetailsDiscoveryFinished) - this happens, + // if we read a descriptor (characteristic client configuration), + // and it's (pre)set. return; } -- cgit v1.2.3 From 2762c2d739f5d8e6f07a6eb38acbc7b693a21fe3 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 4 Dec 2014 15:10:13 +0100 Subject: Add newly adopted BTLE service/characteristic type uuids Change-Id: I57eff858c2e5700ac814d24fb173c269ebff5fd3 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothuuid.cpp | 112 +++++++++++++++++++++++++++++++++++---- src/bluetooth/qbluetoothuuid.h | 90 +++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+), 11 deletions(-) diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index f4840428..3199ef34 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -211,6 +211,18 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 sensor intended for sports and fitness applications. \value LocationAndNavigation Location Navigation UUID (service). The service exposes location and navigation-related data from a Location and Navigation sensor intended for outdoor activity applications. + \value EnvironmentalSensing Environmental sensor UUID (service). The service exposes data from an environmental sensor + for sports and fitness applications. + \value BodyComposition Body composition UUID (service). The service exposes data about the body composition intended + for consumer healthcare applications. + \value UserData User Data UUID (service). The User Data service provides user-related data such as name, + gender or weight in sports and fitness environments. + \value WeightScale Weight Scale UUID (service). The Weight Scale service exposes weight-related data from + a scale for consumer healthcare, sports and fitness applications. + \value BondManagement Bond Management UUID (service). The Bond Management service enables user to manage the + storage of bond information on Bluetooth devices. + \value ContinuousGlucoseMonitoring Continuous Glucose Monitoring UUID (service). The Continuous Glucose Monitoring service + exposes glucose data from a monitoring sensor for use in healthcare applications. */ /*! @@ -218,8 +230,20 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \since 5.4 This enum is a convienience type for Bluetooth low energy service characteristics class UUIDs. Values of this type - will be implicitly converted into a QBluetoothUuid when necessary. - + will be implicitly converted into a QBluetoothUuid when necessary. The detailed type descriptions can be found + on \l{https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicsHome.aspx}{bluetooth.org}. + + \value AerobicHeartRateLowerLimit The lower limit of the heart rate where the user improves his endurance while + exercising. + \value AerobicHeartRateUpperLimit The upper limit of the heart rate where the user improves his endurance while + exercising. + \value AerobicThreshold This characteristic states the first metabolic threshold. + \value Age This characteristic states the age of the user. + \value AnaerobicHeartRateLowerLimit The lower limit of the heart rate where the user enhances his anaerobic + tolerance while exercising. + \value AnaerobicHeartRateUpperLimit The upper limit of the heart rate where the user enhances his anaerobic + tolerance while exercising. + \value AnaerobicThreshold This characteristic states the second metabolic threshold. \value AlertCategoryID Categories of alerts/messages. \value AlertCategoryIDBitMask Categories of alerts/messages. \value AlertLevel The level of an alert a device is to sound. @@ -229,8 +253,14 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 Client can write the command here to request the several functions toward the server. \value AlertStatus The Alert Status characteristic defines the Status of alert. + \value ApparentWindDirection The characteristic exposes the apparent wind direction. The apparent wind is + experienced by an observer in motion. This characteristic states the direction + of the wind with an angle measured clockwise relative to the observers heading. + \value ApparentWindSpeed The characteristic exposes the apparent wind speed in meters per second. + The apparent wind is experienced by an observer in motion. \value Appearance The external appearance of this device. The values are composed of a category (10-bits) and sub-categories (6-bits). + \value BarometricPressureTrend This characteristic exposes the trend the barometric pressure is taking. \value BatteryLevel The current charge level of a battery. 100% represents fully charged while 0% represents fully discharged. \value BloodPressureFeature The Blood Pressure Feature characteristic is used to describe the supported @@ -239,7 +269,12 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 containing a Flags field, a Blood Pressure Measurement Compound Value field, and contains additional fields such as Time Stamp, Pulse Rate and User ID as determined by the contents of the Flags field. - \value BodySensorLocation + \value BodyCompositionFeature This characteristic describes the available features in the \l BodyCompositionMeasurement + characteristic. + \value BodyCompositionMeasurement This characteristic describes the body composition such as muscle percentage + or the body water mass. + \value BodySensorLocation The Body Sensor Location characteristic describes the location of a sensor on + the body (e.g.: chest, finger or hand). \value BootKeyboardInputReport The Boot Keyboard Input Report characteristic is used to transfer fixed format and length Input Report data between a HID Host operating in Boot Protocol Mode and a HID Service corresponding to a boot keyboard. @@ -255,7 +290,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 is a variable length structure containing a Flags field and, based on the contents of the Flags field, may contain one or more additional fields as shown in the tables below. - \value CurrentTime + \value CurrentTime The Current Time characteristic shows the same information as the \l ExactTime256 + characteristic and information on timezone, DST and the method of update employed. \value CyclingPowerControlPoint The Cycling Power Control Point characteristic is used to request a specific function to be executed on the receiving device. \value CyclingPowerFeature The CP Feature characteristic is used to report a list of features supported by @@ -266,14 +302,28 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value CyclingPowerVector The Cycling Power Vector characteristic is a variable length structure containing a Flags fieldand based on the contents of the Flags field, may contain one or more additional fields as shown in the table below. + \value DatabaseChangeIncrement + \value DateOfBirth This characteristic states the user's date of birth. + \value DateOfThresholdAssessment \value DateTime The Date Time characteristic is used to represent time. - \value DayDateTime - \value DayOfWeek - \value DeviceName - \value DSTOffset - \value ExactTime256 + \value DayDateTime The Day Date Time characteristic presents the date, time and day of the week. + \value DayOfWeek The Day of Week characteristic describes the day of the week (Monday - Sunday). + \value DescriptorValueChanged This characteristic is related to the Environmental Sensing Service. + \value DeviceName The Device Name characteristic contains the name of the device. + \value DewPoint This characteristic states the dew point in degree Celsius. + \value DSTOffset The DST Offset characteristic describes the offset employed by the daylight saving time. + \value Elevation The Elevation characteristic states the elevation above/below sea level. + \value EmailAddress This characteristic states the email of the user. + \value ExactTime256 The Exact Time 256 characteristic describes the data, day and time + with an accuracy of 1/256th of a second. + \value FatBurnHeartRateLowerLimit The lower limit of the heart rate where the user maximizes the fat burn while exercising. + \value FatBurnHeartRateUpperLimit The upper limit of the heart rate where the user maximizes the fat burn while exercising. \value FirmwareRevisionString The value of this characteristic is a UTF-8 string representing the firmware revision for the firmware within the device. + \value FirstName This characteristic exposes the user's first name. + \value FiveZoneHeartRateLimits This characteristic contains the limits between the heart rate zones for the + 5-zone heart rate definition. + \value Gender This characteristic states the user's gender. \value GlucoseFeature The Glucose Feature characteristic is used to describe the supported features of the Server. When read, the Glucose Feature characteristic returns a value that is used by a Client to determine the supported features of the Server. @@ -282,20 +332,31 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 of the Flags field, may contain a Time Offset field, Glucose Concentration field, Type-Sample Location field and a Sensor Status Annunciation field. \value GlucoseMeasurementContext + \value GustFactor The characteristic states a factor of wind speed increase between average wind speed in + maximum gust speed. \value HardwareRevisionString The value of this characteristic is a UTF-8 string representing the hardware revision for the hardware within the device. + \value MaximumRecommendedHeartRate This characteristic exposes the maximum recommended heart rate that limits exertion. \value HeartRateControlPoint + \value HeartRateMax This characteristic states the maximum heart rate a user can reach in beats per minute. \value HeartRateMeasurement + \value HeatIndex This characteristic provides a heat index in degree Celsius. + \value Height This characteristic states the user's height. \value HIDControlPoint The HID Control Point characteristic is a control-point attribute that defines the HID Commands when written. \value HIDInformation The HID Information Characteristic returns the HID attributes when read. + \value HipCircumference This characteristic states the user's hip circumference in meters. + \value Humidity The characteristic states the humidity in percent. \value IEEE1107320601RegulatoryCertificationDataList The value of the characteristic is an opaque structure listing various regulatory and/or certification compliance items to which the device claims adherence. \value IntermediateCuffPressure This characteristic has the same format as the Blood Pressure Measurement characteristic. \value IntermediateTemperature The Intermediate Temperature characteristic has the same format as the - Temperature Measurement characteristic + Temperature Measurement characteristic. + \value Irradiance This characteristic states the power of electromagnetic radiation in watt per square meter. + \value Language This characteristic contains the language definition based on ISO639-1. + \value LastName This characteristic states the user's last name. \value LNControlPoint The LN Control Point characteristic is used to request a specific function to be executed on the receiving device. \value LNFeature The LN Feature characteristic is used to report a list of features supported @@ -304,6 +365,11 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value LocationAndSpeed The Location and Speed characteristic is a variable length structure containing a Flags field and, based on the contents of the Flags field, may contain a combination of data fields. + \value MagneticDeclination The characteristic contains the angle on the horizontal plane between the direction of + the (Geographic) True North and the Magnetic North, measured clockwise from True North + to Magnetic North. + \value MagneticFluxDensity2D This characteristic states the magnetic flux density on an x and y axis. + \value MagneticFluxDensity3D This characteristic states the magnetic flux density on an x, y and z axis. \value ManufacturerNameString The value of this characteristic is a UTF-8 string representing the name of the manufacturer of the device. \value MeasurementInterval The Measurement Interval characteristic defines the time between measurements. @@ -317,11 +383,14 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value PeripheralPrivacyFlag \value PnPID The PnP_ID characteristic returns its value when read using the GATT Characteristic Value Read procedure. + \value PollenConcentration The characteristic exposes the pollen concentration count per cubic meter. \value PositionQuality The Position Quality characteristic is a variable length structure containing a - Flags field and at least one of the optional data + Flags field and at least one of the optional data. + \value Pressure The Pressure characteristic states the value of a pressure sensor. \value ProtocolMode The Protocol Mode characteristic is used to expose the current protocol mode of the HID Service with which it is associated, or to set the desired protocol mode of the HID Service. + \value Rainfall This characteristic exposes the rainfall in meters. \value ReconnectionAddress The Information included in this page is informative. The normative descriptions are contained in the applicable specification. \value RecordAccessControlPoint This control point is used with a service to provide basic management functionality @@ -329,6 +398,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value ReferenceTimeInformation \value Report The Report characteristic is used to exchange data between a HID Device and a HID Host. \value ReportMap Only a single instance of this characteristic exists as part of a HID Service. + \value RestingHeartRate This characteristic exposes the lowest heart rate a user can reach. \value RingerControlPoint The Ringer Control Point characteristic defines the Control Point of Ringer. \value RingerSetting The Ringer Setting characteristic defines the Setting of the Ringer. \value RSCFeature The RSC (Running Speed and Cadence) Feature characteristic is used to describe the @@ -347,26 +417,46 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value ServiceChanged \value SoftwareRevisionString The value of this characteristic is a UTF-8 string representing the software revision for the software within the device. + \value SportTypeForAerobicAnaerobicThresholds This characteristic is used to preset the various Aerobic and Anaerobic + threshold characteristics based on the to-be-performed sport type. \value SupportedNewAlertCategory Category that the server supports for new alert. \value SupportedUnreadAlertCategory Category that the server supports for unread alert. \value SystemID If the system ID is based of a Bluetooth Device Address with a Company Identifier (OUI) is 0x123456 and the Company Assigned Identifier is 0x9ABCDE, then the System Identifier is required to be 0x123456FFFE9ABCDE. + \value Temperature The value of this characteristic states the temperature in degree Celsius. \value TemperatureMeasurement The Temperature Measurement characteristic is a variable length structure containing a Flags field, a Temperature Measurement Value field and, based upon the contents of the Flags field, optionally a Time Stamp field and/or a Temperature Type field. \value TemperatureType The Temperature Type characteristic is an enumeration that indicates where the temperature was measured. + \value ThreeZoneHeartRateLimits This characteristic contains the limits between the heart rate zones for the + 3-zone heart rate definition. \value TimeAccuracy \value TimeSource \value TimeUpdateControlPoint \value TimeUpdateState \value TimeWithDST \value TimeZone + \value TrueWindDirection The characteristic states the direction of the wind with an angle measured clockwise + relative to (Geographic) True North. A wind coming from the east is given as 90 degrees. + \value TrueWindSpeed The characteristic states the wind speed in meters per seconds. + \value TwoZoneHeartRateLimits This characteristic contains the limits between the heart rate zones for the + 2-zone heart rate definition. \value TxPowerLevel The value of the characteristic is a signed 8 bit integer that has a fixed point exponent of 0. \value UnreadAlertStatus This characteristic shows how many numbers of unread alerts exist in the specific category in the device. + \value UserControlPoint + \value UserIndex This characteristic states the index of the user. + \value UVIndex This characteristic exposes the UV index. + \value VO2Max This characteristic exposes the maximum Oxygen uptake of a user. + \value WaistCircumference This characteristic states the user's waist circumference in meters. + \value Weight This characteristic exposes the user's weight in kilograms. + \value WeightMeasurement This characteristic provides weight related data such as BMI or the user's weight. + \value WeightScaleFeature This characteristic describes the available data in the \l WeightMeasurement + characteristic. + \value WindChill This characteristic states the wind chill in degree Celsius */ /*! diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 2c035ffa..4985d9d9 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -166,6 +166,13 @@ public: CyclingSpeedAndCadence = 0x1816, CyclingPower = 0x1818, LocationAndNavigation = 0x1819, + EnvironmentalSensing = 0x181a, + BodyComposition = 0x181b, + UserData = 0x181c, + WeightScale = 0x181d, + BondManagement = 0x181e, + ContinuousGlucoseMonitoring = 0x181f, + }; enum CharacteristicType { @@ -180,21 +187,28 @@ public: DateTime = 0x2a08, DayOfWeek = 0x2a09, DayDateTime = 0x2a0a, + /* 0x2a0b not defined */ ExactTime256 = 0x2a0c, DSTOffset = 0x2a0d, TimeZone = 0x2a0e, LocalTimeInformation = 0x2a0f, + /* 0x2a10 not defined */ TimeWithDST = 0x2a11, TimeAccuracy = 0x2a12, TimeSource = 0x2a13, ReferenceTimeInformation = 0x2a14, + /* 0x2a15 not defined */ TimeUpdateControlPoint = 0x2a16, TimeUpdateState = 0x2a17, GlucoseMeasurement = 0x2a18, BatteryLevel = 0x2a19, + /* 0x2a1a not defined */ + /* 0x2a1b not defined */ TemperatureMeasurement = 0x2a1c, TemperatureType = 0x2a1d, IntermediateTemperature = 0x2a1e, + /* 0x2a1f not defined */ + /* 0x2a20 not defined */ MeasurementInterval = 0x2a21, BootKeyboardInputReport = 0x2a22, SystemID = 0x2a23, @@ -206,6 +220,11 @@ public: ManufacturerNameString = 0x2a29, IEEE1107320601RegulatoryCertificationDataList = 0x2a2a, CurrentTime = 0x2a2b, + MagneticDeclination = 0x2a2c, + /* 0x2a2d not defined */ + /* 0x2a2e not defined */ + /* 0x2a2f not defined */ + /* 0x2a30 not defined */ ScanRefresh = 0x2a31, BootKeyboardOutputReport = 0x2a32, BootMouseInputReport = 0x2a33, @@ -215,6 +234,11 @@ public: HeartRateMeasurement = 0x2a37, BodySensorLocation = 0x2a38, HeartRateControlPoint = 0x2a39, + /* 0x2a3a not defined */ + /* 0x2a3b not defined */ + /* 0x2a3c not defined */ + /* 0x2a3d not defined */ + /* 0x2a3e not defined */ AlertStatus = 0x2a3f, RingerControlPoint = 0x2a40, RingerSetting = 0x2a41, @@ -238,9 +262,19 @@ public: RSCMeasurement = 0x2a53, RSCFeature = 0x2a54, SCControlPoint = 0x2a55, + /* 0x2a56 not defined */ + /* 0x2a57 not defined */ + /* 0x2a58 not defined */ + /* 0x2a59 not defined */ + /* 0x2a5a not defined */ CSCMeasurement = 0x2a5b, CSCFeature = 0x2a5c, SensorLocation = 0x2a5d, + /* 0x2a5e not defined */ + /* 0x2a5f not defined */ + /* 0x2a60 not defined */ + /* 0x2a61 not defined */ + /* 0x2a62 not defined */ CyclingPowerMeasurement = 0x2a63, CyclingPowerVector = 0x2a64, CyclingPowerFeature = 0x2a65, @@ -250,6 +284,62 @@ public: PositionQuality = 0x2a69, LNFeature = 0x2a6a, LNControlPoint = 0x2a6b, + Elevation = 0x2a6c, + Pressure = 0x2a6d, + Temperature = 0x2a6e, + Humidity = 0x2a6f, + TrueWindSpeed = 0x2a70, + TrueWindDirection = 0x2a71, + ApparentWindSpeed = 0x2a72, + ApparentWindDirection = 0x2a73, + GustFactor = 0x2a74, + PollenConcentration = 0x2a75, + UVIndex = 0x2a76, + Irradiance = 0x2a77, + Rainfall = 0x2a78, + WindChill = 0x2a79, + HeatIndex = 0x2a7a, + DewPoint = 0x2a7b, + /* 0x2a7c not defined */ + DescriptorValueChanged = 0x2a7d, + AerobicHeartRateLowerLimit = 0x2a7e, + AerobicThreshold = 0x2a7f, + Age = 0x2a80, + AnaerobicHeartRateLowerLimit = 0x2a81, + AnaerobicHeartRateUpperLimit = 0x2a82, + AnaerobicThreshold = 0x2a83, + AerobicHeartRateUpperLimit = 0x2a84, + DateOfBirth = 0x2a85, + DateOfThresholdAssessment = 0x2a86, + EmailAddress = 0x2a87, + FatBurnHeartRateLowerLimit = 0x2a88, + FatBurnHeartRateUpperLimit = 0x2a89, + FirstName = 0x2a8a, + FiveZoneHeartRateLimits = 0x2a8b, + Gender = 0x2a8c, + HeartRateMax = 0x2a8d, + Height = 0x2a8e, + HipCircumference = 0x2a8f, + LastName = 0x2a90, + MaximumRecommendedHeartRate = 0x2a91, + RestingHeartRate = 0x2a92, + SportTypeForAerobicAnaerobicThresholds = 0x2a93, + ThreeZoneHeartRateLimits = 0x2a94, + TwoZoneHeartRateLimits = 0x2a95, + VO2Max = 0x2a96, + WaistCircumference = 0x2a97, + Weight = 0x2a98, + DatabaseChangeIncrement = 0x2a99, + UserIndex = 0x2a9a, + BodyCompositionFeature = 0x2a9b, + BodyCompositionMeasurement = 0x2a9c, + WeightMeasurement = 0x2a9d, + WeightScaleFeature = 0x2a9e, + UserControlPoint = 0x2a9f, + MagneticFluxDensity2D = 0x2aa0, + MagneticFluxDensity3D = 0x2aa1, + Language = 0x2aa2, + BarometricPressureTrend = 0x2aa3 }; enum DescriptorType { -- cgit v1.2.3 From 23fec9c7417af65e777ff17d17697301e510108e Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 5 Dec 2014 08:57:30 +0100 Subject: Add new environmental sensing descriptor types Change-Id: Id0ed9503da1cff66a04a83196cf61863289b98ab Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothuuid.cpp | 11 ++++++++++- src/bluetooth/qbluetoothuuid.h | 7 ++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index 3199ef34..b13c35fe 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -466,7 +466,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 Descriptors are attributes that describe Bluetooth Low Energy characteristic values. This enum is a convienience type for descriptor class UUIDs. Values of this type - will be implicitly converted into a QBluetoothUuid when necessary. + will be implicitly converted into a QBluetoothUuid when necessary. The detailed type specifications + can be found on \l{https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorsHomePage.aspx}{bluetooth.org}. \value CharacteristicExtendedProperties Descriptor defines additional Characteristic Properties. The existence of this descriptor is indicated by the @@ -485,6 +486,14 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34 \value ReportReference Mapping information in the form of a Report ID and Report Type which maps the current parent characteristic to the Report ID(s) and Report Type (s) defined within the Report Map characteristic. + \value EnvironmentalSensingConfiguration Descriptor defines how multiple trigger settings descriptors are combined. Therefore + this descriptor works together with the \l EnvironmentalSensingTriggerSetting descriptor + to define the conditions under which the associated characteristic value can be notified. + \value EnvironmentalSensingMeasurement Descriptor defines the additional information for the environmental sensing server + such as the intended application, sampling functions or measurement period and uncertainty. + \value EnvironmentalSensingTriggerSetting Descriptor defines under which conditions an environmental sensing server (ESS) should + trigger notifications. Examples of such conditions are certain thresholds being reached + or timers having expired. This implies that the ESS characteristic supports notifications. \value UnknownDescriptorType The descriptor type is unknown. */ diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 4985d9d9..94e14d0e 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -352,7 +352,12 @@ public: CharacteristicAggregateFormat = 0x2905, ValidRange = 0x2906, ExternalReportReference = 0x2907, - ReportReference = 0x2908 + ReportReference = 0x2908, + /* 0x2909 not defined */ + /* 0x290a not defined */ + EnvironmentalSensingConfiguration = 0x290b, + EnvironmentalSensingMeasurement = 0x290c, + EnvironmentalSensingTriggerSetting = 0x290d }; QBluetoothUuid(); -- cgit v1.2.3 From 597f95f5b6a46bba68106a13ad4cf03b968ca782 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 5 Dec 2014 09:34:18 +0100 Subject: Provide user visible strings/translations for new BTLE uuids Change-Id: I02e4b3518c57e120d46fdcc427663a5910e01a97 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothuuid.cpp | 82 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index b13c35fe..ef5328bd 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -808,6 +808,12 @@ QString QBluetoothUuid::serviceClassToString(QBluetoothUuid::ServiceClassUuid uu case QBluetoothUuid::CyclingSpeedAndCadence: return QBluetoothServiceDiscoveryAgent::tr("Cycling Speed and Cadance"); case QBluetoothUuid::CyclingPower: return QBluetoothServiceDiscoveryAgent::tr("Cycling Power"); case QBluetoothUuid::LocationAndNavigation: return QBluetoothServiceDiscoveryAgent::tr("Location and Navigation"); + case QBluetoothUuid::EnvironmentalSensing: return QBluetoothServiceDiscoveryAgent::tr("Environmental Sensing"); + case QBluetoothUuid::BodyComposition: return QBluetoothServiceDiscoveryAgent::tr("Body Composition"); + case QBluetoothUuid::UserData: return QBluetoothServiceDiscoveryAgent::tr("User Data"); + case QBluetoothUuid::WeightScale: return QBluetoothServiceDiscoveryAgent::tr("Weight Scale"); + case QBluetoothUuid::BondManagement: return QBluetoothServiceDiscoveryAgent::tr("Bond Management"); + case QBluetoothUuid::ContinuousGlucoseMonitoring: return QBluetoothServiceDiscoveryAgent::tr("Continuous Glucose Monitoring"); default: break; } @@ -971,6 +977,74 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::PositionQuality: return QBluetoothServiceDiscoveryAgent::tr("Position Quality"); case QBluetoothUuid::LNFeature: return QBluetoothServiceDiscoveryAgent::tr("LN Feature"); case QBluetoothUuid::LNControlPoint: return QBluetoothServiceDiscoveryAgent::tr("LN Control Point"); + case QBluetoothUuid::MagneticDeclination: + return QBluetoothServiceDiscoveryAgent::tr("Magnetic Declination", "angle between geographic and magnetic north"); + case QBluetoothUuid::Elevation: return QBluetoothServiceDiscoveryAgent::tr("Elevation", "above/below sea level"); + case QBluetoothUuid::Pressure: return QBluetoothServiceDiscoveryAgent::tr("Pressure"); + case QBluetoothUuid::Temperature: return QBluetoothServiceDiscoveryAgent::tr("Temperature"); + case QBluetoothUuid::Humidity: return QBluetoothServiceDiscoveryAgent::tr("Humidity"); + case QBluetoothUuid::TrueWindSpeed: return QBluetoothServiceDiscoveryAgent::tr("True Wind Speed", "wind speed while standing"); + case QBluetoothUuid::TrueWindDirection : return QBluetoothServiceDiscoveryAgent::tr("True Wind Direction"); + case QBluetoothUuid::ApparentWindSpeed: + return QBluetoothServiceDiscoveryAgent::tr("Apparent Wind Speed", "wind speed while observer is moving"); + case QBluetoothUuid::ApparentWindDirection: return QBluetoothServiceDiscoveryAgent::tr("Apparent Wind Direction"); + case QBluetoothUuid::GustFactor: + return QBluetoothServiceDiscoveryAgent::tr("Gust Factor", "factor by which wind gust is stronger than average wind"); + case QBluetoothUuid::PollenConcentration: return QBluetoothServiceDiscoveryAgent::tr("Pollen Concentration"); + case QBluetoothUuid::UVIndex: return QBluetoothServiceDiscoveryAgent::tr("UV Index"); + case QBluetoothUuid::Irradiance: return QBluetoothServiceDiscoveryAgent::tr("Irradiance"); + case QBluetoothUuid::Rainfall: return QBluetoothServiceDiscoveryAgent::tr("Rainfall"); + case QBluetoothUuid::WindChill: return QBluetoothServiceDiscoveryAgent::tr("Wind Chill"); + case QBluetoothUuid::HeatIndex: return QBluetoothServiceDiscoveryAgent::tr("Heat Index"); + case QBluetoothUuid::DewPoint: return QBluetoothServiceDiscoveryAgent::tr("Dew Point"); + case QBluetoothUuid::DescriptorValueChanged: + return QBluetoothServiceDiscoveryAgent::tr("Descriptor Value Changed", "Environmental sensing related"); + case QBluetoothUuid::AerobicHeartRateLowerLimit: + return QBluetoothServiceDiscoveryAgent::tr("Aerobic Heart Rate Lower Limit"); + case QBluetoothUuid::AerobicHeartRateUpperLimit: + return QBluetoothServiceDiscoveryAgent::tr("Aerobic Heart Rate Upper Limit"); + case QBluetoothUuid::AerobicThreshold: return QBluetoothServiceDiscoveryAgent::tr("Aerobic Threshold"); + case QBluetoothUuid::Age: return QBluetoothServiceDiscoveryAgent::tr("Age", "age of person"); + case QBluetoothUuid::AnaerobicHeartRateLowerLimit: + return QBluetoothServiceDiscoveryAgent::tr("Anaerobic Heart Rate Lower Limit"); + case QBluetoothUuid::AnaerobicHeartRateUpperLimit: + return QBluetoothServiceDiscoveryAgent::tr("Anaerobic Heart Rate Upper Limit"); + case QBluetoothUuid::AnaerobicThreshold: return QBluetoothServiceDiscoveryAgent::tr("Anaerobic Threshold"); + case QBluetoothUuid::DateOfBirth: return QBluetoothServiceDiscoveryAgent::tr("Date Of Birth"); + case QBluetoothUuid::DateOfThresholdAssessment: return QBluetoothServiceDiscoveryAgent::tr("Date Of Threshold Assessment"); + case QBluetoothUuid::EmailAddress: return QBluetoothServiceDiscoveryAgent::tr("Email Address"); + case QBluetoothUuid::FatBurnHeartRateLowerLimit: + return QBluetoothServiceDiscoveryAgent::tr("Fat Burn Heart Rate Lower Limit"); + case QBluetoothUuid::FatBurnHeartRateUpperLimit: + return QBluetoothServiceDiscoveryAgent::tr("Fat Burn Heart Rate Upper Limit"); + case QBluetoothUuid::FirstName: return QBluetoothServiceDiscoveryAgent::tr("First Name"); + case QBluetoothUuid::FiveZoneHeartRateLimits: return QBluetoothServiceDiscoveryAgent::tr("5-Zone Heart Rate Limits"); + case QBluetoothUuid::Gender: return QBluetoothServiceDiscoveryAgent::tr("Gender"); + case QBluetoothUuid::HeartRateMax: return QBluetoothServiceDiscoveryAgent::tr("Heart Rate Maximum"); + case QBluetoothUuid::Height: return QBluetoothServiceDiscoveryAgent::tr("Height", "of a person"); + case QBluetoothUuid::HipCircumference: return QBluetoothServiceDiscoveryAgent::tr("Hip Circumference"); + case QBluetoothUuid::LastName: return QBluetoothServiceDiscoveryAgent::tr("Last Name"); + case QBluetoothUuid::MaximumRecommendedHeartRate: + return QBluetoothServiceDiscoveryAgent::tr("Maximum Recommended Heart Rate"); + case QBluetoothUuid::RestingHeartRate: return QBluetoothServiceDiscoveryAgent::tr("Resting Heart Rate"); + case QBluetoothUuid::SportTypeForAerobicAnaerobicThresholds: + return QBluetoothServiceDiscoveryAgent::tr("Sport Type For Aerobic/Anaerobic Thresholds"); + case QBluetoothUuid::ThreeZoneHeartRateLimits: return QBluetoothServiceDiscoveryAgent::tr("3-Zone Heart Rate Limits"); + case QBluetoothUuid::TwoZoneHeartRateLimits: return QBluetoothServiceDiscoveryAgent::tr("2-Zone Heart Rate Limits"); + case QBluetoothUuid::VO2Max: return QBluetoothServiceDiscoveryAgent::tr("Oxygen Uptake"); + case QBluetoothUuid::WaistCircumference: return QBluetoothServiceDiscoveryAgent::tr("Waist Circumference"); + case QBluetoothUuid::Weight: return QBluetoothServiceDiscoveryAgent::tr("Weight"); + case QBluetoothUuid::DatabaseChangeIncrement: + return QBluetoothServiceDiscoveryAgent::tr("Database Change Increment", "Environmental sensing related"); + case QBluetoothUuid::UserIndex: return QBluetoothServiceDiscoveryAgent::tr("User Index"); + case QBluetoothUuid::BodyCompositionFeature: return QBluetoothServiceDiscoveryAgent::tr("Body Composition Feature"); + case QBluetoothUuid::BodyCompositionMeasurement: return QBluetoothServiceDiscoveryAgent::tr("Body Composition Measurement"); + case QBluetoothUuid::WeightMeasurement: return QBluetoothServiceDiscoveryAgent::tr("Weight Measurement"); + case QBluetoothUuid::UserControlPoint: return QBluetoothServiceDiscoveryAgent::tr("User Control Point"); + case QBluetoothUuid::MagneticFluxDensity2D: return QBluetoothServiceDiscoveryAgent::tr("Magnetic Flux Density 2D"); + case QBluetoothUuid::MagneticFluxDensity3D: return QBluetoothServiceDiscoveryAgent::tr("Magnetic Flux Density 3D"); + case QBluetoothUuid::Language: return QBluetoothServiceDiscoveryAgent::tr("Language"); + case QBluetoothUuid::BarometricPressureTrend: return QBluetoothServiceDiscoveryAgent::tr("Barometric Pressure Trend"); default: break; } @@ -982,7 +1056,7 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) Returns a human-readable and translated name for the given descriptor type represented by \a uuid. - \sa QBluetoothUuid::CharacteristicType + \sa QBluetoothUuid::DescriptorType \since 5.4 */ @@ -1007,6 +1081,12 @@ QString QBluetoothUuid::descriptorToString(QBluetoothUuid::DescriptorType uuid) return QBluetoothServiceDiscoveryAgent::tr("External Report Reference"); case QBluetoothUuid::ReportReference: return QBluetoothServiceDiscoveryAgent::tr("Report Reference"); + case QBluetoothUuid::EnvironmentalSensingConfiguration: + return QBluetoothServiceDiscoveryAgent::tr("Environmental Sensing Configuration"); + case QBluetoothUuid::EnvironmentalSensingMeasurement: + return QBluetoothServiceDiscoveryAgent::tr("Environmental Sensing Measurement"); + case QBluetoothUuid::EnvironmentalSensingTriggerSetting: + return QBluetoothServiceDiscoveryAgent::tr("Environmental Sensing Trigger Setting"); default: break; } -- cgit v1.2.3 From 3ff29159e8ca3deb2705aea92f673e0ea51c2aaa Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 5 Dec 2014 10:56:02 +0100 Subject: QBluetoothDeviceDiscoveryAgent - timeout on OS X/iOS On OS X we have to first make Classic device scan and then LE device scan. Shorten Classic discovery from 20s to 15s. Change-Id: I653b2d9f6c911bdf09c900735273bd6d1e95b078 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtdeviceinquiry.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/osx/osxbtdeviceinquiry.mm b/src/bluetooth/osx/osxbtdeviceinquiry.mm index 61ab116c..c07a0671 100644 --- a/src/bluetooth/osx/osxbtdeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtdeviceinquiry.mm @@ -77,7 +77,7 @@ using namespace QT_NAMESPACE; if (m_inquiry) { // TODO: something more reasonable required! - [m_inquiry setInquiryLength:20]; + [m_inquiry setInquiryLength:15]; [m_inquiry setUpdateNewDeviceNames:NO];//Useless, disable! m_delegate = delegate; } else { -- cgit v1.2.3 From 228b54c723a2f05e493eab6b67dece29ab7de687 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 5 Dec 2014 10:58:47 +0100 Subject: Bluetooth example - lowenergyscanner (OS X and iOS) Core Bluetooth hides addresses and uses unique UUIDs instead. This patch updates/adjusts lowenergyscanner example to work with UUIDs on iOS and OS X instead of (empty on these platforms) device addresses. Change-Id: Iad0b35250f434b736616fe60e356f2088e6dc279 Reviewed-by: Alex Blasche --- examples/bluetooth/lowenergyscanner/device.cpp | 6 ++++++ examples/bluetooth/lowenergyscanner/device.h | 1 + examples/bluetooth/lowenergyscanner/deviceinfo.cpp | 8 ++++++++ 3 files changed, 15 insertions(+) diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index 0891f040..7ba27ad1 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -138,6 +138,7 @@ QString Device::getUpdate() void Device::scanServices(const QString &address) { // We need the current device for service discovery. + for (int i = 0; i < devices.size(); i++) { if (((DeviceInfo*)devices.at(i))->getAddress() == address ) currentDevice.setDevice(((DeviceInfo*)devices.at(i))->getDevice()); @@ -157,7 +158,12 @@ void Device::scanServices(const QString &address) setUpdate("Back\n(Connecting to device...)"); +#ifdef Q_OS_MAC + if (controller && m_previousAddress != currentDevice.getAddress()) { + m_previousAddress = currentDevice.getAddress(); +#else if (controller && controller->remoteAddress() != currentDevice.getDevice().address()) { +#endif controller->disconnectFromDevice(); delete controller; controller = 0; diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h index a12f9e0e..756209da 100644 --- a/examples/bluetooth/lowenergyscanner/device.h +++ b/examples/bluetooth/lowenergyscanner/device.h @@ -119,6 +119,7 @@ private: QList devices; QList m_services; QList m_characteristics; + QString m_previousAddress; QString m_message; bool connected; QLowEnergyController *controller; diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp index d6b7a734..d774cb22 100644 --- a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp @@ -39,6 +39,8 @@ ** ****************************************************************************/ +#include + #include "deviceinfo.h" DeviceInfo::DeviceInfo() @@ -52,7 +54,13 @@ DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &d) QString DeviceInfo::getAddress() const { +#ifdef Q_OS_MAC + // On OS X and iOS we do not have addresses, + // only unique UUIDs generated by Core Bluetooth. + return device.deviceUuid().toString(); +#else return device.address().toString(); +#endif } QString DeviceInfo::getName() const -- cgit v1.2.3 From 9856b182bb43ff36266e63027f18f67a0ce244ea Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 5 Dec 2014 13:11:55 +0100 Subject: Cleanup Bluetooth Java code These points were raised by Android-studio's Code analyzer Change-Id: I5481b7ca74ec902b289a71096879e32301ee6494 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java | 12 +++++++----- .../qt5/android/bluetooth/QtBluetoothInputStreamThread.java | 5 ++++- .../org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java | 6 +++--- .../qt5/android/bluetooth/QtBluetoothSocketServer.java | 11 +++++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java index f12e68fa..c8453a0b 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java @@ -40,7 +40,7 @@ import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; + import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashSet; @@ -49,7 +49,9 @@ import java.util.List; public class QtBluetoothBroadcastReceiver extends BroadcastReceiver { /* Pointer to the Qt object that "owns" the Java object */ + @SuppressWarnings("WeakerAccess") long qtObject = 0; + @SuppressWarnings("WeakerAccess") static Activity qtactivity = null; private static final int TURN_BT_ON = 3330; @@ -158,11 +160,11 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver //process found remote connections but avoid duplications HashSet set = new HashSet(); - for (int i = 0; i < gattConnections.size(); i++) - set.add(gattConnections.get(i).toString()); + for (Object gattConnection : gattConnections) + set.add(gattConnection.toString()); - for (int i = 0; i < gattServerConnections.size(); i++) - set.add(gattServerConnections.get(i).toString()); + for (Object gattServerConnection : gattServerConnections) + set.add(gattServerConnection.toString()); return set.toArray(new String[set.size()]); } catch (Exception ex) { diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java index 30ada8c9..455054a8 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java @@ -37,10 +37,13 @@ import java.io.InputStream; import java.io.IOException; import android.util.Log; +@SuppressWarnings("WeakerAccess") public class QtBluetoothInputStreamThread extends Thread { /* Pointer to the Qt object that "owns" the Java object */ + @SuppressWarnings("CanBeFinal") long qtObject = 0; + @SuppressWarnings("CanBeFinal") public boolean logEnabled = false; private static final String TAG = "QtBluetooth"; private InputStream m_inputStream = null; @@ -68,7 +71,7 @@ public class QtBluetoothInputStreamThread extends Thread } byte[] buffer = new byte[1000]; - int bytesRead = 0; + int bytesRead; try { while (!isInterrupted()) { diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index b9f7e184..10aaf9ca 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -45,7 +45,6 @@ import android.bluetooth.BluetoothProfile; import android.util.Log; import java.util.ArrayList; -import java.util.Arrays; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; @@ -58,7 +57,7 @@ public class QtBluetoothLE { private BluetoothGatt mBluetoothGatt = null; private String mRemoteGattAddress; - final UUID clientCharacteristicUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); + private final UUID clientCharacteristicUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); /* Pointer to the Qt object that "owns" the Java object */ @@ -67,6 +66,7 @@ public class QtBluetoothLE { @SuppressWarnings("WeakerAccess") Activity qtactivity = null; + @SuppressWarnings("WeakerAccess") public QtBluetoothLE() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } @@ -917,7 +917,7 @@ public class QtBluetoothLE { /* For some reason, Android splits characteristic notifications into two operations. BluetoothGatt.enableCharacteristicNotification - ensures the local Blueooth stack forwards the notifications. In addition, + ensures the local Bluetooth stack forwards the notifications. In addition, BluetoothGattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE) must be written to the peripheral. */ diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java index ae0a03a5..1b1aaac9 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java @@ -40,11 +40,14 @@ import android.util.Log; import java.io.IOException; import java.util.UUID; +@SuppressWarnings("WeakerAccess") public class QtBluetoothSocketServer extends Thread { /* Pointer to the Qt object that "owns" the Java object */ + @SuppressWarnings({"WeakerAccess", "CanBeFinal"}) long qtObject = 0; + @SuppressWarnings({"WeakerAccess", "CanBeFinal"}) public boolean logEnabled = false; private static final String TAG = "QtBluetooth"; @@ -54,9 +57,9 @@ public class QtBluetoothSocketServer extends Thread private BluetoothServerSocket m_serverSocket = null; //error codes - public static final int QT_NO_BLUETOOTH_SUPPORTED = 0; - public static final int QT_LISTEN_FAILED = 1; - public static final int QT_ACCEPT_FAILED = 2; + private static final int QT_NO_BLUETOOTH_SUPPORTED = 0; + private static final int QT_LISTEN_FAILED = 1; + private static final int QT_ACCEPT_FAILED = 2; public QtBluetoothSocketServer() { @@ -97,7 +100,7 @@ public class QtBluetoothSocketServer extends Thread return; } - BluetoothSocket s = null; + BluetoothSocket s; if (m_serverSocket != null) { try { while (!isInterrupted()) { -- cgit v1.2.3 From 1a7e79849ec0575d09231cfac3e7ea453f2fe932 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 5 Dec 2014 14:40:58 +0100 Subject: QLowEnergyController - localAddress (OS X) On OS X QLowEnergyController can return the valid local address, even if it was constructed without this parameter. Change-Id: I40252a9f1f64506ae23d6dfe1e61fc786e895860 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_osx.mm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index cde11f67..2983705e 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -141,7 +141,6 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl "QBluetoothLowEnergyControllerPrivateOSX(), " "failed to initialize central manager"; } - } QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyController *q, @@ -723,7 +722,10 @@ QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddres : QObject(parent), d_ptr(new QLowEnergyControllerPrivateOSX(this)) { - Q_UNUSED(remoteAddress) + OSX_D_PTR; + + osx_d_ptr->remoteAddress = remoteAddress; + osx_d_ptr->localAddress = QBluetoothLocalDevice().address(); qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " "construction with remote address is not supported!"; @@ -734,6 +736,9 @@ QLowEnergyController::QLowEnergyController(const QBluetoothDeviceInfo &remoteDev : QObject(parent), d_ptr(new QLowEnergyControllerPrivateOSX(this, remoteDevice)) { + OSX_D_PTR; + + osx_d_ptr->localAddress = QBluetoothLocalDevice().address(); // That's the only "real" ctor - with Core Bluetooth we need a _valid_ deviceUuid // from 'remoteDevice'. } -- cgit v1.2.3 From 776f23147a90f8d9c394a00574d365fec57ff904 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 5 Dec 2014 14:54:08 +0100 Subject: QLowEnergyController - remove debug messages (OS X, iOS) Remove debug messages from OSXBTCentralManager. Change-Id: I980ffac49453b670fa93d4ddfb0e621e29dff4f3 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 733d73a6..5c4a5c87 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -612,8 +612,6 @@ using namespace QT_NAMESPACE; // TODO: check what happens if I'm using NSData with length 0. if (request.withResponse) { - NSLog(@"trying to write %@", data.data()); - NSLog(@"initial value: %@", ch.value); writePending = true; [peripheral writeValue:data.data() forCharacteristic:ch type:CBCharacteristicWriteWithResponse]; @@ -1386,7 +1384,6 @@ using namespace QT_NAMESPACE; const QLowEnergyHandle cHandle = charMap.key(characteristic); Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", "invalid handle, not found in the characteristics map"); - NSLog(@"characteristic written, the value is %@", characteristic.value); delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); } -- cgit v1.2.3 From dfc0a00c4fdde773e4e8154a8b51488fd10831d0 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 5 Dec 2014 18:48:55 +0100 Subject: QLowEnergyController - bug fixes (OS X, iOS) Several problems found by qlowenergycontroller auto test: - Core Bluetooth in its didWriteCharacteristicValue callback does not have this new updated value, but the old one, to avoid additional characteristic read I have to cache this value in writeCharacteristic and report it later from the callback as it's already done for client characteristic configuration. - writeDescriptor with state != ServiceDiscovered (can happen after disconnectFromDevice) should set an error. - setNotifyValue did not check that value has the wrong length ( > 2 bytes) - this also should be an error. - Fix a key mismatch - in setNotifyValue remember descrptor's handle, not the characteristic's handle. - Remove annoying qCWarnings from didUpdateNotifyValue - it happens very often that we set this value in 'automatic' mode, without 'writeDescriptor' request. Change-Id: If3955f0e1364587b96403d23f2f8da28e6723e87 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 58 ++++++++++++++++++++++++------- src/bluetooth/qlowenergycontroller_osx.mm | 12 +++++++ src/bluetooth/qlowenergyservice_osx.mm | 13 +++---- 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 5c4a5c87..df1a8b53 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -587,7 +587,14 @@ using namespace QT_NAMESPACE; Q_ASSERT_X(ch, "-performNextWriteRequest", "invalid characteristic (nil)"); if (request.isClientConfiguration) { - if (valuesToWrite.remove(request.handle)) { + const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); + CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:ch]; + Q_ASSERT_X(descriptor, "-performNextWriteRequest:, ", + "notification on a characteristic without " + "client characteristic configuration descriptor"); + const QLowEnergyHandle dHandle = descMap.key(descriptor);// 0 if descriptor is nil or unknown. + + if (valuesToWrite.remove(dHandle)) { // It can happen if something went wrong - we // tried to set notification value and never received // a callback. @@ -597,7 +604,8 @@ using namespace QT_NAMESPACE; "descriptor, replacing it"; } // We save the original value to report it later ... - valuesToWrite[request.handle] = request.value; + + valuesToWrite[dHandle] = request.value; const bool enable = request.value[0] & 3; writePending = true; [peripheral setNotifyValue:enable forCharacteristic:ch]; @@ -612,6 +620,16 @@ using namespace QT_NAMESPACE; // TODO: check what happens if I'm using NSData with length 0. if (request.withResponse) { + if (valuesToWrite.remove(request.handle)) { + qCDebug(QT_BT_OSX) << "-performNextWriteRequest:, " + "valuesToWrite already contains " + "a value for a characteristic " + << request.handle + << ", replacing it"; + } + + valuesToWrite[request.handle] = request.value; + writePending = true; [peripheral writeValue:data.data() forCharacteristic:ch type:CBCharacteristicWriteWithResponse]; @@ -629,6 +647,8 @@ using namespace QT_NAMESPACE; { Q_ASSERT_X(charHandle, "-setNotifyValue:forCharacteristic:", "invalid characteristic handle (0)"); + Q_ASSERT_X(delegate, "-setNotifyValue:forCharacteristic:", + "invalid delegate (null)"); if (!charMap.contains(charHandle)) { qCWarning(QT_BT_OSX) << "-setNotifyValue:forCharacteristic:, " @@ -636,6 +656,16 @@ using namespace QT_NAMESPACE; return false; } + // At the moment we call setNotifyValue _only_ from 'writeDescriptor'; + // from Qt's API POV it's a descriptor write oprtation and we must report + // it back, so check _now_ that we really have this descriptor. + const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); + if (![self descriptor:qtUuid forCharacteristic:charMap[charHandle]]) { + qCWarning(QT_BT_OSX) << "-setNotifyValue:forCharacteristic:, " + "no client characteristic configuration found"; + return false; + } + OSXBluetooth::LEWriteRequest request; request.isDescriptor = false; request.isClientConfiguration = true; @@ -1382,9 +1412,19 @@ using namespace QT_NAMESPACE; } else { // Keys are unique. const QLowEnergyHandle cHandle = charMap.key(characteristic); + const QByteArray valueToReport(valuesToWrite.value(cHandle, QByteArray())); + if (!valuesToWrite.remove(cHandle)) { + qCWarning(QT_BT_OSX) << "-peripheral:didWriteValueForCharacteristic:error:, " + "no characteristic value found"; + } + Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", "invalid handle, not found in the characteristics map"); - delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); + + if (!valueToReport.isNull()) + delegate->characteristicWriteNotification(cHandle, valueToReport); + else + delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); } [self performNextWriteRequest]; @@ -1444,14 +1484,7 @@ using namespace QT_NAMESPACE; const QLowEnergyHandle dHandle = descMap.key(descriptor);// 0 if descriptor is nil or unknown. const QByteArray valueToReport(valuesToWrite.value(dHandle, QByteArray())); - if (!valuesToWrite.remove(dHandle)) { - // In future it can be a special case: we can, in principle, - // set notify value on a characteristic without 'writeDescriptor'. - // It can also be some error. Right now we report it as error, can change. - qCWarning(QT_BT_OSX) << "-peripheral:didUpdateNotificationStateForCharacteristic:, " - "setNotifyValue called, but no client characteristic descriptor " - "found or no writeDescriptor call"; - } + valuesToWrite.remove(dHandle); if (error) { // NSLog to log the actual NSError: @@ -1464,11 +1497,12 @@ using namespace QT_NAMESPACE; if (!valueToReport.isNull()) { delegate->descriptorWriteNotification(dHandle, valueToReport); } else { - // TODO: can we in future have another way to set notify value without writeDescriptor? + /* qCWarning(QT_BT_OSX) << "-peripheral:didUpdateNotificationStateForCharacteristic:, " "notification value set to " << int(characteristic.isNotifying) << " but no client characteristic configuration descriptor found" "or no previous writeDescriptor request found"; + */ } } diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 2983705e..ad35d45f 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -530,6 +530,18 @@ void QLowEnergyControllerPrivateOSX::setNotifyValue(QSharedPointer 2) { + // Qt's API requires an error on such write. + // With Core Bluetooth we do not write any descriptor, + // but instead call a special method. So it's better to + // intercept wrong data size here: + qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " + "client characteristic configuration descriptor " + "is 2 octets, but value size is: " << newValue.size(); + service->setError(QLowEnergyService::DescriptorWriteError); + return; + } + if (!discoveredServices.contains(service->uuid)) { qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " "no service with uuid: " << service->uuid << " found"; diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index cb1c1f30..2e961c0c 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -184,15 +184,13 @@ void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, if (!contains(ch)) return; - if (state() != ServiceDiscovered) { + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + + if (state() != ServiceDiscovered || !controller) { d_ptr->setError(QLowEnergyService::OperationError); return; } - QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (!controller) - return; - // Don't write if properties don't permit it if (mode == WriteWithResponse && (ch.properties() & QLowEnergyCharacteristic::Write)) controller->writeCharacteristic(ch.d_ptr, ch.attributeHandle(), newValue, true); @@ -227,10 +225,7 @@ void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, return; QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (!controller) - return; - - if (state() != ServiceDiscovered) { + if (state() != ServiceDiscovered || !controller) { d_ptr->setError(OperationError); return; } -- cgit v1.2.3 From 95e5647cf4b825b8bb86b76925aead7b554795d8 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 8 Dec 2014 10:08:09 +0100 Subject: QLowEnergyConttroller - char/descriptor values (OS X/iOS) While writing with response, Core Bluetooth does not update characteristic/descriptor values in write notifications. I have to 'cache' this values and report them back. Also this patch fixes minor bugs in '-performNextWriteRequest': while handling errors it's not enough just to call 'performNextWriteRequest:' again, it must be in return statement or followed by 'return'. Change-Id: I6e7ab7fe6f63ea84268bf6c7ea67e2939d524f91 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 174 +++++++++++++++++------------- src/bluetooth/osx/osxbtcentralmanager_p.h | 16 ++- 2 files changed, 108 insertions(+), 82 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index df1a8b53..323a10cb 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -112,7 +112,7 @@ using namespace QT_NAMESPACE; startingFrom:(CBDescriptor *)descriptor; - (CBDescriptor *)descriptor:(const QBluetoothUuid &)dUuid forCharacteristic:(CBCharacteristic *)ch; -// TODO: check _what_ exactly I have to reset ... +- (bool)cacheWriteValue:(const QByteArray &)value for:(NSObject *)obj; - (void)reset; @end @@ -556,8 +556,7 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(peripheral, "-performNextWriteRequest", - "invalid peripheral (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); if (writePending || !writeQueue.size()) return; @@ -566,75 +565,67 @@ using namespace QT_NAMESPACE; if (request.isDescriptor) { if (!descMap.contains(request.handle)) { - qCWarning(QT_BT_OSX) << "-performNextWriteRequest, descriptor with " - "handle: " << request.handle << " not found"; - [self performNextWriteRequest]; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " handle: " + << request.handle << " not found"; + return [self performNextWriteRequest]; } - CBDescriptor *const d = descMap[request.handle]; + CBDescriptor *const descriptor = descMap[request.handle]; ObjCStrongReference data(data_from_bytearray(request.value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << "-write:descHandle:, failed " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " failed " "to allocate an NSData object"; - [self performNextWriteRequest]; + return [self performNextWriteRequest]; } + if (![self cacheWriteValue:request.value for:descriptor]) + return [self performNextWriteRequest]; + writePending = true; - return [peripheral writeValue:data.data() forDescriptor:d]; + return [peripheral writeValue:data.data() forDescriptor:descriptor]; } else { - CBCharacteristic *const ch = charMap[request.handle]; - Q_ASSERT_X(ch, "-performNextWriteRequest", "invalid characteristic (nil)"); + if (!charMap.contains(request.handle)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " characteristic with " + "handle: " << request.handle << " not found"; + return [self performNextWriteRequest]; + } + + CBCharacteristic *const characteristic = charMap[request.handle]; if (request.isClientConfiguration) { const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); - CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:ch]; - Q_ASSERT_X(descriptor, "-performNextWriteRequest:, ", - "notification on a characteristic without " - "client characteristic configuration descriptor"); - const QLowEnergyHandle dHandle = descMap.key(descriptor);// 0 if descriptor is nil or unknown. - - if (valuesToWrite.remove(dHandle)) { - // It can happen if something went wrong - we - // tried to set notification value and never received - // a callback. - qCDebug(QT_BT_OSX) << "-performNextWriteRequest:, " - "valuesToWrite already contains " - "a value for a given client configuration " - "descriptor, replacing it"; - } - // We save the original value to report it later ... + CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:characteristic]; + Q_ASSERT_X(descriptor, Q_FUNC_INFO, "no client characteristic " + "configuration descriptor found"); + + if (![self cacheWriteValue:request.value for:descriptor]) + return [self performNextWriteRequest]; + + bool enable = false; + if (request.value.size()) + enable = request.value[0] & 3; - valuesToWrite[dHandle] = request.value; - const bool enable = request.value[0] & 3; writePending = true; - [peripheral setNotifyValue:enable forCharacteristic:ch]; + [peripheral setNotifyValue:enable forCharacteristic:characteristic]; } else { ObjCStrongReference data(data_from_bytearray(request.value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << "-performNextWriteRequest, " - "failed to allocate NSData object"; - [self performNextWriteRequest]; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " failed to allocate NSData object"; + return [self performNextWriteRequest]; } // TODO: check what happens if I'm using NSData with length 0. if (request.withResponse) { - if (valuesToWrite.remove(request.handle)) { - qCDebug(QT_BT_OSX) << "-performNextWriteRequest:, " - "valuesToWrite already contains " - "a value for a characteristic " - << request.handle - << ", replacing it"; - } - - valuesToWrite[request.handle] = request.value; + if (![self cacheWriteValue:request.value for:characteristic]) + return [self performNextWriteRequest]; writePending = true; - [peripheral writeValue:data.data() forCharacteristic:ch + [peripheral writeValue:data.data() forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; } else { - [peripheral writeValue:data.data() forCharacteristic:ch + [peripheral writeValue:data.data() forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse]; [self performNextWriteRequest]; } @@ -938,6 +929,42 @@ using namespace QT_NAMESPACE; return descriptor; } +- (bool)cacheWriteValue:(const QByteArray &)value for:(NSObject *)obj +{ + Q_ASSERT_X(obj, "-cacheWriteValue:for:", "invalid object (nil)"); + + if ([obj isKindOfClass:[CBCharacteristic class]]) { + CBCharacteristic *const ch = static_cast(obj); + if (!charMap.key(ch)) { + qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, unexpected " + "characteristic, no handle found"; + return false; + } + } else if ([obj isKindOfClass:[CBDescriptor class]]) { + CBDescriptor *const d = static_cast(obj); + if (!descMap.key(d)) { + qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, unexpected " + "descriptor, no handle found"; + return false; + } + } else { + qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, invalid object, " + "characteristic or descriptor required"; + return false; + } + + if (valuesToWrite.contains(obj)) { + // It can be a result of some previous errors - for example, + // we never got a callback from a previous write. + qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, valuesToWrite " + "already has a cached value for this " + "object, the value will be replaced"; + } + + valuesToWrite[obj] = value; + return true; +} + - (void)reset { writePending = false; @@ -1401,6 +1428,14 @@ using namespace QT_NAMESPACE; Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", "invalid delegate (null)"); + + // Error or not, but the cached value has to be deleted ... + const QByteArray valueToReport(valuesToWrite.value(characteristic, QByteArray())); + if (!valuesToWrite.remove(characteristic)) { + qCWarning(QT_BT_OSX) << "-peripheral:didWriteValueForCharacteristic:error:, " + "no updated value found for for characteristic"; + } + if (error) { // Use NSLog to log the actual error: NSLog(@"-peripheral:didWriteValueForCharacteristic:error:, failed with error: %@", @@ -1412,19 +1447,10 @@ using namespace QT_NAMESPACE; } else { // Keys are unique. const QLowEnergyHandle cHandle = charMap.key(characteristic); - const QByteArray valueToReport(valuesToWrite.value(cHandle, QByteArray())); - if (!valuesToWrite.remove(cHandle)) { - qCWarning(QT_BT_OSX) << "-peripheral:didWriteValueForCharacteristic:error:, " - "no characteristic value found"; - } - Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", "invalid handle, not found in the characteristics map"); - if (!valueToReport.isNull()) - delegate->characteristicWriteNotification(cHandle, valueToReport); - else - delegate->characteristicWriteNotification(cHandle, qt_bytearray(characteristic.value)); + delegate->characteristicWriteNotification(cHandle, valueToReport); } [self performNextWriteRequest]; @@ -1436,6 +1462,8 @@ using namespace QT_NAMESPACE; { Q_UNUSED(aPeripheral) + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); + using namespace OSXBluetooth; QT_BT_MAC_AUTORELEASEPOOL; @@ -1444,21 +1472,24 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; + // Error or not, a value (if any) must be removed. + const QByteArray valueToReport(valuesToWrite.value(descriptor, QByteArray())); + if (!valuesToWrite.remove(descriptor)) + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " no updated value found"; + if (error) { // NSLog to log the actual NSError: - NSLog(@"-peripheral:didWriteValueForDescriptor:error:, failed with error %@", - error); + NSLog(@"%s, failed with error %@", Q_FUNC_INFO, error); // TODO: this error function is not good at all - it takes charHandle, // which is noop at the moment and ... we actually work with a descriptor handle // here. delegate->error(qt_uuid(descriptor.characteristic.service.UUID), 0, QLowEnergyService::DescriptorWriteError); } else { - // We know that keys are unique, so we can find a key for a given descriptor. const QLowEnergyHandle dHandle = descMap.key(descriptor); - Q_ASSERT_X(dHandle, "-peripheral:didWriteValueForDescriptor:error:", - "invalid descriptor, not found in the descriptors map"); - delegate->descriptorWriteNotification(dHandle, qt_bytearray(static_cast(descriptor.value))); + Q_ASSERT_X(dHandle, Q_FUNC_INFO, + "descriptor not found in the descriptors map"); + delegate->descriptorWriteNotification(dHandle, valueToReport); } [self performNextWriteRequest]; @@ -1476,32 +1507,29 @@ using namespace QT_NAMESPACE; writePending = false; - Q_ASSERT_X(delegate, "-peripheral:didUpdateNotificationStateForCharacteristic:", - "invalid delegate (nil)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (nil)"); const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:characteristic]; - const QLowEnergyHandle dHandle = descMap.key(descriptor);// 0 if descriptor is nil or unknown. - const QByteArray valueToReport(valuesToWrite.value(dHandle, QByteArray())); - - valuesToWrite.remove(dHandle); + const QByteArray valueToReport(valuesToWrite.value(descriptor, QByteArray())); + const int nRemoved = valuesToWrite.remove(descriptor); if (error) { // NSLog to log the actual NSError: - NSLog(@"-peripheral:didUpdateNotificationStateForCharacteristic:, failed with error %@", - error); + NSLog(@"%s:, failed with error %@", Q_FUNC_INFO, error); delegate->error(qt_uuid(characteristic.service.UUID), 0, // In Qt's API it's a descriptor write actually. QLowEnergyService::DescriptorWriteError); } else { - if (!valueToReport.isNull()) { + if (nRemoved) { + const QLowEnergyHandle dHandle = descMap.key(descriptor); delegate->descriptorWriteNotification(dHandle, valueToReport); } else { /* - qCWarning(QT_BT_OSX) << "-peripheral:didUpdateNotificationStateForCharacteristic:, " - "notification value set to " << int(characteristic.isNotifying) + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "notification value set to " + << int(characteristic.isNotifying) << " but no client characteristic configuration descriptor found" - "or no previous writeDescriptor request found"; + " or no previous writeDescriptor request found"; */ } } diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 6d93816f..704053c6 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -138,15 +138,13 @@ struct LEWriteRequest typedef QQueue WriteQueue; -// It can happen that Qt's API wants to write something -// and expects the confirmation about this value written, -// but under the hood (Core Bluetooth) we have something like -// a special method without any values at all. -// To report our user a successful write, we have this map: -// handle -> value for a write operation. -// Since write operations are serialized, the key is guaranteed -// to be unique. -typedef QHash ValueHash; +// Core Bluetooth's write confirmation does not provide +// the updated value (characteristic or descriptor). +// But the Qt's Bluetooth API ('write with response') +// expects this updated value as a response, so we have +// to cache this write value and report it back. +// 'NSObject *' will require '__weak' with ARC. +typedef QHash ValueHash; } -- cgit v1.2.3 From 6370e1cb361f8daf118bd109752abfb691736cb0 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 8 Dec 2014 14:27:53 +0100 Subject: QLowEnergyController/CentralManager - cleanup (OS X/iOS) Get rid of all 'hand-written' function/method signatures in qCWarnings and Q_ASSERTS, use Q_FUNC_INFO instead. Fix error function for characteristic/descriptor write errors - remove unused parameter. Change-Id: I4f3f7c6c6a06802135f47a4b5cbb7c4313af4f34 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 320 +++++++++++------------------ src/bluetooth/osx/osxbtcentralmanager_p.h | 3 +- src/bluetooth/qlowenergycontroller_osx.mm | 138 ++++++------- src/bluetooth/qlowenergycontroller_osx_p.h | 1 - 4 files changed, 183 insertions(+), 279 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 323a10cb..2fc74e36 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -65,7 +65,7 @@ NSUInteger qt_countGATTEntries(CBService *service) // No checks if NSUInteger is big enough :) // Let's assume such number of entries is not possible :) - Q_ASSERT_X(service, "qt_countGATTEntries", "invalid service (nil)"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); QT_BT_MAC_AUTORELEASEPOOL; @@ -121,7 +121,7 @@ using namespace QT_NAMESPACE; - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::CentralManagerDelegate *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithDelegate:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { manager = nil; @@ -159,8 +159,8 @@ using namespace QT_NAMESPACE; - (QLowEnergyController::Error)connectToDevice:(const QBluetoothUuid &)aDeviceUuid { - Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, "-connectToDevice", - "invalid state"); // QLowEnergyController connects only if in UnconnectedState. + Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, + Q_FUNC_INFO, "invalid state"); deviceUuid = aDeviceUuid; @@ -169,7 +169,7 @@ using namespace QT_NAMESPACE; manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; if (!manager) { managerState = OSXBluetooth::CentralManagerIdle; - qCWarning(QT_BT_OSX) << "-connectToDevice:, failed to allocate a " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate a " "central manager"; return QLowEnergyController::ConnectionError; } @@ -181,12 +181,12 @@ using namespace QT_NAMESPACE; - (QLowEnergyController::Error)connectToDevice { - Q_ASSERT_X(manager, "-connectToDevice", "invalid central manager (nil)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid central manager (nil)"); Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, - "-connectToDevice", "invalid state"); + Q_FUNC_INFO, "invalid state"); if ([self isConnected]) { - qCDebug(QT_BT_OSX) << "-connectToDevice, already connected"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "already connected"; delegate->connectSuccess(); return QLowEnergyController::NoError; } else if (peripheral) { @@ -201,7 +201,7 @@ using namespace QT_NAMESPACE; // Retrieve a peripheral first ... ObjCScopedPointer uuids([[NSMutableArray alloc] init]); if (!uuids) { - qCWarning(QT_BT_OSX) << "-connectToDevice, failed to allocate identifiers"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate identifiers"; return QLowEnergyController::ConnectionError; } @@ -212,7 +212,7 @@ using namespace QT_NAMESPACE; std::copy(qtUuidData.data, qtUuidData.data + 16, uuidData); const ObjCScopedPointer nsUuid([[NSUUID alloc] initWithUUIDBytes:uuidData]); if (!nsUuid) { - qCWarning(QT_BT_OSX) << "-connectToDevice, failed to allocate NSUUID identifier"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate NSUUID identifier"; return QLowEnergyController::ConnectionError; } @@ -222,7 +222,7 @@ using namespace QT_NAMESPACE; QT_BT_MAC_AUTORELEASEPOOL; NSArray *const peripherals = [manager retrievePeripheralsWithIdentifiers:uuids]; if (!peripherals || peripherals.count != 1) { - qCWarning(QT_BT_OSX) << "-connectToDevice, failed to retrive a peripheral"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to retrive a peripheral"; return QLowEnergyController::UnknownRemoteDeviceError; } @@ -233,7 +233,7 @@ using namespace QT_NAMESPACE; #else OSXBluetooth::CFStrongReference cfUuid(OSXBluetooth::cf_uuid(deviceUuid)); if (!cfUuid) { - qCWarning(QT_BT_OSX) << "-connectToDevice:, failed to create CFUUID object"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to create CFUUID object"; return QLowEnergyController::ConnectionError; } // TODO: With ARC this cast will be illegal: @@ -248,17 +248,17 @@ using namespace QT_NAMESPACE; - (void)connectToPeripheral { - Q_ASSERT_X(manager, "-connectToPeripheral", "invalid central manager (nil)"); - Q_ASSERT_X(peripheral, "-connectToPeripheral", "invalid peripheral (nil)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid central manager (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, - "-connectToPeripheral", "invalid state"); + Q_FUNC_INFO, "invalid state"); // The state is still the same - connecting. if ([self isConnected]) { - qCDebug(QT_BT_OSX) << "-connectToPeripheral, already connected"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "already connected"; delegate->connectSuccess(); } else { - qCDebug(QT_BT_OSX) << "-connectToPeripheral, trying to connect"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "trying to connect"; managerState = OSXBluetooth::CentralManagerConnecting; [manager connectPeripheral:peripheral options:nil]; } @@ -300,9 +300,9 @@ using namespace QT_NAMESPACE; - (void)discoverServices { - Q_ASSERT_X(peripheral, "-discoverServices", "invalid peripheral (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, - "-discoverServices", "invalid state"); + Q_FUNC_INFO, "invalid state"); // From Apple's docs: // @@ -321,17 +321,17 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(managerState == CentralManagerIdle, "-discoverIncludedServices", + Q_ASSERT_X(managerState == CentralManagerIdle, Q_FUNC_INFO, "invalid state"); - Q_ASSERT_X(manager, "-discoverIncludedServices", "invalid manager (nil)"); - Q_ASSERT_X(peripheral, "-discoverIncludedServices", "invalid peripheral (nil)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid manager (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); QT_BT_MAC_AUTORELEASEPOOL; NSArray *const services = peripheral.services; if (!services || !services.count) { // Actually, !services.count works in both cases, but ... // A peripheral without any services at all. - Q_ASSERT_X(delegate, "-discoverIncludedServices", + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->serviceDiscoveryFinished(ObjCStrongReference()); } else { @@ -356,16 +356,13 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - Q_ASSERT_X(managerState != CentralManagerUpdating, "-discoverServiceDetails:", - "invalid state"); - Q_ASSERT_X(!serviceUuid.isNull(), "-discoverServiceDetails:", - "invalid service UUID"); - Q_ASSERT_X(peripheral, "-discoverServiceDetailsl:", - "invalid peripheral (nil)"); + Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(!serviceUuid.isNull(), Q_FUNC_INFO, "invalid service UUID"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); if (servicesToDiscoverDetails.contains(serviceUuid)) { - qCWarning(QT_BT_OSX) << "-discoverServiceDetails: " - "already discovering for " << serviceUuid; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO <<"already discovering for " + << serviceUuid; return true; } @@ -377,8 +374,8 @@ using namespace QT_NAMESPACE; return true; } - qCWarning(QT_BT_OSX) << "-discoverServiceDetails:, invalid service - " - "unknown uuid " << serviceUuid; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown service uuid " + << serviceUuid; return false; } @@ -387,17 +384,17 @@ using namespace QT_NAMESPACE; { // This method does not change 'managerState', we can // have several 'detail discoveries' active. - Q_ASSERT_X(service, "-readCharacteristics:", "invalid service (nil)"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); using namespace OSXBluetooth; QT_BT_MAC_AUTORELEASEPOOL; - Q_ASSERT_X(managerState != CentralManagerUpdating, "-readCharacteristics:", + Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); - Q_ASSERT_X(manager, "-readCharacteristics:", "invalid manager (nil)"); - Q_ASSERT_X(peripheral, "-readCharacteristics:", "invalid peripheral (nil)"); - Q_ASSERT_X(delegate, "-readCharacteristics:", "invalid delegate (null)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid manager (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (!service.characteristics || !service.characteristics.count) return [self serviceDetailsDiscoveryFinished:service]; @@ -416,16 +413,16 @@ using namespace QT_NAMESPACE; { // This method does not change 'managerState', we can have // several discoveries active. - Q_ASSERT_X(service, "-discoverDescriptors:", "invalid service (nil)"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); using namespace OSXBluetooth; QT_BT_MAC_AUTORELEASEPOOL; - Q_ASSERT_X(managerState != CentralManagerUpdating, "-discoverDescriptors", - "invalid state"); - Q_ASSERT_X(manager, "-discoverDescriptors:", "invalid manager (nil)"); - Q_ASSERT_X(peripheral, "-discoverDescriptors:", "invalid peripheral (nil)"); + Q_ASSERT_X(managerState != CentralManagerUpdating, + Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid manager (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); if (!service.characteristics || !service.characteristics.count) { [self serviceDetailsDiscoveryFinished:service]; @@ -463,10 +460,8 @@ using namespace QT_NAMESPACE; - (void)serviceDetailsDiscoveryFinished:(CBService *)service { // - Q_ASSERT_X(service, "-serviceDetailsDiscoveryFinished:", - "invalid service (nil)"); - Q_ASSERT_X(delegate, "-serviceDetailsDiscoveryFinished:", - "invalid delegate (null)"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); using namespace OSXBluetooth; @@ -476,16 +471,13 @@ using namespace QT_NAMESPACE; servicesToDiscoverDetails.removeAll(serviceUuid); const NSUInteger nHandles = qt_countGATTEntries(service); - Q_ASSERT_X(nHandles, "-serviceDetailsDiscoveryFinished:", - "unexpected number of GATT entires"); + Q_ASSERT_X(nHandles, Q_FUNC_INFO, "unexpected number of GATT entires"); const QLowEnergyHandle maxHandle = std::numeric_limits::max(); if (nHandles >= maxHandle || lastValidHandle > maxHandle - nHandles) { // Well, that's unlikely :) But we must be sure. - qCWarning(QT_BT_OSX) << "-serviceDetailsDiscoveryFinished:", - "can not allocate more handles"; - // TODO: add more 'error' functions not to use fake handles (0)? - delegate->error(serviceUuid, 0, QLowEnergyService::OperationError); + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "can not allocate more handles"; + delegate->error(serviceUuid, QLowEnergyService::OperationError); return; } @@ -565,7 +557,7 @@ using namespace QT_NAMESPACE; if (request.isDescriptor) { if (!descMap.contains(request.handle)) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " handle: " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "handle: " << request.handle << " not found"; return [self performNextWriteRequest]; } @@ -574,7 +566,7 @@ using namespace QT_NAMESPACE; ObjCStrongReference data(data_from_bytearray(request.value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " failed " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed " "to allocate an NSData object"; return [self performNextWriteRequest]; } @@ -586,7 +578,7 @@ using namespace QT_NAMESPACE; return [peripheral writeValue:data.data() forDescriptor:descriptor]; } else { if (!charMap.contains(request.handle)) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " characteristic with " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "characteristic with " "handle: " << request.handle << " not found"; return [self performNextWriteRequest]; } @@ -612,7 +604,7 @@ using namespace QT_NAMESPACE; ObjCStrongReference data(data_from_bytearray(request.value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " failed to allocate NSData object"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate NSData object"; return [self performNextWriteRequest]; } @@ -636,14 +628,12 @@ using namespace QT_NAMESPACE; - (bool)setNotifyValue:(const QByteArray &)value forCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle { - Q_ASSERT_X(charHandle, "-setNotifyValue:forCharacteristic:", - "invalid characteristic handle (0)"); - Q_ASSERT_X(delegate, "-setNotifyValue:forCharacteristic:", - "invalid delegate (null)"); + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle (0)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (!charMap.contains(charHandle)) { - qCWarning(QT_BT_OSX) << "-setNotifyValue:forCharacteristic:, " - "unknown characteristic handle " << charHandle; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO + << "unknown characteristic handle " << charHandle; return false; } @@ -652,8 +642,8 @@ using namespace QT_NAMESPACE; // it back, so check _now_ that we really have this descriptor. const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); if (![self descriptor:qtUuid forCharacteristic:charMap[charHandle]]) { - qCWarning(QT_BT_OSX) << "-setNotifyValue:forCharacteristic:, " - "no client characteristic configuration found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO + << "no client characteristic configuration found"; return false; } @@ -677,13 +667,12 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(charHandle, "-write:charHandle:withResponse:", "invalid characteristic handle (0)"); + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle (0)"); QT_BT_MAC_AUTORELEASEPOOL; if (!charMap.contains(charHandle)) { - qCWarning(QT_BT_OSX) << "-write:charHandle:withResponse:, " - "characteristic: " << charHandle << " not found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "characteristic: " << charHandle << " not found"; return false; } @@ -699,39 +688,17 @@ using namespace QT_NAMESPACE; // write actually. If I have any problems with the order later, // I'll use performSelector afterDelay with some delay. return true; -/* - // Write without responce is not serialized - no way I can - // know about the write operation success/failure - and - // I will never perform the next write. - CBCharacteristic *const ch = charMap[charHandle]; - Q_ASSERT_X(ch, "-write:charHandle:withResponse:", "invalid characteristic (nil) for a give handle"); - Q_ASSERT_X(peripheral, "-write:charHandle:withResponse:", "invalid peripheral (nil)"); - - ObjCStrongReference data(data_from_bytearray(value)); - if (!data) { - // Even if qtData.size() == 0, we still need NSData object. - qCWarning(QT_BT_OSX) << "-write:charHandle:withResponse:, " - "failed to allocate NSData object"; - return false; - } - - // TODO: check what happens if I'm using NSData with length 0. - [peripheral writeValue:data.data() forCharacteristic:ch - type:CBCharacteristicWriteWithoutResponse]; - - return true;*/ } - (bool)write:(const QByteArray &)value descHandle:(QLowEnergyHandle)descHandle { using namespace OSXBluetooth; - Q_ASSERT_X(descHandle, "-write:descHandle:", - "invalid descriptor handle (0)"); + Q_ASSERT_X(descHandle, Q_FUNC_INFO, "invalid descriptor handle (0)"); if (!descMap.contains(descHandle)) { - qCWarning(QT_BT_OSX) << "-write:descHandle:, descriptor with " - "handle: " << descHandle << " not found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "handle: " + << descHandle << " not found"; return false; } @@ -754,10 +721,8 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(!qtUuid.isNull(), "-serviceForUUID:", - "invalid uuid"); - Q_ASSERT_X(peripheral, "-serviceForUUID:", - "invalid peripherla (nil)"); + Q_ASSERT_X(!qtUuid.isNull(), Q_FUNC_INFO, "invalid uuid"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); ObjCStrongReference toVisit([NSMutableArray arrayWithArray:peripheral.services], true); ObjCStrongReference toVisitNext([[NSMutableArray alloc] init], false); @@ -787,14 +752,10 @@ using namespace QT_NAMESPACE; - (CBCharacteristic *)nextCharacteristicForService:(CBService*)service startingFrom:(CBCharacteristic *)characteristic { - Q_ASSERT_X(service, "-nextCharacteristicForService:startingFrom:", - "invalid service (nil)"); - Q_ASSERT_X(characteristic, "-nextCharacteristicForService:startingFrom:", - "invalid characteristic (nil)"); - Q_ASSERT_X(service.characteristics, "-nextCharacteristicForService:startingFrom:", - "invalid service"); - Q_ASSERT_X(service.characteristics.count, "-nextCharacteristicForService:startingFrom:", - "invalid service"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); + Q_ASSERT_X(characteristic, Q_FUNC_INFO, "invalid characteristic (nil)"); + Q_ASSERT_X(service.characteristics, Q_FUNC_INFO, "invalid service"); + Q_ASSERT_X(service.characteristics.count, Q_FUNC_INFO, "invalid service"); QT_BT_MAC_AUTORELEASEPOOL; @@ -814,8 +775,7 @@ using namespace QT_NAMESPACE; } } - Q_ASSERT_X([cs objectAtIndex:0] == characteristic, - "-nextCharacteristicForService:startingFrom:", + Q_ASSERT_X([cs objectAtIndex:0] == characteristic, Q_FUNC_INFO, "characteristic was not found in service.characteristics"); return [cs objectAtIndex:1]; @@ -825,14 +785,10 @@ using namespace QT_NAMESPACE; startingFrom:(CBCharacteristic *)characteristic properties:(CBCharacteristicProperties)properties { - Q_ASSERT_X(service, "-nextCharacteristicForService:startingFrom:properties:", - "invalid service (nil)"); - Q_ASSERT_X(characteristic, "-nextCharacteristicForService:startingFrom:properties:", - "invalid characteristic (nil)"); - Q_ASSERT_X(service.characteristics, "-nextCharacteristicForService:startingFrom:properties:", - "invalid service"); - Q_ASSERT_X(service.characteristics.count, "-nextCharacteristicForService:startingFrom:properties:", - "invalid service"); + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); + Q_ASSERT_X(characteristic, Q_FUNC_INFO, "invalid characteristic (nil)"); + Q_ASSERT_X(service.characteristics, Q_FUNC_INFO, "invalid service"); + Q_ASSERT_X(service.characteristics.count, Q_FUNC_INFO, "invalid service"); QT_BT_MAC_AUTORELEASEPOOL; @@ -856,8 +812,7 @@ using namespace QT_NAMESPACE; } if (!index) { - Q_ASSERT_X([cs objectAtIndex:0] == characteristic, - "-nextCharacteristicForService:startingFrom:properties:", + Q_ASSERT_X([cs objectAtIndex:0] == characteristic, Q_FUNC_INFO, "characteristic not found in service.characteristics"); index = 1; } @@ -874,16 +829,10 @@ using namespace QT_NAMESPACE; - (CBDescriptor *)nextDescriptorForCharacteristic:(CBCharacteristic *)characteristic startingFrom:(CBDescriptor *)descriptor { - Q_ASSERT_X(characteristic, "-nextDescriptorForCharacteristic:startingFrom:", - "invalid characteristic (nil)"); - Q_ASSERT_X(descriptor, "-nextDescriptorForCharacteristic:startingFrom:", - "invalid descriptor (nil)"); - Q_ASSERT_X(characteristic.descriptors, - "-nextDescriptorForCharacteristic:startingFrom:", - "invalid characteristic"); - Q_ASSERT_X(characteristic.descriptors.count, - "-nextDescriptorForCharacteristic:startingFrom:", - "invalid characteristic"); + Q_ASSERT_X(characteristic, Q_FUNC_INFO, "invalid characteristic (nil)"); + Q_ASSERT_X(descriptor, Q_FUNC_INFO, "invalid descriptor (nil)"); + Q_ASSERT_X(characteristic.descriptors, Q_FUNC_INFO, "invalid characteristic"); + Q_ASSERT_X(characteristic.descriptors.count, Q_FUNC_INFO, "invalid characteristic"); QT_BT_MAC_AUTORELEASEPOOL; @@ -900,8 +849,7 @@ using namespace QT_NAMESPACE; } } - Q_ASSERT_X([ds objectAtIndex:0] == descriptor, - "-nextDescriptorForCharacteristic:startingFrom:", + Q_ASSERT_X([ds objectAtIndex:0] == descriptor, Q_FUNC_INFO, "descriptor was not found in characteristic.descriptors"); return [ds objectAtIndex:1]; @@ -931,24 +879,24 @@ using namespace QT_NAMESPACE; - (bool)cacheWriteValue:(const QByteArray &)value for:(NSObject *)obj { - Q_ASSERT_X(obj, "-cacheWriteValue:for:", "invalid object (nil)"); + Q_ASSERT_X(obj, Q_FUNC_INFO, "invalid object (nil)"); if ([obj isKindOfClass:[CBCharacteristic class]]) { CBCharacteristic *const ch = static_cast(obj); if (!charMap.key(ch)) { - qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, unexpected " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unexpected " "characteristic, no handle found"; return false; } } else if ([obj isKindOfClass:[CBDescriptor class]]) { CBDescriptor *const d = static_cast(obj); if (!descMap.key(d)) { - qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, unexpected " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unexpected " "descriptor, no handle found"; return false; } } else { - qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, invalid object, " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid object, " "characteristic or descriptor required"; return false; } @@ -956,8 +904,7 @@ using namespace QT_NAMESPACE; if (valuesToWrite.contains(obj)) { // It can be a result of some previous errors - for example, // we never got a callback from a previous write. - qCWarning(QT_BT_OSX) << "-cacheWriteValue:for:, valuesToWrite " - "already has a cached value for this " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "already has a cached value for this " "object, the value will be replaced"; } @@ -983,7 +930,7 @@ using namespace QT_NAMESPACE; - (void)centralManagerDidUpdateState:(CBCentralManager *)central { - Q_ASSERT_X(delegate, "-centralManagerDidUpdateState:", "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); using namespace OSXBluetooth; @@ -1043,7 +990,7 @@ using namespace QT_NAMESPACE; } } else { // We actually handled all known states, but .. Core Bluetooth can change? - Q_ASSERT_X(0, "-centralManagerDidUpdateState:", "invalid centra's state"); + Q_ASSERT_X(0, Q_FUNC_INFO, "invalid centra's state"); } } @@ -1052,7 +999,7 @@ using namespace QT_NAMESPACE; Q_UNUSED(central) // This method is required for iOS before 7.0 and OS X below 10.9. - Q_ASSERT_X(manager, "-centralManager:didRetrivePeripherals:", "invalid central manager (nil)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid central manager (nil)"); if (managerState != OSXBluetooth::CentralManagerConnecting) { // Canceled by calling -disconnectFromDevice method. @@ -1062,11 +1009,10 @@ using namespace QT_NAMESPACE; managerState = OSXBluetooth::CentralManagerIdle; if (!peripherals || peripherals.count != 1) { - Q_ASSERT_X(delegate, "-centralManager:didRetrievePeripherals:", + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); - qCDebug(QT_BT_OSX) << "-centralManager:didRetrievePeripherals:, " - "unexpected number of peripherals (!= 1)"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO <<"unexpected number of peripherals (!= 1)"; delegate->error(QLowEnergyController::UnknownRemoteDeviceError); } else { @@ -1080,8 +1026,7 @@ using namespace QT_NAMESPACE; Q_UNUSED(central) Q_UNUSED(aPeripheral) - Q_ASSERT_X(delegate, "-centralManager:didConnectPeripheral:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (managerState != OSXBluetooth::CentralManagerConnecting) { // We called cancel but before disconnected, managed to connect? @@ -1099,8 +1044,7 @@ using namespace QT_NAMESPACE; Q_UNUSED(aPeripheral) Q_UNUSED(error) - Q_ASSERT_X(delegate, "-centralManager:didFailToConnectPeripheral:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (managerState != OSXBluetooth::CentralManagerConnecting) { // Canceled already. @@ -1118,16 +1062,14 @@ using namespace QT_NAMESPACE; Q_UNUSED(central) Q_UNUSED(aPeripheral) - Q_ASSERT_X(delegate, "-centralManager:didDisconnectPeripheral:error:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); // Clear internal caches/data. [self reset]; if (error && managerState == OSXBluetooth::CentralManagerDisconnecting) { managerState = OSXBluetooth::CentralManagerIdle; - qCWarning(QT_BT_OSX) << "-centralManager:didDisconnectPeripheral:, " - "failed to disconnect"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to disconnect"; // TODO: instead of 'unknown' - .. ? delegate->error(QLowEnergyController::UnknownRemoteDeviceError); } else { @@ -1151,7 +1093,7 @@ using namespace QT_NAMESPACE; if (error) { // NSLog, not qCDebug/Warning - to print the error. - NSLog(@"-peripheral:didDiscoverServices:, failed with error %@", error); + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); // TODO: better error mapping required. delegate->error(QLowEnergyController::UnknownError); } else { @@ -1174,18 +1116,16 @@ using namespace QT_NAMESPACE; QT_BT_MAC_AUTORELEASEPOOL; - Q_ASSERT_X(delegate, "-peripheral:didDiscoverIncludedServicesForService:", - "invalid delegate (null)"); - Q_ASSERT_X(peripheral, "-peripheral:didDiscoverIncludedServicesForService:", - "invalid peripheral (nil)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); // TODO: asserts on other "pointers" ... managerState = CentralManagerIdle; if (error) { // NSLog, not qCWarning/Critical - to log the actual NSError and service UUID. - NSLog(@"-peripheral:didDiscoverIncludedServicesForService:, finished with error %@ for service %@", - error, service.UUID); + NSLog(@"%s: finished with error %@ for service %@", + Q_FUNC_INFO, error, service.UUID); } else if (service.includedServices && service.includedServices.count) { // Now we have even more services to do included services discovery ... if (!servicesToVisitNext) @@ -1246,15 +1186,13 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; Q_ASSERT_X(managerState != CentralManagerUpdating, - "-peripheral:didDiscoverCharacteristicsForService:", - "invalid state"); - Q_ASSERT_X(delegate, "-peripheral:didDiscoverCharacteristicsForService:", + Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (error) { // NSLog to show the actual NSError (can contain something interesting). - NSLog(@"-peripheral:didDiscoverCharacteristicsForService:error, failed with error: %@", - error); + NSLog(@"%s failed with error: %@", Q_FUNC_INFO, error); // We did not discover any characteristics and can not discover descriptors, // inform our delegate (it will set a service state also). delegate->error(qt_uuid(service.UUID), QLowEnergyController::UnknownError); @@ -1270,11 +1208,8 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - Q_ASSERT_X(managerState != CentralManagerUpdating, - "-peripheral:didUpdateValueForCharacteristic:error:", - "invalid state"); - Q_ASSERT_X(peripheral, "-peripheral:didUpdateValueForCharacteristic:error:", - "invalid peripheral (nil)"); + Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); QT_BT_MAC_AUTORELEASEPOOL; // First, let's check if we're discovering a service details now. @@ -1284,9 +1219,7 @@ using namespace QT_NAMESPACE; if (error) { // Use NSLog, not qCDebug/qCWarning to log the actual error. - NSLog(@"-peripheral:didUpdateValueForCharacteristic:error:, failed with error %@", - error); - + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); if (!isDetailsDiscovery) { // TODO: this can be something else in a future (if needed at all). return; @@ -1310,13 +1243,12 @@ using namespace QT_NAMESPACE; // updated values ... // TODO: this must be properly tested. if (!chHandle) { - qCCritical(QT_BT_OSX) << "-peripheral:didUpdateValueForCharacteristic:error:, " - "unexpected update notification, no characteristic handle found"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "unexpected update notification, " + "no characteristic handle found"; return; } - Q_ASSERT_X(delegate, "-peripheral:didUpdateValueForCharacteristic:error:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->characteristicUpdateNotification(chHandle, qt_bytearray(characteristic.value)); } @@ -1336,8 +1268,7 @@ using namespace QT_NAMESPACE; if (error) { // Log the error using NSLog: - NSLog(@"-peripheral:didDiscoverDescriptorsForCharacteristic:error:, failed with error %@", - error); + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); // Probably, we can continue though ... } @@ -1356,8 +1287,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(aPeripheral) - Q_ASSERT_X(peripheral, "-peripheral:didUpdateValueForDescriptor:error:", - "invalid peripheral (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); QT_BT_MAC_AUTORELEASEPOOL; @@ -1369,8 +1299,7 @@ using namespace QT_NAMESPACE; if (error) { // NSLog to log the actual error ... - NSLog(@"-peripheral:didUpdateValueForDescriptor:error:, failed with error %@", - error); + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); if (!isDetailsDiscovery) { // TODO: probably will be required in a future. return; @@ -1425,31 +1354,25 @@ using namespace QT_NAMESPACE; writePending = false; - Q_ASSERT_X(delegate, "-peripheral:didWriteValueForCharacteristic:error", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); // Error or not, but the cached value has to be deleted ... const QByteArray valueToReport(valuesToWrite.value(characteristic, QByteArray())); if (!valuesToWrite.remove(characteristic)) { - qCWarning(QT_BT_OSX) << "-peripheral:didWriteValueForCharacteristic:error:, " - "no updated value found for for characteristic"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no updated value found" + " for characteristic"; } if (error) { // Use NSLog to log the actual error: - NSLog(@"-peripheral:didWriteValueForCharacteristic:error:, failed with error: %@", - error); - // TODO: no char handle at the moment, have to change to char index instead - // and calculate the right handle in the LE controller. - delegate->error(qt_uuid(characteristic.service.UUID), 0, + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); + delegate->error(qt_uuid(characteristic.service.UUID), QLowEnergyService::CharacteristicWriteError); } else { // Keys are unique. const QLowEnergyHandle cHandle = charMap.key(characteristic); - Q_ASSERT_X(cHandle, "-peripheral:didWriteValueForCharacteristic:error", - "invalid handle, not found in the characteristics map"); - + Q_ASSERT_X(cHandle, Q_FUNC_INFO, "invalid handle, not found in the characteristics map"); delegate->characteristicWriteNotification(cHandle, valueToReport); } @@ -1475,15 +1398,12 @@ using namespace QT_NAMESPACE; // Error or not, a value (if any) must be removed. const QByteArray valueToReport(valuesToWrite.value(descriptor, QByteArray())); if (!valuesToWrite.remove(descriptor)) - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << " no updated value found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no updated value found"; if (error) { // NSLog to log the actual NSError: - NSLog(@"%s, failed with error %@", Q_FUNC_INFO, error); - // TODO: this error function is not good at all - it takes charHandle, - // which is noop at the moment and ... we actually work with a descriptor handle - // here. - delegate->error(qt_uuid(descriptor.characteristic.service.UUID), 0, + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); + delegate->error(qt_uuid(descriptor.characteristic.service.UUID), QLowEnergyService::DescriptorWriteError); } else { const QLowEnergyHandle dHandle = descMap.key(descriptor); @@ -1516,8 +1436,8 @@ using namespace QT_NAMESPACE; if (error) { // NSLog to log the actual NSError: - NSLog(@"%s:, failed with error %@", Q_FUNC_INFO, error); - delegate->error(qt_uuid(characteristic.service.UUID), 0, + NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); + delegate->error(qt_uuid(characteristic.service.UUID), // In Qt's API it's a descriptor write actually. QLowEnergyService::DescriptorWriteError); } else { @@ -1526,7 +1446,7 @@ using namespace QT_NAMESPACE; delegate->descriptorWriteNotification(dHandle, valueToReport); } else { /* - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "notification value set to " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << ": notification value set to " << int(characteristic.isNotifying) << " but no client characteristic configuration descriptor found" " or no previous writeDescriptor request found"; diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 704053c6..ff08c14a 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -93,9 +93,8 @@ public: // Service related errors. virtual void error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error error) = 0; - // Characteristics related errors. + // Characteristics/descriptors related errors. virtual void error(const QBluetoothUuid &serviceUuid, - QLowEnergyHandle charHandle, QLowEnergyService::ServiceError error) = 0; }; diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index ad35d45f..a0ad49de 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -71,12 +71,12 @@ typedef QSharedPointer ServicePrivate; // Convenience function, can return a smart pointer that 'isNull'. ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CBService *cbService, bool included) { - Q_ASSERT_X(controller, "createLEService()", "invalid controller (null)"); - Q_ASSERT_X(cbService, "createLEService()", "invalid service (nil)"); + Q_ASSERT_X(controller, Q_FUNC_INFO, "invalid controller (null)"); + Q_ASSERT_X(cbService, Q_FUNC_INFO, "invalid service (nil)"); CBUUID *const cbUuid = cbService.UUID; if (!cbUuid) { - qCDebug(QT_BT_OSX) << "createLEService(), invalid service, " + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "invalid service, " "UUID is nil"; return ServicePrivate(); } @@ -133,13 +133,12 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl addressType(QLowEnergyController::PublicAddress) { // This is the "wrong" constructor - no valid device UUID to connect later. - Q_ASSERT_X(q, "QLowEnergyControllerPrivate", "invalid q_ptr (null)"); + Q_ASSERT_X(q, Q_FUNC_INFO, "invalid q_ptr (null)"); // We still create a manager, to simplify error handling later. centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); if (!centralManager) { - qCWarning(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::" - "QBluetoothLowEnergyControllerPrivateOSX(), " - "failed to initialize central manager"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO + << "failed to initialize central manager"; } } @@ -152,12 +151,11 @@ QLowEnergyControllerPrivateOSX::QLowEnergyControllerPrivateOSX(QLowEnergyControl controllerState(QLowEnergyController::UnconnectedState), addressType(QLowEnergyController::PublicAddress) { - Q_ASSERT_X(q, "QLowEnergyControllerPrivateOSX", "invalid q_ptr (null)"); + Q_ASSERT_X(q, Q_FUNC_INFO, "invalid q_ptr (null)"); centralManager.reset([[ObjCCentralManager alloc] initWithDelegate:this]); if (!centralManager) { - qCWarning(QT_BT_OSX) << "QBluetoothLowEnergyControllerPrivateOSX::" - "QBluetoothLowEnergyControllerPrivateOSX(), " - "failed to initialize central manager"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO + << "failed to initialize central manager"; } } @@ -183,7 +181,7 @@ void QLowEnergyControllerPrivateOSX::LEnotSupported() void QLowEnergyControllerPrivateOSX::connectSuccess() { Q_ASSERT_X(controllerState == QLowEnergyController::ConnectingState, - "connectSuccess", "invalid state"); + Q_FUNC_INFO, "invalid state"); controllerState = QLowEnergyController::ConnectedState; @@ -196,7 +194,7 @@ void QLowEnergyControllerPrivateOSX::connectSuccess() void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices services) { Q_ASSERT_X(controllerState == QLowEnergyController::DiscoveringState, - "serviceDiscoveryFinished", "invalid state"); + Q_FUNC_INFO, "invalid state"); using namespace OSXBluetooth; @@ -218,8 +216,8 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service continue; if (discoveredServices.contains(newService->uuid)) { // It's a bit stupid we first created it ... - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " - << "discovered service with a duplicated UUID "<uuid; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "discovered service with a duplicated UUID " + << newService->uuid; continue; } discoveredServices.insert(newService->uuid, newService); @@ -270,8 +268,7 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service toVisitNext.resetWithoutRetain([[NSMutableArray alloc] init]); } } else { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(), " - "no services found"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "no services found"; } foreach (const QBluetoothUuid &uuid, discoveredServices.keys()) { @@ -287,14 +284,13 @@ void QLowEnergyControllerPrivateOSX::serviceDiscoveryFinished(LEServices service void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService service) { - Q_ASSERT_X(!service.isNull(), "serviceDetailsDiscoveryFinished", - "invalid service (null)"); + Q_ASSERT_X(!service.isNull(), Q_FUNC_INFO, "invalid service (null)"); QT_BT_MAC_AUTORELEASEPOOL; if (!discoveredServices.contains(service->uuid)) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(), " - "unknown service uuid: " << service->uuid; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "unknown service uuid: " + << service->uuid; return; } @@ -310,20 +306,18 @@ void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService s void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyHandle charHandle, const QByteArray &value) { - Q_ASSERT_X(charHandle, "characteristicWriteNotification", - "invalid characteristic handle(0)"); + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle(0)"); ServicePrivate service(serviceForHandle(charHandle)); if (service.isNull()) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " - "can not find service for characteristic handle " << charHandle; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "can not find service for characteristic handle " + << charHandle; return; } QLowEnergyCharacteristic characteristic(characteristicForHandle(charHandle)); if (!characteristic.isValid()) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicWriteNotification(), " - "unknown characteristic"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown characteristic"; return; } @@ -338,8 +332,7 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy { // TODO: write/update notifications are quite similar (except asserts/warnings messages // and different signals emitted). Merge them into one function? - Q_ASSERT_X(charHandle, "characteristicUpdateNotification", - "invalid characteristic handle(0)"); + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle(0)"); ServicePrivate service(serviceForHandle(charHandle)); if (service.isNull()) { @@ -353,8 +346,7 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy QLowEnergyCharacteristic characteristic(characteristicForHandle(charHandle)); if (!characteristic.isValid()) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(), " - "unknown characteristic"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown characteristic"; return; } @@ -366,12 +358,11 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy void QLowEnergyControllerPrivateOSX::descriptorWriteNotification(QLowEnergyHandle dHandle, const QByteArray &value) { - Q_ASSERT_X(dHandle, "descriptorWriteNotification", "invalid descriptor handle (0)"); + Q_ASSERT_X(dHandle, Q_FUNC_INFO, "invalid descriptor handle (0)"); const QLowEnergyDescriptor qtDescriptor(descriptorForHandle(dHandle)); if (!qtDescriptor.isValid()) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::descriptorWriteNotification(), " - "unknown descriptor " << dHandle; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown descriptor " << dHandle; return; } @@ -428,20 +419,17 @@ void QLowEnergyControllerPrivateOSX::error(const QBluetoothUuid &serviceUuid, ServicePrivate qtService(discoveredServices.value(serviceUuid)); qtService->setState(QLowEnergyService::InvalidService); } else { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::error(), " - "error reported for unknown service "<stateChanged(QLowEnergyController::DiscoveringState); @@ -498,18 +486,17 @@ void QLowEnergyControllerPrivateOSX::discoverServices() void QLowEnergyControllerPrivateOSX::discoverServiceDetails(const QBluetoothUuid &serviceUuid) { - Q_ASSERT_X(isValid(), "discoverServiceDetails", "invalid private controller"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid private controller"); if (controllerState != QLowEnergyController::DiscoveredState) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::discoverServiceDetails(), " - "can not discover service details in the current state, " - "QLowEnergyController::DiscoveredState is expected"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO + << "can not discover service details in the current state, " + << "QLowEnergyController::DiscoveredState is expected"; return; } if (!discoveredServices.contains(serviceUuid)) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::discoverServiceDetails(), " - "unknown service: " << serviceUuid; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown service: " << serviceUuid; return; } @@ -527,30 +514,29 @@ void QLowEnergyControllerPrivateOSX::setNotifyValue(QSharedPointer 2) { // Qt's API requires an error on such write. // With Core Bluetooth we do not write any descriptor, // but instead call a special method. So it's better to // intercept wrong data size here: - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " - "client characteristic configuration descriptor " - "is 2 octets, but value size is: " << newValue.size(); + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "client characteristic configuration descriptor " + "is 2 bytes, but value size is: " << newValue.size(); service->setError(QLowEnergyService::DescriptorWriteError); return; } if (!discoveredServices.contains(service->uuid)) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " - "no service with uuid: " << service->uuid << " found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no service with uuid: " + << service->uuid << " found"; return; } if (!service->characteristicList.contains(charHandle)) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::setNotifyValue(), " - "no characteristic with handle: " << charHandle << " found"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "no characteristic with handle: " + << charHandle << " found"; return; } @@ -562,21 +548,21 @@ void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointeruuid)) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " - "no service with uuid: " << service->uuid << " found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no service with uuid: " + << service->uuid << " found"; return; } if (!service->characteristicList.contains(charHandle)) { - qCDebug(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeCharacteristic(), " - "no characteristic with handle: " << charHandle << " found"; + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "no characteristic with handle: " + << charHandle << " found"; return; } @@ -608,15 +594,15 @@ void QLowEnergyControllerPrivateOSX::writeDescriptor(QSharedPointeruuid)) { - qCWarning(QT_BT_OSX) << "QLowEnergyControllerPrivateOSX::writeDescriptor(), " - "no service with uuid: " << service->uuid << " found"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no service with uuid: " + << service->uuid << " found"; return; } @@ -739,8 +725,8 @@ QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddres osx_d_ptr->remoteAddress = remoteAddress; osx_d_ptr->localAddress = QBluetoothLocalDevice().address(); - qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " - "construction with remote address is not supported!"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "construction with remote address " + "is not supported!"; } QLowEnergyController::QLowEnergyController(const QBluetoothDeviceInfo &remoteDevice, @@ -766,8 +752,8 @@ QLowEnergyController::QLowEnergyController(const QBluetoothAddress &remoteAddres osx_d_ptr->remoteAddress = remoteAddress; osx_d_ptr->localAddress = localAddress; - qCWarning(QT_BT_OSX) << "QLowEnergyController::QLowEnergyController(), " - "construction with remote/local addresses is not supported!"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "construction with remote/local " + "addresses is not supported!"; } QLowEnergyController::~QLowEnergyController() diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index dbf22776..c7db0668 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -83,7 +83,6 @@ private: void error(const QBluetoothUuid &serviceUuid, QLowEnergyController::Error errorCode) Q_DECL_OVERRIDE; void error(const QBluetoothUuid &serviceUuid, - QLowEnergyHandle charHandle, QLowEnergyService::ServiceError error) Q_DECL_OVERRIDE; void connectToDevice(); -- cgit v1.2.3 From 74ba0f17ee1c36d328166e840e15d59d35352354 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 8 Dec 2014 11:32:57 +0100 Subject: QLowEnergyController - auto test (OS X/iOS) Ajust the test to make it also work with Core Bluetooth: with Core Bluetooth we do not have device address, we have only uuids (Apple's unique NSUUIDs generated for LE peripherals), this patch mainly addresses this issue - controller has to be created with LE device info, not QBluetoothAddress. Change-Id: I236cd55bfc41a8333fce663fb3b780ee219f8cec Reviewed-by: Alex Blasche --- .../tst_qlowenergycontroller.cpp | 92 ++++++++++++++++++++-- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index d589b61a..8cd5cdee 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -56,7 +56,9 @@ QT_USE_NAMESPACE // This define must be set if the platform provides access to GATT handles // otherwise it must not be defined. As of now the two supported platforms // (Android and Bluez/Linux) provide access or some notion of it. +#ifndef Q_OS_MAC #define HANDLES_PROVIDED_BY_PLATFORM +#endif #ifdef HANDLES_PROVIDED_BY_PLATFORM #define HANDLE_COMPARE(actual,expected) QCOMPARE(actual,expected) @@ -89,6 +91,7 @@ private: QBluetoothDeviceDiscoveryAgent *devAgent; QBluetoothAddress remoteDevice; + QBluetoothDeviceInfo remoteDeviceInfo; QList foundServices; }; @@ -102,6 +105,9 @@ tst_QLowEnergyController::tst_QLowEnergyController() qRegisterMetaType(); //QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); +#ifndef Q_OS_MAC + // Core Bluetooth (OS X and iOS) does not work with addresses, + // making the code below useless. const QString remote = qgetenv("BT_TEST_DEVICE"); if (!remote.isEmpty()) { remoteDevice = QBluetoothAddress(remote); @@ -109,6 +115,7 @@ tst_QLowEnergyController::tst_QLowEnergyController() } else { qWarning() << "Not using any remote device for testing. Set BT_TEST_DEVICE env to run manual tests involving a remote device"; } +#endif } tst_QLowEnergyController::~tst_QLowEnergyController() @@ -118,12 +125,19 @@ tst_QLowEnergyController::~tst_QLowEnergyController() void tst_QLowEnergyController::initTestCase() { +#ifndef Q_OS_MAC if (remoteDevice.isNull() || QBluetoothLocalDevice::allDevices().isEmpty()) { qWarning("No remote device or local adapter found."); return; } - +#elif defined(Q_OS_OSX) + // allDevices is always empty on iOS: + if (QBluetoothLocalDevice::allDevices().isEmpty()) { + qWarning("No local adapter found."); + return; + } +#endif devAgent = new QBluetoothDeviceDiscoveryAgent(this); @@ -136,7 +150,14 @@ void tst_QLowEnergyController::initTestCase() devAgent->start(); QTRY_VERIFY_WITH_TIMEOUT(finishedSpy.count() > 0, 30000); foreach (const QBluetoothDeviceInfo &info, devAgent->discoveredDevices()) { +#ifndef Q_OS_MAC if (info.address() == remoteDevice) { +#else + // On OS X/iOS the only way to find the device we are + // interested in - is to use device's name. + if (info.name().contains("Sensor") && info.name().contains("Tag")) { + remoteDeviceInfo = info; +#endif deviceFound = true; break; } @@ -145,8 +166,11 @@ void tst_QLowEnergyController::initTestCase() QVERIFY2(deviceFound, "Cannot find remote device."); // These are the services exported by the TI SensorTag +#ifndef Q_OS_MAC + // Core Bluetooth somehow ignores/hides/fails to discover these services. foundServices << QBluetoothUuid(QString("00001800-0000-1000-8000-00805f9b34fb")); foundServices << QBluetoothUuid(QString("00001801-0000-1000-8000-00805f9b34fb")); +#endif foundServices << QBluetoothUuid(QString("0000180a-0000-1000-8000-00805f9b34fb")); foundServices << QBluetoothUuid(QString("0000ffe0-0000-1000-8000-00805f9b34fb")); foundServices << QBluetoothUuid(QString("f000aa00-0451-4000-b000-000000000000")); @@ -165,9 +189,9 @@ void tst_QLowEnergyController::initTestCase() */ void tst_QLowEnergyController::init() { -#ifdef Q_OS_ANDROID +#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) /* - * Add a delay to give Android stack time to catch up in between + * Add a delay to give Android/iOS stack time to catch up in between * the multiple connect/disconnects within each test function. */ QTest::qWait(2000); @@ -224,17 +248,38 @@ void tst_QLowEnergyController::tst_emptyCtor() void tst_QLowEnergyController::tst_connect() { QList localAdapters = QBluetoothLocalDevice::allDevices(); + +#ifndef Q_OS_MAC if (localAdapters.isEmpty() || remoteDevice.isNull()) +#elif defined(Q_OS_OSX) + if (localAdapters.isEmpty() || remoteDeviceInfo.deviceUuid().isNull()) +#elif defined (Q_OS_IOS) + if (remoteDeviceInfo.deviceUuid().isNull()) +#endif QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); +#ifndef Q_OS_IOS const QBluetoothAddress localAdapter = localAdapters.at(0).address(); +#endif + +#ifndef Q_OS_MAC QLowEnergyController control(remoteDevice); +#else + // Create a low energy controller using Apple's + // uuid (NSUUID). + QLowEnergyController control(remoteDeviceInfo); +#endif + QSignalSpy connectedSpy(&control, SIGNAL(connected())); QSignalSpy disconnectedSpy(&control, SIGNAL(disconnected())); +#ifndef Q_OS_IOS QCOMPARE(control.localAddress(), localAdapter); QVERIFY(!control.localAddress().isNull()); +#endif +#ifndef Q_OS_MAC QCOMPARE(control.remoteAddress(), remoteDevice); +#endif QCOMPARE(control.state(), QLowEnergyController::UnconnectedState); QCOMPARE(control.error(), QLowEnergyController::NoError); QVERIFY(control.errorString().isEmpty()); @@ -370,12 +415,19 @@ void tst_QLowEnergyController::tst_connect() void tst_QLowEnergyController::tst_concurrentDiscovery() { +#ifndef Q_OS_MAC QList localAdapters = QBluetoothLocalDevice::allDevices(); if (localAdapters.isEmpty() || remoteDevice.isNull()) QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); // quick setup - more elaborate test is done by connectNew() QLowEnergyController control(remoteDevice); +#else + if (remoteDeviceInfo.deviceUuid().isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + QLowEnergyController control(remoteDeviceInfo); +#endif + QCOMPARE(control.state(), QLowEnergyController::UnconnectedState); QCOMPARE(control.error(), QLowEnergyController::NoError); @@ -640,6 +692,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x12)); QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read); + QEXPECT_FAIL("", "The value is different on different devices", Continue); QCOMPARE(chars[0].value(), QByteArray::fromHex("6e41ab0000296abc")); QVERIFY(chars[0].isValid()); QVERIFY(info->contains(chars[0])); @@ -1603,12 +1656,19 @@ void tst_QLowEnergyController::tst_defaultBehavior() void tst_QLowEnergyController::tst_writeCharacteristic() { +#ifndef Q_OS_MAC QList localAdapters = QBluetoothLocalDevice::allDevices(); if (localAdapters.isEmpty() || remoteDevice.isNull()) QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); // quick setup - more elaborate test is done by connect() QLowEnergyController control(remoteDevice); +#else + if (remoteDeviceInfo.deviceUuid().isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + QLowEnergyController control(remoteDeviceInfo); +#endif + QCOMPARE(control.error(), QLowEnergyController::NoError); control.connectToDevice(); @@ -1673,7 +1733,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic() // ******************************************* // test writing of characteristic // enable Blinking LED if not already enabled - if (configChar.value() != QByteArray("81")) { + if (configChar.value() != QByteArray::fromHex("81")) { service->writeCharacteristic(configChar, QByteArray::fromHex("81")); //0x81 blink LED D1 QTRY_VERIFY_WITH_TIMEOUT(!writeSpy.isEmpty(), 10000); QCOMPARE(configChar.value(), QByteArray::fromHex("81")); @@ -1752,12 +1812,17 @@ void tst_QLowEnergyController::tst_writeCharacteristic() void tst_QLowEnergyController::tst_writeDescriptor() { +#ifndef Q_OS_MAC QList localAdapters = QBluetoothLocalDevice::allDevices(); if (localAdapters.isEmpty() || remoteDevice.isNull()) QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); - - // quick setup - more elaborate test is done by connect() QLowEnergyController control(remoteDevice); +#else + if (remoteDeviceInfo.deviceUuid().isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + QLowEnergyController control(remoteDeviceInfo); +#endif + // quick setup - more elaborate test is done by connect() control.connectToDevice(); { QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState, @@ -1928,7 +1993,15 @@ void tst_QLowEnergyController::tst_writeDescriptor() // write 4 byte value to 2 byte characteristic service->writeDescriptor(notification, QByteArray::fromHex("11112222")); +#ifdef Q_OS_MAC + // On OS X/iOS we have a special method to set notify value, + // it accepts only false/true and not + // writing descriptors, there is only one way to find this error - + // immediately intercept in LE controller and set the error. + QVERIFY(!errorSpy.isEmpty()); +#else QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 30000); +#endif QCOMPARE(errorSpy[0].at(0).value(), QLowEnergyService::DescriptorWriteError); QCOMPARE(service->error(), QLowEnergyService::DescriptorWriteError); @@ -2021,12 +2094,19 @@ void tst_QLowEnergyController::tst_encryption() */ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() { +#ifndef Q_OS_MAC QList localAdapters = QBluetoothLocalDevice::allDevices(); if (localAdapters.isEmpty() || remoteDevice.isNull()) QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); // quick setup - more elaborate test is done by connect() QLowEnergyController control(remoteDevice); +#else + if (remoteDeviceInfo.deviceUuid().isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + + QLowEnergyController control(remoteDeviceInfo); +#endif QCOMPARE(control.error(), QLowEnergyController::NoError); control.connectToDevice(); -- cgit v1.2.3 From e8411b3933e80905f469a20601176c03fa38f74d Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 8 Dec 2014 17:22:04 +0100 Subject: QBluetoothDeviceDiscoveryAgent - cleanup (iOS) Fix asserts/messages to use Q_FUNC_INFO + fix .pro file not to print 'unsupported platform'. Change-Id: Iac33812212643229195a504d44c15bf9a56d16ba Reviewed-by: Alex Blasche --- src/bluetooth/bluetooth.pro | 2 - .../qbluetoothdevicediscoveryagent_ios.mm | 45 ++++++++++------------ 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 593431c3..9cec0a3d 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -177,8 +177,6 @@ config_bluez:qtHaveModule(dbus) { SOURCES -= qlowenergycontroller.cpp SOURCES -= qlowenergycontroller_p.cpp } else:ios { - message("iOS is currently an unsupported Bluetooth platform, WIP.") - DEFINES += QT_IOS_BLUETOOTH LIBS += -framework Foundation -framework CoreBluetooth diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm index 20304d99..f1e7945c 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm @@ -47,6 +47,7 @@ #include "qbluetoothuuid.h" #include +#include #include #include #include @@ -108,16 +109,14 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con { Q_UNUSED(adapter); - Q_ASSERT_X(q != Q_NULLPTR, "QBluetoothDeviceDiscoveryAgentPrivate()", - "invalid q_ptr (null)"); + Q_ASSERT_X(q != Q_NULLPTR, Q_FUNC_INFO, "invalid q_ptr (null)"); // OSXBTLEDeviceInquiry can be constructed even if LE is not supported - // at this stage it's only a memory allocation of the object itself, // if it fails - we have some memory-related problems. LEDeviceInquiry newInquiryLE([[LEDeviceInquiryObjC alloc] initWithDelegate:this]); if (!newInquiryLE) { - qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate() " - "failed to initialize a device inquiry object"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to initialize a device inquiry object"; return; } @@ -148,10 +147,10 @@ bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const void QBluetoothDeviceDiscoveryAgentPrivate::start() { - Q_ASSERT_X(isValid(), "start()", "called on invalid device discovery agent"); - Q_ASSERT_X(!isActive(), "start()", "called on active device discovery agent"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "called on invalid device discovery agent"); + Q_ASSERT_X(!isActive(), Q_FUNC_INFO, "called on active device discovery agent"); Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, - "startLE()", "called with an invalid Bluetooth adapter"); + Q_FUNC_INFO, "called with an invalid Bluetooth adapter"); if (stopPending) { startPending = true; @@ -173,10 +172,10 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() void QBluetoothDeviceDiscoveryAgentPrivate::stop() { - Q_ASSERT_X(isValid(), "stop()", "called on invalid device discovery agent"); - Q_ASSERT_X(isActive(), "stop()", "called whithout active inquiry"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "called on invalid device discovery agent"); + Q_ASSERT_X(isActive(), Q_FUNC_INFO, "called whithout active inquiry"); Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, - "stop()", "called with invalid bluetooth adapter"); + Q_FUNC_INFO, "called with invalid bluetooth adapter"); startPending = false; stopPending = true; @@ -194,7 +193,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryError(QBluetoothDevic // after the LE scan started (so we have LE support and this is // a real PoweredOffError). Q_ASSERT_X(error == QBluetoothDeviceDiscoveryAgent::PoweredOffError, - "LEdeviceInquiryError", "unexpected error"); + Q_FUNC_INFO, "unexpected error"); startPending = false; stopPending = false; @@ -214,7 +213,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceFound(CBPeripheral *peripher NSDictionary *advertisementData, NSNumber *RSSI) { - Q_ASSERT_X(peripheral, "LEdeviceFound", "invalid peripheral (nil)"); + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); QT_BT_MAC_AUTORELEASEPOOL; @@ -252,7 +251,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceFound(CBPeripheral *peripher void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryFinished() { - Q_ASSERT_X(isValid(), "LEdeviceInquiryFinished", "invalid device discovery agent"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid device discovery agent"); if (stopPending && !startPending) { stopPending = false; @@ -309,8 +308,8 @@ QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent( d_ptr(new QBluetoothDeviceDiscoveryAgentPrivate(deviceAdapter, this)) { if (!deviceAdapter.isNull()) { - qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(), " - "local device address is not available, provided address is ignored"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "local device address is " + "not available, provided address is ignored"; d_ptr->setError(InvalidBluetoothAdapterError); } } @@ -339,12 +338,10 @@ void QBluetoothDeviceDiscoveryAgent::start() { if (d_ptr->lastError != InvalidBluetoothAdapterError) { if (d_ptr->isValid()) { - if (!isActive()) { + if (!isActive()) d_ptr->start(); - } else { - qCDebug(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::start(), " - "already started"; - } + else + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "already started"; } else { // We previously failed to initialize // private object correctly. @@ -357,12 +354,10 @@ void QBluetoothDeviceDiscoveryAgent::start() void QBluetoothDeviceDiscoveryAgent::stop() { if (d_ptr->isValid()) { - if (isActive() && d_ptr->lastError != InvalidBluetoothAdapterError) { + if (isActive() && d_ptr->lastError != InvalidBluetoothAdapterError) d_ptr->stop(); - } else { - qCDebug(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgent::stop(), " - "failed to stop"; - } + else + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "failed to stop"; } } -- cgit v1.2.3 From 994934b36bcfa74da8975ec31da528ddded50e16 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 8 Dec 2014 11:22:30 +0100 Subject: Mark new symbols as introduced by Qt 5.5 Change-Id: I704d0f10f152b0ac23175728e3e15b6e43d48793 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativenearfield.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index f6c68b85..398c37a7 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -96,6 +96,7 @@ /*! \qmlproperty bool NearField::polling + \since 5.5 This property indicates if the underlying adapter is currently in polling state. If set to \c true the adapter will start polling and stop polling if set to \c false. @@ -106,12 +107,14 @@ /*! \qmlsignal NearField::tagFound() + \since 5.5 This signal will be emitted when a tag has been detected. */ /*! \qmlsignal NearField::tagRemoved() + \since 5.5 This signal will be emitted when a tag has been removed. */ -- cgit v1.2.3 From 026714701477706231298e92878286930baf3948 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 8 Dec 2014 11:19:16 +0100 Subject: Enable automatic tag polling if message handler is not supported. All examples have used message handler registration so far. That's not always supported on all platforms. Neard is one of those platforms against which this this was verified. This patch converts some examples to use manual target detection if handler registration fails. Change-Id: Icfd8b7c695e63351a45b867fd69e9fc5fefb9360 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- examples/nfc/annotatedurl/annotatedurl.cpp | 48 ++++++++++++++++++++++++++++++ examples/nfc/annotatedurl/annotatedurl.h | 13 ++++---- examples/nfc/annotatedurl/main.cpp | 10 ------- examples/nfc/corkboard/corkboards.qml | 19 ++++++++++-- examples/nfc/poster/poster.qml | 46 ++++++++++++++++++++++------ src/nfc/doc/src/nfc-overview.qdoc | 2 +- 6 files changed, 111 insertions(+), 27 deletions(-) diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index f29045b6..909f199b 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -40,6 +40,7 @@ #include "annotatedurl.h" +#include #include #include #include @@ -53,14 +54,61 @@ #include #include #include +#include AnnotatedUrl::AnnotatedUrl(QObject *parent) : QObject(parent) { + //! [QNearFieldManager register handler] + manager = new QNearFieldManager(this); + if (!manager->isAvailable()) { + qWarning() << "NFC not available"; + return; + } + + QNdefFilter filter; + filter.setOrderMatch(false); + filter.appendRecord(1, UINT_MAX); + filter.appendRecord(); + int result = manager->registerNdefMessageHandler(filter, this, + SLOT(handleMessage(QNdefMessage,QNearFieldTarget*))); + //! [QNearFieldManager register handler] + + if (result != -1) + return; + + manager->startTargetDetection(); + connect(manager, SIGNAL(targetDetected(QNearFieldTarget*)), + this, SLOT(targetDetected(QNearFieldTarget*))); + connect(manager, SIGNAL(targetLost(QNearFieldTarget*)), + this, SLOT(targetLost(QNearFieldTarget*))); } AnnotatedUrl::~AnnotatedUrl() { + +} + +void AnnotatedUrl::targetDetected(QNearFieldTarget *target) +{ + if (!target) + return; + + connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), + this, SLOT(handlePolledNdefMessage(QNdefMessage))); + target->readNdefMessages(); +} + +void AnnotatedUrl::targetLost(QNearFieldTarget *target) +{ + if (target) + target->deleteLater(); +} + +void AnnotatedUrl::handlePolledNdefMessage(QNdefMessage message) +{ + QNearFieldTarget *target = qobject_cast(sender()); + handleMessage(message, target); } //! [handleMessage 1] diff --git a/examples/nfc/annotatedurl/annotatedurl.h b/examples/nfc/annotatedurl/annotatedurl.h index 863f0976..b0c69a62 100644 --- a/examples/nfc/annotatedurl/annotatedurl.h +++ b/examples/nfc/annotatedurl/annotatedurl.h @@ -42,16 +42,14 @@ #define ANNOTATEDURL_H #include +#include #include QT_FORWARD_DECLARE_CLASS(QUrl) QT_FORWARD_DECLARE_CLASS(QPixmap) - -QT_BEGIN_NAMESPACE -class QNearFieldTarget; -class QNdefMessage; -QT_END_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QNearFieldManager) +QT_FORWARD_DECLARE_CLASS(QNearFieldTarget) QT_USE_NAMESPACE @@ -67,7 +65,12 @@ signals: void annotatedUrl(const QUrl &url, const QString &title, const QPixmap &pixmap); public slots: + void targetDetected(QNearFieldTarget *target); + void targetLost(QNearFieldTarget *target); void handleMessage(const QNdefMessage &message, QNearFieldTarget *target); + void handlePolledNdefMessage(QNdefMessage message); +private: + QNearFieldManager *manager; }; #endif // ANNOTATEDURL_H diff --git a/examples/nfc/annotatedurl/main.cpp b/examples/nfc/annotatedurl/main.cpp index 351f33bf..659aeb15 100644 --- a/examples/nfc/annotatedurl/main.cpp +++ b/examples/nfc/annotatedurl/main.cpp @@ -57,18 +57,8 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); MainWindow mainWindow; - //! [QNearFieldManager register handler] - QNearFieldManager manager; AnnotatedUrl annotatedUrl; - QNdefFilter filter; - filter.setOrderMatch(false); - filter.appendRecord(1, UINT_MAX); - filter.appendRecord(); - manager.registerNdefMessageHandler(filter, &annotatedUrl, - SLOT(handleMessage(QNdefMessage,QNearFieldTarget*))); - //! [QNearFieldManager register handler] - QObject::connect(&annotatedUrl, SIGNAL(annotatedUrl(QUrl,QString,QPixmap)), &mainWindow, SLOT(displayAnnotatedUrl(QUrl,QString,QPixmap))); diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index 55c83723..550dc03b 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -39,7 +39,7 @@ ** ****************************************************************************/ -import QtQuick 2.1 +import QtQuick 2.3 import QtNfc 5.2 Rectangle { @@ -47,11 +47,27 @@ Rectangle { color: "black" NearField { + property bool requiresManualPolling: false orderMatch: false onMessageRecordsChanged: { list.get(listView.currentIndex).notes.append({"noteText":messageRecords[0].text}) } + + onPollingChanged: { + if (!polling && requiresManualPolling) + polling = true; //restart polling + } + + Component.onCompleted: { + // Polling should be true if + // QNearFieldManager::registerNdefMessageHandler() was successful; + // otherwise the platform requires manual polling mode. + if (!polling) { + requiresManualPolling = true; + polling = true; + } + } } ListModel { @@ -60,7 +76,6 @@ Rectangle { ListElement { name: "Personal" notes: [ - ListElement { noteText: "https://developer.blackberry.com" }, ListElement { noteText: "Near Field Communication" }, ListElement { noteText: "Touch a tag and its contents will appear as a new note" } ] diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index e2c67dd9..34181017 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -38,7 +38,7 @@ ** ****************************************************************************/ -import QtQuick 2.0 +import QtQuick 2.3 import QtNfc 5.2 Rectangle { @@ -48,6 +48,19 @@ Rectangle { NearField { id: nearfield + property bool requiresManualPolling: false + + onPollingChanged: { + if (!polling && requiresManualPolling) + polling = true; //restart polling + } + + Component.onCompleted: { + if (!polling) { + requiresManualPolling = true; + polling = true; + } + } filter: [ NdefFilter { type: "U"; typeNameFormat: NdefRecord.NfcRtd; minimum: 1; maximum: 1 }, @@ -61,17 +74,32 @@ Rectangle { var currentLocaleMatch = NdefTextRecord.LocaleMatchedNone; var i; + var found = false; for (i = 0; i < messageRecords.length; ++i) { - if (messageRecords[i].recordType == "urn:nfc:wkt:T") { - if (messageRecords[i].localeMatch > currentLocaleMatch) { - currentLocaleMatch = messageRecords[i].localeMatch; - posterText.text = messageRecords[i].text; + switch (messageRecords[i].typeNameFormat) { + case NdefRecord.NfcRtd: + if (messageRecords[i].type === "T") { + if (messageRecords[i].localeMatch > currentLocaleMatch) { + currentLocaleMatch = messageRecords[i].localeMatch; + posterText.text = messageRecords[i].text; + found = true; + } + + } else if (messageRecords[i].type === "U") { + posterUrl.text = messageRecords[i].uri; + found = true; + } + break; + case NdefRecord.Mime: + if (messageRecords[i].type.startsWith("image/")) { + posterImage.source = messageRecords[i].uri; + found = true; } - } else if (messageRecords[i].recordType == "urn:nfc:wkt:U") { - posterUrl.text = messageRecords[i].uri; - } else if (messageRecords[i].recordType.substr(0, 19) == "urn:nfc:mime:image/") { - posterImage.source = messageRecords[i].uri; + break; } + + if (!found) + console.warn("Unknown NFC tag detected. Cannot display content.") } root.state = "show"; diff --git a/src/nfc/doc/src/nfc-overview.qdoc b/src/nfc/doc/src/nfc-overview.qdoc index b068dfb5..f068201c 100644 --- a/src/nfc/doc/src/nfc-overview.qdoc +++ b/src/nfc/doc/src/nfc-overview.qdoc @@ -105,7 +105,7 @@ Depending on the platform it may even be possible to start the application that \note This feature is not available on all platforms and, in addition to the code snippets below, may require further platform specific setup. -\snippet annotatedurl/main.cpp QNearFieldManager register handler +\snippet annotatedurl/annotatedurl.cpp QNearFieldManager register handler For comparison an application that uses an empty NDEF filter (match all behavior) in combination with \l QNearFieldManager::registerNdefMessageHandler() would behave similarly to another application that uses -- cgit v1.2.3 From 4c2f02a52b2407619fa6a1003721a5488e601381 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 8 Dec 2014 15:04:45 +0100 Subject: QML NearField type never emitted tagRemoved() signal Change-Id: I7c6127b6f941bd5623cb6e01bd9db9063afaedd6 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativenearfield.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index 398c37a7..58ed0e50 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -257,6 +257,8 @@ void QDeclarativeNearField::_q_handleTargetDetected(QNearFieldTarget *target) this, SLOT(_q_handleNdefMessage(QNdefMessage))); target->readNdefMessages(); } + + emit tagFound(); } void QDeclarativeNearField::append_messageRecord(QQmlListProperty *list, -- cgit v1.2.3 From 936087adf7d6b1379d8844df717f55a62c4850e2 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 9 Dec 2014 14:01:41 +0100 Subject: Fix corkboard example display 1.) The z order of the sticky notes and the corkboard image was totally off. Most likely this is due to a bug in QtQuick's ListView implementation. Now we have a strict parent child relationship which seems to work. 2.) The tag content was always empy. This was due to incorrect usage of QML NdefRecord API usage. Change-Id: I67e9e42e842f1cb051ef62d481b99b3c7b97718c Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- examples/nfc/corkboard/Mode.qml | 149 ++++++++++++++++------------------ examples/nfc/corkboard/corkboards.qml | 20 ++++- 2 files changed, 88 insertions(+), 81 deletions(-) diff --git a/examples/nfc/corkboard/Mode.qml b/examples/nfc/corkboard/Mode.qml index a3df4448..36b5afd7 100644 --- a/examples/nfc/corkboard/Mode.qml +++ b/examples/nfc/corkboard/Mode.qml @@ -39,110 +39,101 @@ ** ****************************************************************************/ -import QtQuick 2.1 +import QtQuick 2.4 Item { id: page width: ListView.view.width; height: ListView.view.height - Rectangle { - id: frame - anchors.fill: parent - z: 1 - color: "transparent" - border.color: "darkred" - border.width: 10 - } Image { source: "qrc:/cork.jpg" - width: listView.width - height: listView.height + anchors.centerIn: parent + width: parent.width - 20 + height: parent.height - 20 fillMode: Image.PreserveAspectCrop - } - - Text { - anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 10} - text: name; - font.pixelSize: 30; font.bold: true; color: "white" - style: Text.Outline; styleColor: "black" - } - - Repeater { - model: notes - Item { - id: stickyPage - z: 2 - - x: Math.random() * (listView.width-listView.width*0.30) + listView.width*0.10 - y: Math.random() * (listView.height-listView.height*0.30) + listView.height*0.10 - rotation: -listView.horizontalVelocity / 200; - Behavior on rotation { - SpringAnimation { spring: 2.0; damping: 0.15 } - } + Text { + anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 10} + text: name; + font.pixelSize: 30; font.bold: true; color: "white" + style: Text.Outline; styleColor: "black" + } + Repeater { + model: notes Item { - id: sticky - scale: mouse.pressed ? 1 : 0.7 - rotation: mouse.pressed ? 8 : 0 - Behavior on rotation{ - NumberAnimation {duration: 200 } - } - Behavior on scale{ - NumberAnimation { duration: 200 } - } + id: stickyPage - Image { - id: stickyImage - x: 8 + -width * 0.6 / 2; y: -20 - source: "qrc:/note-yellow.png" - scale: 0.6; transformOrigin: Item.TopLeft - smooth: true - } + x: Math.random() * (listView.width-listView.width*0.30) + listView.width*0.10 + y: Math.random() * (listView.height-listView.height*0.30) + listView.height*0.10 - TextEdit { - id: myText - text: noteText - x: -104; y: 36; width: 215; height: 200 - smooth: true - font.pixelSize: 24 - readOnly: false - rotation: -8 - wrapMode: TextEdit.Wrap + rotation: -listView.horizontalVelocity / 200; + Behavior on rotation { + SpringAnimation { spring: 2.0; damping: 0.15 } } Item { - id: interactionItem - x: stickyImage.x; y: -20 - width: stickyImage.width * stickyImage.scale - height: stickyImage.height * stickyImage.scale - - MouseArea { - id: mouse - anchors.fill: parent - drag.target: stickyPage - drag.axis: Drag.XandYAxis + id: sticky + scale: mouse.pressed ? 1 : 0.7 + rotation: mouse.pressed ? 8 : 0 + Behavior on rotation{ + NumberAnimation {duration: 200 } } + Behavior on scale{ + NumberAnimation { duration: 200 } + } + Image { - id: writeButton - source: "qrc:/NfcFlag.png" - rotation: -8 // Note image itself is rotated - anchors { bottom: parent.bottom; right:parent.right } - scale: flagMouse.pressed ? 1.3 : 1 + id: stickyImage + x: 8 + -width * 0.6 / 2; y: -20 + source: "qrc:/note-yellow.png" + scale: 0.6; transformOrigin: Item.TopLeft + smooth: true + } + + TextEdit { + id: myText + text: noteText + x: -104; y: 36; width: 215; height: 200 + smooth: true + font.pixelSize: 24 + readOnly: false + rotation: -8 + wrapMode: TextEdit.Wrap + } + + Item { + id: interactionItem + x: stickyImage.x; y: -20 + width: stickyImage.width * stickyImage.scale + height: stickyImage.height * stickyImage.scale + MouseArea { - id: flagMouse + id: mouse anchors.fill: parent - //onClicked: { } + drag.target: stickyPage + drag.axis: Drag.XandYAxis + } + Image { + id: writeButton + source: "qrc:/NfcFlag.png" + rotation: -8 // Note image itself is rotated + anchors { bottom: parent.bottom; right:parent.right } + scale: flagMouse.pressed ? 1.3 : 1 + MouseArea { + id: flagMouse + anchors.fill: parent + } } } } - } - Image { - x: -width / 2; y: -height * 0.5 / 2 - source: "qrc:/tack.png" - scale: 0.7; transformOrigin: Item.TopLeft + Image { + x: -width / 2; y: -height * 0.5 / 2 + source: "qrc:/tack.png" + scale: 0.7; transformOrigin: Item.TopLeft + } } } } diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index 550dc03b..22804c06 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -44,14 +44,30 @@ import QtNfc 5.2 Rectangle { width: 800; height: 480 - color: "black" + color: "darkred" NearField { property bool requiresManualPolling: false orderMatch: false onMessageRecordsChanged: { - list.get(listView.currentIndex).notes.append({"noteText":messageRecords[0].text}) + var i; + for (i = 0; i < messageRecords.length; ++i) { + var data = ""; + if (messageRecords[i].typeNameFormat === NdefRecord.NfcRtd) { + if (messageRecords[i].type === "T") { + data = messageRecords[i].text; + } else if (messageRecords[i].type === "U") { + data = messageRecords[i].uri; + } + } + if (!data) + data = "Unknown content"; + + list.get(listView.currentIndex).notes.append( { + "noteText":data + }) + } } onPollingChanged: { -- cgit v1.2.3 From 66671f8574d2beff94601a6b0b0413cb824cc308 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 11 Dec 2014 11:33:37 +0100 Subject: Fix writing of NFC URI records We need to write the entire URL and not just the path which would be empty in cases such as http://www.qt.io. Change-Id: I3529e200088cc9192fa16626cb21fffcca7f26c5 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_neard_p.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 100456bf..6b374a27 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -204,11 +204,11 @@ public: if (record.isRecordType()) { recordProperties.insert(QStringLiteral("Type"), QStringLiteral("URI")); QNdefNfcUriRecord uriRecord = static_cast(record); - recordProperties.insert(QStringLiteral("URI"), uriRecord.uri().path()); + recordProperties.insert(QStringLiteral("URI"), uriRecord.uri().toString()); } else if (record.isRecordType()) { recordProperties.insert(QStringLiteral("Type"), QStringLiteral("SmartPoster")); QNdefNfcSmartPosterRecord spRecord = static_cast(record); - recordProperties.insert(QStringLiteral("URI"), spRecord.uri().path()); + recordProperties.insert(QStringLiteral("URI"), spRecord.uri().toString()); // Currently neard only supports the uri property for writing } else if (record.isRecordType()) { recordProperties.insert(QStringLiteral("Type"), QStringLiteral("Text")); -- cgit v1.2.3 From b94aad106215faebb68d3a58828054ffec3fc62c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 11 Dec 2014 12:25:38 +0100 Subject: Neard: Read all availabe SmartPoster data So far, Size, Action and MimeType were not read when detecting a smartposter tag. Change-Id: Ica283eac8248ef5ed73f8538eac76050b1310eef Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_neard_p.h | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 6b374a27..b35db0b5 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -268,10 +268,9 @@ private: const QString &locale = reply.value().value(QStringLiteral("Language")).toString(); const QString &encoding = reply.value().value(QStringLiteral("Encoding")).toString(); const QString &uri = reply.value().value(QStringLiteral("URI")).toString(); -// const QString &mimetype = reply.value().value(QStringLiteral("MIMEType")).toString(); + // const QString &mime = reply.value().value(QStringLiteral("MIME")).toString(); // const QString &arr = reply.value().value(QStringLiteral("ARR")).toString(); -// const QString &size = reply.value().value(QStringLiteral("Size")).toString(); const QString type = reply.value().value(QStringLiteral("Type")).toString(); if (type == QStringLiteral("Text")) { @@ -292,12 +291,26 @@ private: if (!uri.isEmpty()) spRecord.setUri(QUrl(uri)); -// const QString &actionString = reply.value().value(QStringLiteral("Action")).toString(); -// if (!action.isEmpty()) { -// QNdefNfcSmartPosterRecord::Action action; + const QString &action = reply.value().value(QStringLiteral("Action")).toString(); + if (!action.isEmpty()) { + if (action == QStringLiteral("Do")) + spRecord.setAction(QNdefNfcSmartPosterRecord::DoAction); + else if (action == QStringLiteral("Save")) + spRecord.setAction(QNdefNfcSmartPosterRecord::SaveAction); + else if (action == QStringLiteral("Edit")) + spRecord.setAction(QNdefNfcSmartPosterRecord::EditAction); + } + + if (reply.value().contains(QStringLiteral("Size"))) { + uint size = reply.value().value(QStringLiteral("Size")).toUInt(); + spRecord.setSize(size); + } + + const QString &mimeType = reply.value().value(QStringLiteral("MIMEType")).toString(); + if (!mimeType.isEmpty()) { + spRecord.setTypeInfo(mimeType.toUtf8()); + } -// spRecord.setAction(acti); -// } return spRecord; } else if (type == QStringLiteral("URI")) { -- cgit v1.2.3 From 1421e4c482430f9cf76ed7ec7bd5e6857ef9407f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 11 Dec 2014 13:46:53 +0100 Subject: Improve some parts of the SmartPoster API docs Change-Id: I09f087d84641447fcb5e9e906f3d665ed86102e3 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qndefnfcsmartposterrecord.cpp | 30 +++++++++++++++++++++++++----- src/nfc/qndefnfcsmartposterrecord.h | 1 + 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/nfc/qndefnfcsmartposterrecord.cpp b/src/nfc/qndefnfcsmartposterrecord.cpp index d1a6e4d5..9c6d756b 100644 --- a/src/nfc/qndefnfcsmartposterrecord.cpp +++ b/src/nfc/qndefnfcsmartposterrecord.cpp @@ -602,7 +602,10 @@ bool QNdefNfcSmartPosterRecord::removeIcon(const QByteArray &type) } /*! - Adds the icon record list \a icons to the smart poster. Any existing records are overwritten. + Adds the icon record list \a icons to the smart poster. + Any existing records are overwritten. + + \sa hasIcon(), icon() */ void QNdefNfcSmartPosterRecord::setIcons(const QList &icons) { @@ -617,7 +620,13 @@ void QNdefNfcSmartPosterRecord::setIcons(const QList &icons) } /*! - Returns the size from the size record if available. Otherwise returns 0. + Returns the size from the size record if available; otherwise returns 0. + + The value is optional and contains the size in bytes of the object + that the URI refers to. It may be used by the device to determine + whether it can accommodate the object. + + \sa setSize() */ quint32 QNdefNfcSmartPosterRecord::size() const { @@ -628,7 +637,10 @@ quint32 QNdefNfcSmartPosterRecord::size() const } /*! - Sets the size record to \a size + Sets the record \a size. The value contains the size in bytes of + the object that the URI refers to. + + \sa size(), hasSize() */ void QNdefNfcSmartPosterRecord::setSize(quint32 size) { @@ -642,7 +654,12 @@ void QNdefNfcSmartPosterRecord::setSize(quint32 size) } /*! - Returns the type from the type record if available. Otherwise returns an empty byte array. + Returns the UTF-8 encoded MIME type that describes the type of the objects + that can be reached via uri(). + + If the type is not known the return QByteArray is empty. + + \sa setTypeInfo(), hasTypeInfo() */ QByteArray QNdefNfcSmartPosterRecord::typeInfo() const { @@ -653,7 +670,10 @@ QByteArray QNdefNfcSmartPosterRecord::typeInfo() const } /*! - Sets the type record to \a type + Sets the type record to \a type. \a type must be UTF-8 encoded + and describes the type of the object referenced by uri() + + \sa typeInfo() */ void QNdefNfcSmartPosterRecord::setTypeInfo(const QByteArray &type) { diff --git a/src/nfc/qndefnfcsmartposterrecord.h b/src/nfc/qndefnfcsmartposterrecord.h index ffd45dad..0b2d3b7e 100644 --- a/src/nfc/qndefnfcsmartposterrecord.h +++ b/src/nfc/qndefnfcsmartposterrecord.h @@ -124,6 +124,7 @@ public: quint32 size() const; void setSize(quint32 size); + //TODO Qt 6 the mimetype should be QString as it is UTF-8 QByteArray typeInfo() const; void setTypeInfo(const QByteArray &type); -- cgit v1.2.3 From 8eafcc2d6960390d6784a1c5bb075d6314041fdf Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 12 Dec 2014 13:47:46 +0100 Subject: Bump version Change-Id: Ic018bf8b03e887da5448e0bcd6fdb18219fad184 --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 17a3a578..ccd239ad 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.4.0 +MODULE_VERSION = 5.4.1 -- cgit v1.2.3 From 6102f74e45ce4cd8792f323a06bdbab5f27fd106 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 09:11:04 +0100 Subject: QBluetoothLocalDevice - cleanup (OS X) Replace hand-written 'function signatures' with Q_FUNC_INFO. Change-Id: I0c05d9fa76d120b5626420cadafb1a9fe1227b95 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtdevicepair.mm | 28 ++++----- src/bluetooth/osx/osxbtdevicepair_p.h | 10 +--- src/bluetooth/qbluetoothlocaldevice_osx.mm | 96 ++++++++++++------------------ 3 files changed, 53 insertions(+), 81 deletions(-) diff --git a/src/bluetooth/osx/osxbtdevicepair.mm b/src/bluetooth/osx/osxbtdevicepair.mm index c9d6de32..ad00bb23 100644 --- a/src/bluetooth/osx/osxbtdevicepair.mm +++ b/src/bluetooth/osx/osxbtdevicepair.mm @@ -43,11 +43,9 @@ #include "osxbtutility_p.h" #include +#include #include -// Import to avoid problems with multiple inclusion (objc headers are not guarded against). -#import - QT_BEGIN_NAMESPACE namespace OSXBluetooth { @@ -82,10 +80,8 @@ using namespace QT_NAMESPACE; delegate:(OSXBluetooth::PairingDelegate *)object { if (self = [super init]) { - Q_ASSERT_X(!address.isNull(), "-initWithTarget:delegate", - "invalid target address"); - Q_ASSERT_X(object, "-initWithTarget:delegate:", - "invalid delegate (null)"); + Q_ASSERT_X(!address.isNull(), Q_FUNC_INFO, "invalid target address"); + Q_ASSERT_X(object, Q_FUNC_INFO, "invalid delegate (null)"); m_targetAddress = address; m_object = object; @@ -114,7 +110,7 @@ using namespace QT_NAMESPACE; if (m_active) return kIOReturnBusy; - Q_ASSERT_X(!m_targetAddress.isNull(), "-start", "invalid target address"); + Q_ASSERT_X(!m_targetAddress.isNull(), Q_FUNC_INFO, "invalid target address"); QT_BT_MAC_AUTORELEASEPOOL; @@ -122,15 +118,15 @@ using namespace QT_NAMESPACE; // Device is autoreleased. IOBluetoothDevice *const device = [IOBluetoothDevice deviceWithAddress:&iobtAddress]; if (!device) { - qCCritical(QT_BT_OSX) << "-start:, failed to create a device " + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create a device " "to pair with"; - return kIOReturnInternalError; // TODO: Find something more appropriate. + return kIOReturnError; } m_pairing = [[IOBluetoothDevicePair pairWithDevice:device] retain]; if (!m_pairing) { - qCCritical(QT_BT_OSX) << "-start, failed to create pair"; - return kIOReturnInternalError; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create pair"; + return kIOReturnError; } [m_pairing setDelegate:self]; @@ -169,7 +165,7 @@ using namespace QT_NAMESPACE; - (IOBluetoothDevice *)targetDevice { - return [m_pairing device];//It's retained/autoreleased by pair (?). + return [m_pairing device];//It's retained/autoreleased by pair. } // IOBluetoothDevicePairDelegate: @@ -195,8 +191,7 @@ using namespace QT_NAMESPACE; if (sender != m_pairing) // Can never happen. return; - Q_ASSERT_X(m_object, "-devicePairingUserConfirmationRequest:numericValue:", - "invalid delegate (null)"); + Q_ASSERT_X(m_object, Q_FUNC_INFO, "invalid delegate (null)"); m_object->requestUserConfirmation(self, numericValue); } @@ -210,8 +205,7 @@ using namespace QT_NAMESPACE; - (void)devicePairingFinished:(id)sender error:(IOReturn)error { - Q_ASSERT_X(m_object, "-devicePairingFinished:", - "invalid delegate (null)"); + Q_ASSERT_X(m_object, Q_FUNC_INFO, "invalid delegate (null)"); if (sender != m_pairing) // Can never happen though. return; diff --git a/src/bluetooth/osx/osxbtdevicepair_p.h b/src/bluetooth/osx/osxbtdevicepair_p.h index 843c58f4..334f0896 100644 --- a/src/bluetooth/osx/osxbtdevicepair_p.h +++ b/src/bluetooth/osx/osxbtdevicepair_p.h @@ -48,10 +48,8 @@ #include #include - -// This header is not guarded agains multiple includes ... -// We have to "import". -#import +// Only after Foundation.h: +#include "corebluetoothwrapper_p.h" @class QT_MANGLE_NAMESPACE(OSXBTPairing); @class IOBluetoothDevice; @@ -68,7 +66,6 @@ public: virtual ~PairingDelegate(); - // virtual void pairingStarted(ObjCPairingRequest *pair) = 0; virtual void connecting(ObjCPairingRequest *pair) = 0; virtual void requestPIN(ObjCPairingRequest *pair) = 0; virtual void requestUserConfirmation(ObjCPairingRequest *pair, @@ -87,12 +84,11 @@ QT_END_NAMESPACE @interface QT_MANGLE_NAMESPACE(OSXBTPairing) : NSObject { - // TODO: check how it works - C++ object as a member QT_PREPEND_NAMESPACE(QBluetoothAddress) m_targetAddress; bool m_active; IOBluetoothDevicePair *m_pairing; // The real pairing request - QT_PREPEND_NAMESPACE(OSXBluetooth::PairingDelegate) *m_object; + QT_PREPEND_NAMESPACE(OSXBluetooth)::PairingDelegate *m_object; } - (id)initWithTarget:(const QBluetoothAddress &)address diff --git a/src/bluetooth/qbluetoothlocaldevice_osx.mm b/src/bluetooth/qbluetoothlocaldevice_osx.mm index 38f15b8c..32562e94 100644 --- a/src/bluetooth/qbluetoothlocaldevice_osx.mm +++ b/src/bluetooth/qbluetoothlocaldevice_osx.mm @@ -47,18 +47,16 @@ #include #include +#include #include #include -#include -// We have to import, not include. Obj-C headers are not protected -// against a multiple inclusion. -#import -#import -#include +#include +// Only after Foundation.h: +#include "osx/corebluetoothwrapper_p.h" -// TODO: check how all these things work with threads. +#include QT_BEGIN_NAMESPACE @@ -115,13 +113,13 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice const QBluetoothAddress &address) : q_ptr(q) { - Q_ASSERT_X(q, "QBluetoothLocalDevicePrivate", "invalid q_ptr (null)"); + Q_ASSERT_X(q, Q_FUNC_INFO, "invalid q_ptr (null)"); QT_BT_MAC_AUTORELEASEPOOL; HostController defaultController([[IOBluetoothHostController defaultController] retain]); if (!defaultController) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), failed to " + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " "init a host controller object"; return; } @@ -129,21 +127,21 @@ QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice if (!address.isNull()) { NSString *const hciAddress = [defaultController addressAsString]; if (!hciAddress) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), " - "failed to obtain an address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "obtain an address"; return; } BluetoothDeviceAddress iobtAddress = {}; if (IOBluetoothNSStringToDeviceAddress(hciAddress, &iobtAddress) != kIOReturnSuccess) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), " - "invalid local device's address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "invalid " + "local device's address"; return; } if (address != OSXBluetooth::qt_address(&iobtAddress)) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate(), " - "invalid local device's address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "invalid " + "local device's address"; return; } } @@ -161,8 +159,8 @@ bool QBluetoothLocalDevicePrivate::isValid() const void QBluetoothLocalDevicePrivate::requestPairing(const QBluetoothAddress &address, Pairing pairing) { - Q_ASSERT_X(isValid(), "requestPairing()", "invalid local device"); - Q_ASSERT_X(!address.isNull(), "requestPairing()", "invalid device address"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid local device"); + Q_ASSERT_X(!address.isNull(), Q_FUNC_INFO, "invalid device address"); using OSXBluetooth::device_with_address; using OSXBluetooth::ObjCStrongReference; @@ -186,8 +184,8 @@ void QBluetoothLocalDevicePrivate::requestPairing(const QBluetoothAddress &addre if ([device isPaired]) { emitPairingFinished(address, pairing, true); } else if ([pos.value() start] != kIOReturnSuccess) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate::requestPairing(), " - "failed to start a new pairing request"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "start a new pairing request"; emitError(QBluetoothLocalDevice::PairingError, true); } return; @@ -198,8 +196,8 @@ void QBluetoothLocalDevicePrivate::requestPairing(const QBluetoothAddress &addre // it'll just finish with success (skipping any intermediate steps). PairingRequest newRequest([[ObjCPairingRequest alloc] initWithTarget:address delegate:this], false); if (!newRequest) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate::requestPairing(), " - "failed to allocate a new pairing request"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "allocate a new pairing request"; emitError(QBluetoothLocalDevice::PairingError, true); return; } @@ -208,16 +206,16 @@ void QBluetoothLocalDevicePrivate::requestPairing(const QBluetoothAddress &addre const IOReturn result = [newRequest start]; if (result != kIOReturnSuccess) { pairingRequests.erase(pos); - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevicePrivate::requestPairing(), " - "failed to start a new pairing request"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "start a new pairing request"; emitError(QBluetoothLocalDevice::PairingError, true); } } QBluetoothLocalDevice::Pairing QBluetoothLocalDevicePrivate::pairingStatus(const QBluetoothAddress &address)const { - Q_ASSERT_X(isValid(), "pairingStatus", "invalid local device"); - Q_ASSERT_X(!address.isNull(), "pairingStatus", "invalid address"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid local device"); + Q_ASSERT_X(!address.isNull(), Q_FUNC_INFO, "invalid address"); using OSXBluetooth::device_with_address; using OSXBluetooth::ObjCStrongReference; @@ -267,18 +265,16 @@ void QBluetoothLocalDevicePrivate::error(ObjCPairingRequest *pair, IOReturn erro { Q_UNUSED(pair) Q_UNUSED(errorCode) - // TODO: map from IOReturn to QBluetoothLocalDevice::Error. - // TODO: emit or invokeMethod??? + emitError(QBluetoothLocalDevice::PairingError, false); } void QBluetoothLocalDevicePrivate::pairingFinished(ObjCPairingRequest *pair) { - Q_ASSERT_X(pair, "QBluetoothLocalDevicePrivate::pairingFinished()", - "invalid pairing request (nil)"); + Q_ASSERT_X(pair, Q_FUNC_INFO, "invalid pairing request (nil)"); const QBluetoothAddress &deviceAddress = [pair targetAddress]; - Q_ASSERT_X(!deviceAddress.isNull(), "pairingFinished()", + Q_ASSERT_X(!deviceAddress.isNull(), Q_FUNC_INFO, "invalid target address"); emitPairingFinished(deviceAddress, QBluetoothLocalDevice::Paired, false); @@ -286,8 +282,6 @@ void QBluetoothLocalDevicePrivate::pairingFinished(ObjCPairingRequest *pair) void QBluetoothLocalDevicePrivate::deviceConnected(const QBluetoothAddress &deviceAddress) { - Q_ASSERT_X(q_ptr, "deviceConnected()", "invalid q_ptr (null)"); - if (!discoveredDevices.contains(deviceAddress)) discoveredDevices.append(deviceAddress); @@ -297,8 +291,6 @@ void QBluetoothLocalDevicePrivate::deviceConnected(const QBluetoothAddress &devi void QBluetoothLocalDevicePrivate::deviceDisconnected(const QBluetoothAddress &deviceAddress) { - Q_ASSERT_X(q_ptr, "deviceDisconnected()", "invalid q_ptr (null)"); - QList::iterator devicePos =std::find(discoveredDevices.begin(), discoveredDevices.end(), deviceAddress); @@ -312,9 +304,6 @@ void QBluetoothLocalDevicePrivate::deviceDisconnected(const QBluetoothAddress &d void QBluetoothLocalDevicePrivate::emitError(QBluetoothLocalDevice::Error error, bool queued) { - Q_ASSERT_X(q_ptr, "QBluetoothLocalDevicePrivate::error()", - "invalid q_ptr (null)"); - if (queued) { QMetaObject::invokeMethod(q_ptr, "error", Qt::QueuedConnection, Q_ARG(QBluetoothLocalDevice::Error, error)); @@ -326,8 +315,8 @@ void QBluetoothLocalDevicePrivate::emitError(QBluetoothLocalDevice::Error error, void QBluetoothLocalDevicePrivate::emitPairingFinished(const QBluetoothAddress &deviceAddress, Pairing pairing, bool queued) { - Q_ASSERT_X(!deviceAddress.isNull(), "pairingFinished()", "invalid target device address"); - Q_ASSERT_X(q_ptr, "pairingFinished()", "invalid q_ptr (null)"); + Q_ASSERT_X(!deviceAddress.isNull(), Q_FUNC_INFO, "invalid target device address"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); if (queued) { QMetaObject::invokeMethod(q_ptr, "pairingFinished", Qt::QueuedConnection, @@ -340,7 +329,7 @@ void QBluetoothLocalDevicePrivate::emitPairingFinished(const QBluetoothAddress & void QBluetoothLocalDevicePrivate::unpair(const QBluetoothAddress &deviceAddress) { - Q_ASSERT_X(!deviceAddress.isNull(), "unpair()", + Q_ASSERT_X(!deviceAddress.isNull(), Q_FUNC_INFO, "invalid target address"); emitPairingFinished(deviceAddress, QBluetoothLocalDevice::Unpaired, true); @@ -376,8 +365,7 @@ QString QBluetoothLocalDevice::name() const if (isValid()) { if (NSString *const nsn = [d_ptr->hostController nameAsString]) return QString::fromNSString(nsn); - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevice::name(), " - "failed to obtain a name"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to obtain a name"; } return QString(); @@ -391,11 +379,9 @@ QBluetoothAddress QBluetoothLocalDevice::address() const if (NSString *const nsa = [d_ptr->hostController addressAsString]) return QBluetoothAddress(OSXBluetooth::qt_address(nsa)); - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevice::address(), " - "failed to obtain an address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to obtain an address"; } else { - qCWarning(QT_BT_OSX) << "QBluetoothLocalDevice::address(), " - "invalid local device"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid local device"; } return QBluetoothAddress(); @@ -403,20 +389,16 @@ QBluetoothAddress QBluetoothLocalDevice::address() const void QBluetoothLocalDevice::powerOn() { - if (!isValid()) { - qCWarning(QT_BT_OSX) << "QBluetoothLocalDevice::powerOn() " - "invalid local device"; - } + if (!isValid()) + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid local device"; } void QBluetoothLocalDevice::setHostMode(QBluetoothLocalDevice::HostMode mode) { Q_UNUSED(mode) - if (!isValid()) { - qCWarning(QT_BT_OSX) << "QBluetoothLovalDevice::setHostMode() " - "invalid local device"; - } + if (!isValid()) + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid local device"; } QBluetoothLocalDevice::HostMode QBluetoothLocalDevice::hostMode() const @@ -461,7 +443,7 @@ QList QBluetoothLocalDevice::allDevices() QBluetoothLocalDevice defaultAdapter; if (!defaultAdapter.isValid() || defaultAdapter.address().isNull()) { - qCCritical(QT_BT_OSX) << "QBluetoothLocalDevice::allDevices(), no valid device found"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO <<"no valid device found"; return localDevices; } @@ -483,7 +465,7 @@ void QBluetoothLocalDevice::pairingConfirmation(bool confirmation) void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pairing pairing) { if (!isValid()) - qCWarning(QT_BT_OSX) << "QBluetoothLocalDevice::requestPairing(), invalid local device"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid local device"; if (!isValid() || address.isNull()) { d_ptr->emitError(PairingError, true); @@ -496,7 +478,7 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai QBluetoothLocalDevice::Pairing QBluetoothLocalDevice::pairingStatus(const QBluetoothAddress &address) const { if (!isValid()) - qCWarning(QT_BT_OSX) << "QBluetoothLocalDevice::pairingStatus(), invalid local device"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid local device"; if (!isValid() || address.isNull()) return Unpaired; -- cgit v1.2.3 From a007a6c6b40f14b4ad41130abbb445e45e919759 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 09:46:39 +0100 Subject: QBluetoothDeviceDiscoveryAgent - cleanup (OS X/iOS) Replace handwritten 'signatures' with Q_FUNC_INFO, remove spurious debug messages. Get rid of 'transient delegate' trick. Change-Id: I2c490271baba7247af11df128964b61d0255ef95 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbt.pri | 4 - src/bluetooth/osx/osxbtcentralmanagerdelegate.mm | 68 ----------- src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h | 68 ----------- src/bluetooth/osx/osxbtdeviceinquiry.mm | 45 +++---- src/bluetooth/osx/osxbtledeviceinquiry.mm | 65 ++++------ src/bluetooth/osx/osxbtledeviceinquiry_p.h | 7 +- .../qbluetoothdevicediscoveryagent_osx.mm | 131 ++++++--------------- 7 files changed, 80 insertions(+), 308 deletions(-) delete mode 100644 src/bluetooth/osx/osxbtcentralmanagerdelegate.mm delete mode 100644 src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 96ad3905..5f1dddec 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -12,7 +12,6 @@ CONFIG(osx) { osx/osxbtobexsession_p.h \ osx/osxbtledeviceinquiry_p.h \ osx/corebluetoothwrapper_p.h \ - osx/osxbtcentralmanagerdelegate_p.h \ osx/osxbtcentralmanager_p.h OBJECTIVE_SOURCES += osx/osxbtutility.mm \ @@ -27,17 +26,14 @@ CONFIG(osx) { osx/osxbtsocketlistener.mm \ osx/osxbtobexsession.mm \ osx/osxbtledeviceinquiry.mm \ - osx/osxbtcentralmanagerdelegate.mm \ osx/osxbtcentralmanager.mm } else { PRIVATE_HEADERS += osx/osxbtutility_p.h \ osx/osxbtledeviceinquiry_p.h \ osx/corebluetoothwrapper_p.h \ - osx/osxbtcentralmanagerdelegate_p.h \ osx/osxbtcentralmanager_p.h OBJECTIVE_SOURCES += osx/osxbtutility.mm \ osx/osxbtledeviceinquiry.mm \ - osx/osxbtcentralmanagerdelegate.mm \ osx/osxbtcentralmanager.mm } diff --git a/src/bluetooth/osx/osxbtcentralmanagerdelegate.mm b/src/bluetooth/osx/osxbtcentralmanagerdelegate.mm deleted file mode 100644 index c0735d53..00000000 --- a/src/bluetooth/osx/osxbtcentralmanagerdelegate.mm +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtBluetooth module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "osxbtcentralmanagerdelegate_p.h" - -@implementation QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) - -- (id)initWithManager:(CBCentralManager *)aManager -{ - if (self = [super init]) - manager = aManager; - - return self; -} - -- (void)centralManagerDidUpdateState:(CBCentralManager *)central -{ - Q_UNUSED(central) - - [self performSelectorOnMainThread:@selector(cleanup) withObject:nil waitUntilDone:NO]; -} - -- (void)cleanup -{ - [manager setDelegate:nil]; - [manager release]; - [self release]; -} - -@end diff --git a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h b/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h deleted file mode 100644 index 196e14d0..00000000 --- a/src/bluetooth/osx/osxbtcentralmanagerdelegate_p.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtBluetooth module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -// Foundation _MUST_ be included before 'wrapper' - -// SDK 10.9 is broken and requires this trick. -#include - -#include "corebluetoothwrapper_p.h" - -// CBCentralManager is quite special: before -centralManagerDidUpdateState: call -// (which is a callback) - we can not delete it. -// We usually release a manager in the -dealloc method. If the state was not updated yet, -// we create a temporary delegate (which also is becoming the owner of this manger), -// and later in the delegate's -centralManagerDidUpdateState: we are trying to finally release -// a manager. Otherwise, this thing dies even with ARC. - -// TODO: can not reproduce this crash anymore ... probably, this class will be removed soon. - -@interface QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) : NSObject -{ - CBCentralManager *manager; -} - -- (id)initWithManager:(CBCentralManager *)aManager; -- (void)centralManagerDidUpdateState:(CBCentralManager *)central; -- (void)cleanup; - -@end diff --git a/src/bluetooth/osx/osxbtdeviceinquiry.mm b/src/bluetooth/osx/osxbtdeviceinquiry.mm index c07a0671..12902e1a 100644 --- a/src/bluetooth/osx/osxbtdeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtdeviceinquiry.mm @@ -43,6 +43,7 @@ #include "osxbtutility_p.h" #include +#include #include @@ -71,17 +72,16 @@ using namespace QT_NAMESPACE; - (id)initWithDelegate:(OSXBluetooth::DeviceInquiryDelegate *)delegate { if (self = [super init]) { - Q_ASSERT_X(delegate, "-initWithDelegate:", "invalid device inquiry delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid device inquiry delegate (null)"); m_inquiry = [[IOBluetoothDeviceInquiry inquiryWithDelegate:self] retain]; if (m_inquiry) { - // TODO: something more reasonable required! [m_inquiry setInquiryLength:15]; [m_inquiry setUpdateNewDeviceNames:NO];//Useless, disable! m_delegate = delegate; } else { - qCCritical(QT_BT_OSX) << "-initWithDelegate:, failed to create " + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create " "a device inquiry"; } @@ -109,27 +109,22 @@ using namespace QT_NAMESPACE; - (IOReturn)start { - if (!m_inquiry) { - qCWarning(QT_BT_OSX) << "-start, m_inquiry is nil ..."; + if (!m_inquiry) return kIOReturnNoPower; - } - if (m_active) { - qCWarning(QT_BT_OSX) << "-start, already active ..."; + if (m_active) return kIOReturnBusy; - } m_active = true; - [m_inquiry clearFoundDevices];// TODO: implement update? + [m_inquiry clearFoundDevices]; const IOReturn result = [m_inquiry start]; if (result != kIOReturnSuccess) { - // QtBluetooth will probably convert an error in UnknownError, - // not really interesting. - qCWarning(QT_BT_OSX) << "-start, failed with " + // QtBluetooth will probably convert an error into UnknownError, + // loosing the actual information. + qCWarning(QT_BT_OSX) << Q_FUNC_INFO <<"failed with " "IOKit error code: " << result; m_active = false; - } else - qCDebug(QT_BT_OSX) << "-start, device inquiry started"; + } return result; } @@ -137,9 +132,7 @@ using namespace QT_NAMESPACE; - (IOReturn)stop { if (m_active) { - Q_ASSERT_X(m_inquiry, "-stop", "active but nil inquiry"); - - qCDebug(QT_BT_OSX) << "-stop, trying to stop device inquiry"; + Q_ASSERT_X(m_inquiry, Q_FUNC_INFO, "active but nil inquiry"); m_active = false; const IOReturn res = [m_inquiry stop]; @@ -162,18 +155,14 @@ using namespace QT_NAMESPACE; m_active = false; - Q_ASSERT_X(m_delegate, "-deviceInquiryComplete:error:aborted", - "invalid device inquiry delegate (null)"); + Q_ASSERT_X(m_delegate, Q_FUNC_INFO, "invalid device inquiry delegate (null)"); if (error != kIOReturnSuccess) { - // QtBluetooth has not too many errors, 'UnknownError' is not really - // useful, report error code here: - qCWarning(QT_BT_OSX) << "-deviceInquiryComplete:error:aborted:, " - "IOKit error code: " << error; + // QtBluetooth has not too many error codes, 'UnknownError' is not really + // useful, report the actual error code here: + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "IOKit error code: " << error; m_delegate->error(sender, error); } else { - qCDebug(QT_BT_OSX) << "-deviceInquiryComplete:error:aborted:, " - "device inquiry complete"; m_delegate->inquiryFinished(sender); } } @@ -184,9 +173,7 @@ using namespace QT_NAMESPACE; if (sender != m_inquiry) // Can never happen in the current version. return; - Q_ASSERT_X(m_delegate, "-deviceInquiryDeviceFound:device:", - "invalid device inquiry delegate (null)"); - + Q_ASSERT_X(m_delegate, Q_FUNC_INFO, "invalid device inquiry delegate (null)"); m_delegate->deviceFound(sender, device); } diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 2f5ec0bb..dd5a5c73 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -39,7 +39,6 @@ ** ****************************************************************************/ -#include "osxbtcentralmanagerdelegate_p.h" #include "osxbtledeviceinquiry_p.h" #include "qbluetoothdeviceinfo.h" #include "qbluetoothuuid.h" @@ -48,8 +47,6 @@ #include #include -// Foundation header is already included by this point -// (a workaround for a broken 10.9 SDK). #include "corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -130,14 +127,14 @@ using namespace QT_NAMESPACE; + (NSTimeInterval)inquiryLength { - // 10 seconds at the moment. There is no default 'time-out', - // CBCentralManager startScan does not stop if not asked. + // There is no default timeout, + // scan does not stop if not asked. return 10; } - (id)initWithDelegate:(OSXBluetooth::LEDeviceInquiryDelegate *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithWithDelegate:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { delegate = aDelegate; @@ -153,24 +150,13 @@ using namespace QT_NAMESPACE; - (void)dealloc { - typedef QT_MANGLE_NAMESPACE(OSXBTCentralManagerTransientDelegate) TransientDelegate; - [NSObject cancelPreviousPerformRequestsWithTarget:self]; if (manager) { - // -start was called. - if (pendingStart) { - // State was not updated yet, too early to release. - TransientDelegate *const transient = [[TransientDelegate alloc] initWithManager:manager]; - // On ARC the lifetime of a transient delegate will become a problem, since delegate itself - // is a weak reference in a manager. - [manager setDelegate:transient]; - } else { - [manager setDelegate:nil]; - if (isActive) - [manager stopScan]; - [manager release]; - } + [manager setDelegate:nil]; + if (isActive) + [manager stopScan]; + [manager release]; } [peripherals release]; @@ -180,11 +166,11 @@ using namespace QT_NAMESPACE; - (void)stopScan { // Scan's timeout. - Q_ASSERT_X(delegate, "-stopScan", "invalid delegate (null)"); - Q_ASSERT_X(manager, "-stopScan", "invalid central (nil)"); - Q_ASSERT_X(!pendingStart, "-stopScan", "invalid state"); - Q_ASSERT_X(!cancelled, "-stopScan", "invalid state"); - Q_ASSERT_X(isActive, "-stopScan", "invalid state"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(manager, Q_FUNC_INFO, "invalid central (nil)"); + Q_ASSERT_X(!pendingStart, Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(!cancelled, Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(isActive, Q_FUNC_INFO, "invalid state"); [manager setDelegate:nil]; [manager stopScan]; @@ -195,11 +181,11 @@ using namespace QT_NAMESPACE; - (bool)start { - Q_ASSERT_X(![self isActive], "-start", "LE device scan is already active"); - Q_ASSERT_X(delegate, "-start", "invalid delegate (null)"); + Q_ASSERT_X(![self isActive], Q_FUNC_INFO, "LE device scan is already active"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (!peripherals) { - qCCritical(QT_BT_OSX) << "-start, internal error (allocation problem)"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "internal error"; return false; } @@ -216,7 +202,7 @@ using namespace QT_NAMESPACE; manager = [CBCentralManager alloc]; manager = [manager initWithDelegate:self queue:nil]; if (!manager) { - qCCritical(QT_BT_OSX) << "-start, failed to create a central manager"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create a central manager"; return false; } @@ -225,10 +211,10 @@ using namespace QT_NAMESPACE; - (void)centralManagerDidUpdateState:(CBCentralManager *)central { - Q_ASSERT_X(delegate, "-centralManagerDidUpdateState:", "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (cancelled) { - Q_ASSERT_X(!isActive, "-centralManagerDidUpdateState:", "isActive is true"); + Q_ASSERT_X(!isActive, Q_FUNC_INFO, "isActive is true"); pendingStart = false; delegate->LEdeviceInquiryFinished(); return; @@ -309,18 +295,14 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - Q_ASSERT_X(delegate, "-centralManager:didDiscoverPeripheral:advertisementData:RSSI:", - "invalid delegate (null)"); - Q_ASSERT_X(isActive, "-centralManager:didDiscoverPeripheral:advertisementData:RSSI:", - "called while there is no active scan"); - Q_ASSERT_X(!pendingStart, "-centralManager:didDiscoverPeripheral:advertisementData:RSSI:", - "both pendingStart and isActive are true"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(isActive,Q_FUNC_INFO, "called while there is no active scan"); + Q_ASSERT_X(!pendingStart, Q_FUNC_INFO, "both pendingStart and isActive are true"); #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) if (!peripheral.identifier) { - qCWarning(QT_BT_OSX) << "-centramManager:didDiscoverPeripheral:advertisementData:RSSI:, " - "peripheral without NSUUID"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "peripheral without NSUUID"; return; } @@ -331,8 +313,7 @@ using namespace QT_NAMESPACE; } #else if (!peripheral.UUID) { - qCWarning(QT_BT_OSX) << "-centramManager:didDiscoverPeripheral:advertisementData:RSSI:, " - "peripheral without UUID"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "peripheral without UUID"; return; } diff --git a/src/bluetooth/osx/osxbtledeviceinquiry_p.h b/src/bluetooth/osx/osxbtledeviceinquiry_p.h index 20004d30..c8b6133e 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtledeviceinquiry_p.h @@ -47,9 +47,6 @@ #include #include -// The Foundation header must be included before -// corebluetoothwrapper_p.h - a workaround for a broken -// 10.9 SDK. #include @class QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry); @@ -88,7 +85,7 @@ QT_END_NAMESPACE @interface QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) : NSObject {// Protocols are adopted in the mm file. - QT_PREPEND_NAMESPACE(OSXBluetooth::LEDeviceInquiryDelegate) *delegate; + QT_PREPEND_NAMESPACE(OSXBluetooth)::LEDeviceInquiryDelegate *delegate; // TODO: scoped pointers/shared pointers? NSMutableDictionary *peripherals; // Found devices. @@ -101,7 +98,7 @@ QT_END_NAMESPACE bool isActive; } -- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::LEDeviceInquiryDelegate) *)aDelegate; +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::LEDeviceInquiryDelegate *)aDelegate; - (void)dealloc; // Actual scan can be delayed - we have to wait for a status update first. diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm index 6ccdd0ff..2c4a7acd 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm @@ -50,10 +50,13 @@ #include "qbluetoothuuid.h" #include +#include #include #include #include +#include +// Only after Foundation.h: #include "osx/corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -137,36 +140,32 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con lastError(QBluetoothDeviceDiscoveryAgent::NoError), inquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry) { - Q_ASSERT_X(q != Q_NULLPTR, "QBluetoothDeviceDiscoveryAgentPrivate()", - "invalid q_ptr (null)"); + Q_ASSERT_X(q != Q_NULLPTR, Q_FUNC_INFO, "invalid q_ptr (null)"); HostController controller([[IOBluetoothHostController defaultController] retain]); if (!controller || [controller powerState] != kBluetoothHCIPowerStateON) { - qCCritical(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate() " - "no default host controller or adapter is off"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "no default host " + "controller or adapter is off"; return; } DeviceInquiry newInquiry([[DeviceInquiryObjC alloc]initWithDelegate:this]); if (!newInquiry) { // Obj-C's way of "reporting errors": - qCCritical(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate() " - "failed to initialize an inquiry"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "initialize an inquiry"; return; } // OSXBTLEDeviceInquiry can be constructed even if LE is not supported - // at this stage it's only a memory allocation of the object itself, - // if it fails - we have some memory-related problems. + // if it fails - we have some memory-related problem. LEDeviceInquiry newInquiryLE([[LEDeviceInquiryObjC alloc] initWithDelegate:this]); if (!newInquiryLE) { - qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate() " - "failed to initialize a LE inquiry"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "initialize a LE inquiry"; return; } - qCDebug(QT_BT_OSX) << "host controller is in 'on' state, " - "discovery agent created successfully"; - hostController.reset(controller.take()); inquiry.reset(newInquiry.take()); inquiryLE.reset(newInquiryLE.take()); @@ -182,41 +181,28 @@ bool QBluetoothDeviceDiscoveryAgentPrivate::isValid() const // can fail to initialize some important data-members // (and the error is probably not even related to Bluetooth at all) // - say, allocation error - this is what meant here by valid/invalid. - - const bool valid = hostController && [hostController powerState] == kBluetoothHCIPowerStateON && inquiry; - qCDebug(QT_BT_OSX) << "private agent is valid state? "<error(lastError); - } else { - qCDebug(QT_BT_OSX) << "START: device inquiry started ..."; } } void QBluetoothDeviceDiscoveryAgentPrivate::startLE() { - Q_ASSERT_X(isValid(), "startLE()", "called on invalid device discovery agent"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "called on invalid device discovery agent"); Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, - "startLE()", "called with an invalid Bluetooth adapter"); + Q_FUNC_INFO, "called with an invalid Bluetooth adapter"); agentState = LEScan; if (![inquiryLE start]) { // We can be here only if we have some kind of resource allocation error, so we // do not emit finished, we emit error. - qCDebug(QT_BT_OSX) << "STARTLE: failed to start LE scan ..."; - setError(QBluetoothDeviceDiscoveryAgent::UnknownError, QObject::tr("device discovery agent, LE mode: " "resource allocation error")); agentState = NonActive; emit q_ptr->error(lastError); - } else { - qCDebug(QT_BT_OSX) << "STARTLE: scan started."; } } void QBluetoothDeviceDiscoveryAgentPrivate::stop() { - Q_ASSERT_X(isValid(), "stop()", "called on invalid device discovery agent"); - Q_ASSERT_X(isActive(), "stop()", "called whithout active inquiry"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "called on invalid device discovery agent"); + Q_ASSERT_X(isActive(), Q_FUNC_INFO, "called whithout active inquiry"); Q_ASSERT_X(lastError != QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError, - "stop()", "called with invalid bluetooth adapter"); + Q_FUNC_INFO, "called with invalid bluetooth adapter"); const bool prevStart = startPending; startPending = false; @@ -276,19 +255,15 @@ void QBluetoothDeviceDiscoveryAgentPrivate::stop() if (agentState == ClassicScan) { const IOReturn res = [inquiry stop]; if (res != kIOReturnSuccess) { - qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate::stop(), " - "failed to stop"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to stop"; startPending = prevStart; stopPending = false; setError(res, QObject::tr("device discovery agent: failed to stop")); emit q_ptr->error(lastError); - } else { - qCDebug(QT_BT_OSX) << "stop success on a classic device inquiry"; } } else { // Can be asynchronous (depending on a status update of CBCentralManager). // The call itself is always 'success'. - qCDebug(QT_BT_OSX) << "trying to stop LE scan ..."; [inquiryLE stop]; } } @@ -297,19 +272,16 @@ void QBluetoothDeviceDiscoveryAgentPrivate::inquiryFinished(IOBluetoothDeviceInq { Q_UNUSED(inq) - Q_ASSERT_X(isValid(), "inquiryFinished", "invalid device discovery agent"); //We can never be here. - Q_ASSERT_X(q_ptr, "inquiryFinished", "invalid q_ptr (null)"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid device discovery agent"); //We can never be here. // The subsequent start(LE) function (if any) // will (re)set the correct state. agentState = NonActive; if (stopPending && !startPending) { - qCDebug(QT_BT_OSX) << "inquiryFinished, stop pending, no pending start, emit canceled"; stopPending = false; emit q_ptr->canceled(); } else if (startPending) { - qCDebug(QT_BT_OSX) << "inquiryFinished, NO stop pending, pending start, re-starting"; startPending = false; stopPending = false; start(); @@ -318,7 +290,6 @@ void QBluetoothDeviceDiscoveryAgentPrivate::inquiryFinished(IOBluetoothDeviceInq // finished in a normal way (not cancelled). // startLE() will take care of old devices // not supporting Bluetooth 4.0. - qCDebug(QT_BT_OSX)<<"CLASSIC inquiryFinished, NO stop pending, starting LE"; startLE(); } } @@ -327,16 +298,13 @@ void QBluetoothDeviceDiscoveryAgentPrivate::error(IOBluetoothDeviceInquiry *inq, { Q_UNUSED(inq) - Q_ASSERT_X(isValid(), "error", "invalid device discovery agent"); - - qCDebug(QT_BT_OSX)<<"ERROR: got a native error code: "<error(lastError); } @@ -344,10 +312,9 @@ void QBluetoothDeviceDiscoveryAgentPrivate::deviceFound(IOBluetoothDeviceInquiry { Q_UNUSED(inq) - Q_ASSERT_X(isValid(), "deviceFound()", - "invalid device discovery agent"); - Q_ASSERT_X(device, "deviceFound()", "invalid IOBluetoothDevice (nil)"); - Q_ASSERT_X(agentState == ClassicScan, "deviceFound", + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid device discovery agent"); + Q_ASSERT_X(device, Q_FUNC_INFO, "invalid IOBluetoothDevice (nil)"); + Q_ASSERT_X(agentState == ClassicScan, Q_FUNC_INFO, "invalid agent state (expected classic scan)"); QT_BT_MAC_AUTORELEASEPOOL; @@ -355,8 +322,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::deviceFound(IOBluetoothDeviceInquiry // Let's collect some info about this device: const QBluetoothAddress deviceAddress(OSXBluetooth::qt_address([device getAddress])); if (deviceAddress.isNull()) { - qCWarning(QT_BT_OSX) << "QBluetoothDeviceDiscoveryAgentPrivate::deviceFound(), " - "invalid Bluetooth address"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid Bluetooth address"; return; } @@ -413,7 +379,8 @@ void QBluetoothDeviceDiscoveryAgentPrivate::setError(QBluetoothDeviceDiscoveryAg } } - qCDebug(QT_BT_OSX) << "error set: "<canceled(); } else if (startPending) { - qCDebug(QT_BT_OSX) << "LE scan finished, start pending, NO stop pending, re-start"; startPending = false; stopPending = false; start(); //Start from a classic scan again. } else { - qCDebug(QT_BT_OSX) << "LE scan finished, emit finished"; emit q_ptr->finished(); } } @@ -557,44 +517,31 @@ void QBluetoothDeviceDiscoveryAgent::start() { if (d_ptr->lastError != InvalidBluetoothAdapterError) { if (d_ptr->isValid()) { - qCDebug(QT_BT_OSX) << "DDA::start?"; - if (!isActive()) { - qCDebug(QT_BT_OSX) << "DDA::start!"; + if (!isActive()) d_ptr->start(); - } } else { // We previously failed to initialize d_ptr correctly: // either some memory allocation problem or // no BT adapter found. - qCDebug(QT_BT_OSX) << "start failed, invalid d_ptr"; d_ptr->setError(InvalidBluetoothAdapterError); emit error(InvalidBluetoothAdapterError); } - } else - qCDebug(QT_BT_OSX) << "start failed, invalid adapter"; + } } void QBluetoothDeviceDiscoveryAgent::stop() { if (d_ptr->isValid()) { - qCDebug(QT_BT_OSX) << "DDA::stop, is valid"; - if (isActive() && d_ptr->lastError != InvalidBluetoothAdapterError) { - qCDebug(QT_BT_OSX) << "DDA::stop, is active and no error..."; + if (isActive() && d_ptr->lastError != InvalidBluetoothAdapterError) d_ptr->stop(); - } - } else { - qCDebug(QT_BT_OSX) << "DDA::stop, d_ptr is not in valid state, can not stop"; } } bool QBluetoothDeviceDiscoveryAgent::isActive() const { - qCDebug(QT_BT_OSX) << "DDA::isActive"; - if (d_ptr->isValid()) { + if (d_ptr->isValid()) return d_ptr->isActive(); - } else { - qCDebug(QT_BT_OSX) << "DDA::isActive, d_ptr is invalid"; - } + return false; } -- cgit v1.2.3 From e5e5b853d6326952305b2471877a47bc083202b3 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 10:52:56 +0100 Subject: QBluetoothServiceDiscoveryAgent - cleanup (OS X) Use Q_FUNC_INFO in asserts/messages. Change-Id: I2d9429cff0b1cd5d28a04fe50328289a891d04f5 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtdeviceinquiry.mm | 1 - src/bluetooth/osx/osxbtdevicepair.mm | 1 - src/bluetooth/osx/osxbtsdpinquiry.mm | 35 +++++--------- .../qbluetoothservicediscoveryagent_osx.mm | 53 ++++++++++------------ 4 files changed, 34 insertions(+), 56 deletions(-) diff --git a/src/bluetooth/osx/osxbtdeviceinquiry.mm b/src/bluetooth/osx/osxbtdeviceinquiry.mm index 12902e1a..4f67b726 100644 --- a/src/bluetooth/osx/osxbtdeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtdeviceinquiry.mm @@ -43,7 +43,6 @@ #include "osxbtutility_p.h" #include -#include #include diff --git a/src/bluetooth/osx/osxbtdevicepair.mm b/src/bluetooth/osx/osxbtdevicepair.mm index ad00bb23..fdb95522 100644 --- a/src/bluetooth/osx/osxbtdevicepair.mm +++ b/src/bluetooth/osx/osxbtdevicepair.mm @@ -43,7 +43,6 @@ #include "osxbtutility_p.h" #include -#include #include QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/osx/osxbtsdpinquiry.mm b/src/bluetooth/osx/osxbtsdpinquiry.mm index 9cafd572..b460f929 100644 --- a/src/bluetooth/osx/osxbtsdpinquiry.mm +++ b/src/bluetooth/osx/osxbtsdpinquiry.mm @@ -48,11 +48,7 @@ #include #include -// We have to import - objc header files, no inclusion guards. -#import -#import -#import -#import +#include "corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -64,7 +60,7 @@ SDPInquiryDelegate::~SDPInquiryDelegate() QVariant extract_attribute_value(IOBluetoothSDPDataElement *dataElement) { - Q_ASSERT_X(dataElement, "extractAttributeValue()", "invalid data element (nil)"); + Q_ASSERT_X(dataElement, Q_FUNC_INFO, "invalid data element (nil)"); // TODO: error handling and diagnostic messages. @@ -158,7 +154,7 @@ using namespace OSXBluetooth; - (id)initWithDelegate:(SDPInquiryDelegate *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithDelegate:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { delegate = aDelegate; @@ -177,8 +173,7 @@ using namespace OSXBluetooth; - (IOReturn)performSDPQueryWithDevice:(const QBluetoothAddress &)address { - Q_ASSERT_X(!isActive, "-performSDPQueryWithDevice", - "SDP query in process"); + Q_ASSERT_X(!isActive, Q_FUNC_INFO, "SDP query in progress"); QList emptyFilter; return [self performSDPQueryWithDevice:address filters:emptyFilter]; @@ -187,10 +182,8 @@ using namespace OSXBluetooth; - (IOReturn)performSDPQueryWithDevice:(const QBluetoothAddress &)address filters:(const QList &)qtFilters { - Q_ASSERT_X(!isActive, "-performSDPQueryWithDevice:filters:", - "SDP query in progress"); - Q_ASSERT_X(!address.isNull(), "-performSDPQueryWithDevice:filters:", - "invalid target device address"); + Q_ASSERT_X(!isActive, Q_FUNC_INFO, "SDP query in progress"); + Q_ASSERT_X(!address.isNull(), Q_FUNC_INFO, "invalid target device address"); QT_BT_MAC_AUTORELEASEPOOL; @@ -199,8 +192,7 @@ using namespace OSXBluetooth; if (qtFilters.size()) { array.reset([[NSMutableArray alloc] init]); if (!array) { - qCCritical(QT_BT_OSX) << "-performSDPQueryWithDevices:filters:, " - "failed to allocate an uuid filter"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate an uuid filter"; return kIOReturnError; } @@ -211,8 +203,7 @@ using namespace OSXBluetooth; } if (int([array count]) != qtFilters.size()) { - qCCritical(QT_BT_OSX) << "-performSDPQueryWithDevices:filters:, " - << "failed to create an uuid filter"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create an uuid filter"; return kIOReturnError; } } @@ -220,8 +211,7 @@ using namespace OSXBluetooth; const BluetoothDeviceAddress iobtAddress(iobluetooth_address(address)); ObjCScopedPointer newDevice([[IOBluetoothDevice deviceWithAddress:&iobtAddress] retain]); if (!newDevice) { - qCCritical(QT_BT_OSX) << "-performSDPQueryWithDevices:filters:, " - << "failed to create an IOBluetoothDevice object"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create an IOBluetoothDevice object"; return kIOReturnError; } @@ -235,9 +225,7 @@ using namespace OSXBluetooth; result = [device performSDPQuery:self]; if (result != kIOReturnSuccess) { - qCCritical(QT_BT_OSX) << "-preformSDPQueryWithDevices:filters:, " - "failed to start an SDP query"; - + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to start an SDP query"; device = oldDevice.take(); } else { isActive = true; @@ -265,8 +253,7 @@ using namespace OSXBluetooth; if (device != aDevice) return; - Q_ASSERT_X(delegate, "-sdpQueryComplete:status:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); isActive = false; diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm index 9311df55..caa3942c 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm @@ -49,13 +49,13 @@ #include #include #include +#include #include #include -// We have to import obj-C headers, they are not guarded against a multiple inclusion. -#import -#import -#import +#include +// Only after Foundation.h +#include "osx/corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -130,10 +130,10 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(c void QBluetoothServiceDiscoveryAgentPrivate::startDeviceDiscovery() { - Q_ASSERT_X(q_ptr, "startDeviceDiscovery()", "invalid q_ptr (null)"); - Q_ASSERT_X(state == Inactive, "startDeviceDiscovery()", "invalid state"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); + Q_ASSERT_X(state == Inactive, Q_FUNC_INFO, "invalid state"); Q_ASSERT_X(error != QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError, - "startDeviceDiscovery()", "invalid bluetooth adapter"); + Q_FUNC_INFO, "invalid bluetooth adapter"); Q_ASSERT_X(deviceDiscoveryAgent.isNull(), "startDeviceDiscovery()", "discovery agent already exists"); @@ -146,11 +146,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::startDeviceDiscovery() void QBluetoothServiceDiscoveryAgentPrivate::stopDeviceDiscovery() { - Q_ASSERT_X(q_ptr, "stopDeviceDiscovery()", "invalid q_ptr (null)"); - Q_ASSERT_X(!deviceDiscoveryAgent.isNull(), "stopDeviceDiscovery()", + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); + Q_ASSERT_X(!deviceDiscoveryAgent.isNull(), Q_FUNC_INFO, "invalid device discovery agent (null)"); - Q_ASSERT_X(state == DeviceDiscovery, "stopDeviceDiscovery()", - "invalid state"); + Q_ASSERT_X(state == DeviceDiscovery, Q_FUNC_INFO, "invalid state"); deviceDiscoveryAgent->stop(); deviceDiscoveryAgent.reset(Q_NULLPTR); @@ -164,9 +163,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::startServiceDiscovery() // Any of 'Inactive'/'DeviceDiscovery'/'ServiceDiscovery' states // are possible. - Q_ASSERT_X(q_ptr, "startServiceDiscovery()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); Q_ASSERT_X(error != QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError, - "startServiceDiscovery()", "invalid bluetooth adapter"); + Q_FUNC_INFO, "invalid bluetooth adapter"); if (discoveredDevices.isEmpty()) { state = Inactive; @@ -210,8 +209,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::startServiceDiscovery() void QBluetoothServiceDiscoveryAgentPrivate::stopServiceDiscovery() { - Q_ASSERT_X(state != Inactive, "stopServiceDiscovery()", "invalid state"); - Q_ASSERT_X(q_ptr, "stopServiceDiscovery()", "invalid q_ptr (null)"); + Q_ASSERT_X(state != Inactive, Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); discoveredDevices.clear(); state = Inactive; @@ -256,7 +255,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscovered(const QBluetoot void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error) { - Q_ASSERT_X(q_ptr, "_q_deviceDiscoveryError()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); error = QBluetoothServiceDiscoveryAgent::UnknownError; errorString = tr("Unknown error while scanning for devices"); @@ -271,8 +270,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryError(QBluetoothD void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryFinished() { - Q_ASSERT_X(q_ptr, "_q_deviceDiscoveryFinished()", - "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); if (deviceDiscoveryAgent->error() != QBluetoothDeviceDiscoveryAgent::NoError) { //Forward the device discovery error @@ -295,7 +293,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_serviceDiscoveryFinished() void QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryFinished(IOBluetoothDevice *device) { - Q_ASSERT_X(device, "SDPInquiryFinished()", "invalid IOBluetoothDevice (nil)"); + Q_ASSERT_X(device, Q_FUNC_INFO, "invalid IOBluetoothDevice (nil)"); if (state == Inactive) return; @@ -305,8 +303,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryFinished(IOBluetoothDevic NSArray *const records = device.services; for (IOBluetoothSDPServiceRecord *record in records) { QBluetoothServiceInfo serviceInfo; - Q_ASSERT_X(discoveredDevices.size() >= 1, "SDPInquiryFinished()", - "invalid number of devices"); + Q_ASSERT_X(discoveredDevices.size() >= 1, Q_FUNC_INFO, "invalid number of devices"); serviceInfo.setDevice(discoveredDevices.at(0)); OSXBluetooth::extract_service_record(record, serviceInfo); @@ -331,8 +328,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryError(IOBluetoothDevice * { Q_UNUSED(device) - qCWarning(QT_BT_OSX) << "QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryError(), " - "inquiry failed with IOKit code: " << int(errorCode); + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "inquiry failed with IOKit code: " << int(errorCode); discoveredDevices.clear(); // TODO: find a better mapping from IOReturn to QBluetoothServiceDiscoveryAgent::Error. @@ -347,8 +343,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryError(IOBluetoothDevice * void QBluetoothServiceDiscoveryAgentPrivate::performMinimalServiceDiscovery(const QBluetoothAddress &deviceAddress) { - Q_ASSERT_X(!deviceAddress.isNull(), "performMinimalServiceDiscovery()", - "invalid device address"); + Q_ASSERT_X(!deviceAddress.isNull(), Q_FUNC_INFO, "invalid device address"); QT_BT_MAC_AUTORELEASEPOOL; @@ -365,7 +360,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::performMinimalServiceDiscovery(cons NSArray *const records = device.services; for (IOBluetoothSDPServiceRecord *record in records) { QBluetoothServiceInfo serviceInfo; - Q_ASSERT_X(discoveredDevices.size() >= 1, "SDPInquiryFinished()", + Q_ASSERT_X(discoveredDevices.size() >= 1, Q_FUNC_INFO, "invalid number of devices"); serviceInfo.setDevice(discoveredDevices.at(0)); @@ -389,11 +384,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::performMinimalServiceDiscovery(cons void QBluetoothServiceDiscoveryAgentPrivate::setupDeviceDiscoveryAgent() { - Q_ASSERT_X(q_ptr, "setupDeviceDiscoveryAgent()", - "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); Q_ASSERT_X(deviceDiscoveryAgent.isNull() || !deviceDiscoveryAgent->isActive(), - "setupDeviceDiscoveryAgent()", - "device discovery agent is active"); + Q_FUNC_INFO, "device discovery agent is active"); deviceDiscoveryAgent.reset(new QBluetoothDeviceDiscoveryAgent(localAdapterAddress, q_ptr)); -- cgit v1.2.3 From 95d7d8f941866f980c495ad906731b396f24c55a Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 11:15:24 +0100 Subject: QBluetoothServiceInfo - cleanup (OS X) Use Q_FUNC_INFO in asserts/messages. Change-Id: Ie766016a36c3cc47d4561a74ed8bf179357a19df Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtservicerecord.mm | 50 ++++++++++-------------------- src/bluetooth/qbluetoothserviceinfo_osx.mm | 28 +++++++---------- 2 files changed, 28 insertions(+), 50 deletions(-) diff --git a/src/bluetooth/osx/osxbtservicerecord.mm b/src/bluetooth/osx/osxbtservicerecord.mm index 84e60f75..a0930ae9 100644 --- a/src/bluetooth/osx/osxbtservicerecord.mm +++ b/src/bluetooth/osx/osxbtservicerecord.mm @@ -47,10 +47,7 @@ #include #include -#include - -// Import, since it's Objective-C header (no inclusion guards). -#import +#include "corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -146,7 +143,7 @@ Number variant_to_nsnumber(const QVariant &var) template void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_attribute", "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); if (!var.canConvert()) return; @@ -158,7 +155,7 @@ void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) template<> void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_attribute", "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); if (!var.canConvert()) return; @@ -173,7 +170,7 @@ void add_attribute(const QVariant &var, AttributeId key, Dictionary dic template<> void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_attribute", "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); if (!var.canConvert()) return; @@ -185,7 +182,7 @@ void add_attribute(const QVariant &var, AttributeId key, Diction template<> void add_attribute(const QVariant &var, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_attribute", "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); if (!var.canConvert()) return; @@ -203,7 +200,7 @@ void add_attribute(const QVariant &var, NSMutableArray *list); template void add_attribute(const QVariant &var, NSMutableArray *list) { - Q_ASSERT_X(list, "add_attribute", "invalid list (nil)"); + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (!var.canConvert()) return; @@ -215,7 +212,7 @@ void add_attribute(const QVariant &var, NSMutableArray *list) template<> void add_attribute(const QVariant &var, NSMutableArray *list) { - Q_ASSERT_X(list, "add_attribute", "invalid list (nil)"); + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (!var.canConvert()) return; @@ -230,7 +227,7 @@ void add_attribute(const QVariant &var, NSMutableArray *list) template<> void add_attribute(const QVariant &var, NSMutableArray *list) { - Q_ASSERT_X(list, "add_attribute", "invalid list (nil)"); + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (!var.canConvert()) return; @@ -242,7 +239,7 @@ void add_attribute(const QVariant &var, NSMutableArray *list) template<> void add_attribute(const QVariant &var, NSMutableArray *list) { - Q_ASSERT_X(list, "add_attribute", "invalid list (nil)"); + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (!var.canConvert()) return; @@ -254,13 +251,10 @@ void add_attribute(const QVariant &var, NSMutableArray *list) void add_rfcomm_protocol_descriptor_list(uint16 channelID, Dictionary dict) { - Q_ASSERT_X(dict, "add_rfcomm_protocol_descriptor_list", - "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); QT_BT_MAC_AUTORELEASEPOOL; - // TODO: error handling? - // Objective-C has literals (for arrays and dictionaries), but it will not compile // on 10.7 or below, so quite a lot of code here. @@ -288,13 +282,10 @@ void add_rfcomm_protocol_descriptor_list(uint16 channelID, Dictionary dict) void add_l2cap_protocol_descriptor_list(uint16 psm, Dictionary dict) { - Q_ASSERT_X(dict, "add_l2cap_protocol_descriptor_list", - "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); QT_BT_MAC_AUTORELEASEPOOL; - // TODO: error handling? - // Objective-C has literals (for arrays and dictionaries), but it will not compile // on 10.7 or below, so quite a lot of code here. @@ -317,10 +308,7 @@ void add_l2cap_protocol_descriptor_list(uint16 psm, Dictionary dict) bool add_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) { - Q_ASSERT_X(list, "add_attribute", "invalid list (nil)"); - - // TODO: test if it works at all - add an attribute - // (some NSObject) into the sequence. + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (var.canConvert()) return false; @@ -333,7 +321,7 @@ bool add_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) } else { // Here we need 'key' to understand the type. // We can have different integer types actually, so I have to check - // the 'key' to be sure conversion is reasonable. + // the 'key' to be sure the conversion is reasonable. switch (key) { case QSInfo::ServiceRecordHandle: case QSInfo::ServiceRecordState: @@ -357,7 +345,7 @@ bool add_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) bool add_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_attribute", "invalid dict (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dict (nil)"); const QVariant var(serviceInfo.attribute(key)); if (var.canConvert()) @@ -370,7 +358,7 @@ bool add_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeId key, Di add_attribute(serviceInfo.attribute(key), key, dict); } else { // We can have different integer types actually, so I have to check - // the 'key' to be sure conversion is reasonable. + // the 'key' to be sure the conversion is reasonable. switch (key) { case QSInfo::ServiceRecordHandle: case QSInfo::ServiceRecordState: @@ -395,7 +383,7 @@ bool add_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeId key, Di bool add_sequence_attribute(const QVariant &var, AttributeId key, NSMutableArray *list) { // Add a "nested" sequence. - Q_ASSERT_X(list, "add_sequence_attribute", "invalid list (nil)"); + Q_ASSERT_X(list, Q_FUNC_INFO, "invalid list (nil)"); if (var.isNull() || !var.canConvert()) return false; @@ -416,7 +404,7 @@ bool add_sequence_attribute(const QVariant &var, AttributeId key, NSMutableArray bool add_sequence_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeId key, Dictionary dict) { - Q_ASSERT_X(dict, "add_sequence_attribute", "invalid dictionary (nil)"); + Q_ASSERT_X(dict, Q_FUNC_INFO, "invalid dictionary (nil)"); const QVariant &var(serviceInfo.attribute(key)); if (var.isNull() || !var.canConvert()) @@ -451,8 +439,6 @@ Dictionary iobluetooth_service_dictionary(const QBluetoothServiceInfo &serviceIn foreach (quint16 key, attributeIds) { if (key == QSInfo::ProtocolDescriptorList) // We handle it in a special way. continue; - //if (key == QSInfo::BluetoothProfileDescriptorList) - // continue; // TODO: check if non-sequence QVariant still must be // converted into NSArray for some attribute ID. if (!add_sequence_attribute(serviceInfo, AttributeId(key), dict)) @@ -466,8 +452,6 @@ Dictionary iobluetooth_service_dictionary(const QBluetoothServiceInfo &serviceIn add_rfcomm_protocol_descriptor_list(serviceInfo.serverChannel(), dict); } - // BluetoothProfileDescriptorList. - return dict; } diff --git a/src/bluetooth/qbluetoothserviceinfo_osx.mm b/src/bluetooth/qbluetoothserviceinfo_osx.mm index ae88b4e7..1240df18 100644 --- a/src/bluetooth/qbluetoothserviceinfo_osx.mm +++ b/src/bluetooth/qbluetoothserviceinfo_osx.mm @@ -52,8 +52,9 @@ #include #include -// Import, it's Objective-C header (no inclusion guards). -#import +#include +// Only after Foundation.h: +#include "osx/corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -115,7 +116,7 @@ QBluetoothServiceInfoPrivate::QBluetoothServiceInfoPrivate(QBluetoothServiceInfo registered(false), serviceRecordHandle(0) { - Q_ASSERT_X(q, "QBluetoothServiceInfoPrivate()", "invalid q_ptr (null)"); + Q_ASSERT_X(q, Q_FUNC_INFO, "invalid q_ptr (null)"); } bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &localAdapter) @@ -125,8 +126,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca if (registered) return false; - Q_ASSERT_X(!serviceRecord, "QBluetoothServiceInfoPrivate::registerService()", - "not registered, but serviceRecord is not nil"); + Q_ASSERT_X(!serviceRecord, Q_FUNC_INFO, "not registered, but serviceRecord is not nil"); using namespace OSXBluetooth; @@ -134,8 +134,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca serviceDict(iobluetooth_service_dictionary(*q_ptr)); if (!serviceDict) { - qCWarning(QT_BT_OSX) << "QBluetoothServiceInfoPrivate::registerService(), " - "failed to create a service dictionary"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to create a service dictionary"; return false; } @@ -148,8 +147,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca // With ARC this will require a different cast? const IOReturn status = IOBluetoothAddServiceDict((CFDictionaryRef)serviceDict.data(), &recordRef); if (status != kIOReturnSuccess) { - qCWarning(QT_BT_OSX) << "QBluetoothServiceInfoPrivate::registerService(), " - "failed to register a service record"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; return false; } @@ -159,8 +157,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca #endif if (!newRecord) { - qCWarning(QT_BT_OSX) << "QBluetoothServiceInfoPrivate::registerService(), " - "failed to register a service record"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; // In case of SDK < 10.9 it's not possible to remove a service record ... // no way to obtain record handle yet. return false; @@ -168,8 +165,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca BluetoothSDPServiceRecordHandle newRecordHandle = 0; if ([newRecord getServiceRecordHandle:&newRecordHandle] != kIOReturnSuccess) { - qCWarning(QT_BT_OSX) << "QBluetoothServiceInfoPrivate::registerService(), " - "failed to register a service record"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) [newRecord removeServiceRecord]; #endif @@ -204,8 +200,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca #else IOBluetoothRemoveServiceWithRecordHandle(newRecordHandle); #endif - qCWarning(QT_BT_OSX) << "QBluetoothServiceInfoPrivate::registerService(), " - "failed to register a service record"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; return false; } @@ -229,8 +224,7 @@ bool QBluetoothServiceInfoPrivate::unregisterService() if (!registered) return false; - Q_ASSERT_X(serviceRecord, "QBluetoothServiceInfoPrivate::unregisterService()", - "service registered, but serviceRecord is nil"); + Q_ASSERT_X(serviceRecord, Q_FUNC_INFO, "service registered, but serviceRecord is nil"); #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) [serviceRecord removeServiceRecord]; -- cgit v1.2.3 From 67ec0d836cd67089b5f344544a8998b542411dbc Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 12:11:25 +0100 Subject: QBluetoothSocket - cleanup (OS X) Use Q_FUNC_INFO instead of handwritten 'signatures' in asserts/messages. Change-Id: I639b4293b86120ddc260d3c9e85fd50340afbf60 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtl2capchannel.mm | 43 +++++++++++----------------- src/bluetooth/osx/osxbtl2capchannel_p.h | 19 ++++++------- src/bluetooth/osx/osxbtrfcommchannel.mm | 47 +++++++++++-------------------- src/bluetooth/osx/osxbtrfcommchannel_p.h | 13 ++++----- src/bluetooth/qbluetoothsocket_osx.mm | 48 ++++++++++++++++---------------- 5 files changed, 73 insertions(+), 97 deletions(-) diff --git a/src/bluetooth/osx/osxbtl2capchannel.mm b/src/bluetooth/osx/osxbtl2capchannel.mm index e0b38dfe..c62efc50 100644 --- a/src/bluetooth/osx/osxbtl2capchannel.mm +++ b/src/bluetooth/osx/osxbtl2capchannel.mm @@ -55,7 +55,7 @@ using namespace QT_NAMESPACE; - (id)initWithDelegate:(OSXBluetooth::ChannelDelegate *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithDelegate:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { delegate = aDelegate; @@ -72,8 +72,8 @@ using namespace QT_NAMESPACE; { // This type of channel does not require connect, it's created with // already open channel. - Q_ASSERT_X(aDelegate, "-initWithDelegate:channel:", "invalid delegate (null)"); - Q_ASSERT_X(channel, "-initWithDelegate:channel:", "invalid channel (nil)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(channel, Q_FUNC_INFO, "invalid channel (nil)"); if (self = [super init]) { delegate = aDelegate; @@ -108,15 +108,13 @@ using namespace QT_NAMESPACE; withPSM:(BluetoothL2CAPChannelID)psm { if (address.isNull()) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withPSM:, " - "invalid peer address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "invalid peer address"; return kIOReturnNoDevice; } // Can never be called twice. if (connected || device || channel) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withPSM:, " - "connection is already active"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "connection is already active"; return kIOReturnStillOpen; } @@ -125,15 +123,13 @@ using namespace QT_NAMESPACE; const BluetoothDeviceAddress iobtAddress = OSXBluetooth::iobluetooth_address(address); device = [IOBluetoothDevice deviceWithAddress:&iobtAddress]; if (!device) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withPSM:, " - "failed to create a device"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create a device"; return kIOReturnNoDevice; } const IOReturn status = [device openL2CAPChannelAsync:&channel withPSM:psm delegate:self]; if (status != kIOReturnSuccess) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withPSM:, " - "failed to open L2CAP channel"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to open L2CAP channel"; // device is still autoreleased. device = nil; return status; @@ -152,8 +148,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(l2capChannel) - Q_ASSERT_X(delegate, "-l2capChannelData:data:length", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (dataPointer && dataLength) delegate->readChannelData(dataPointer, dataLength); @@ -164,8 +159,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(l2capChannel) - Q_ASSERT_X(delegate, "-l2capChannelOpenComplete:status:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (error != kIOReturnSuccess) { delegate->setChannelError(error); @@ -179,7 +173,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(l2capChannel) - Q_ASSERT_X(delegate, "-l2capChannelClosed:", "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->channelClosed(); connected = false; } @@ -195,8 +189,7 @@ using namespace QT_NAMESPACE; Q_UNUSED(l2capChannel) Q_UNUSED(refcon) - Q_ASSERT_X(delegate, "-l2capChannelWriteComplete:refcon:status", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (error != kIOReturnSuccess) delegate->setChannelError(error); @@ -243,20 +236,18 @@ using namespace QT_NAMESPACE; - (IOReturn) writeSync:(void*)data length:(UInt16)length { - Q_ASSERT_X(data, "-writeSync:length:", "invalid data (null)"); - Q_ASSERT_X(length, "-writeSync:length:", "invalid data size"); - Q_ASSERT_X(connected && channel, "-writeSync:", - "invalid L2CAP channel"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(length, Q_FUNC_INFO, "invalid data size"); + Q_ASSERT_X(connected && channel, Q_FUNC_INFO, "invalid L2CAP channel"); return [channel writeSync:data length:length]; } - (IOReturn) writeAsync:(void*)data length:(UInt16)length { - Q_ASSERT_X(data, "-writeAsync:length:", "invalid data (null)"); - Q_ASSERT_X(length, "-writeAync:length:", "invalid data size"); - Q_ASSERT_X(connected && channel, "-writeAsync:length:", - "invalid L2CAP channel"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(length, Q_FUNC_INFO, "invalid data size"); + Q_ASSERT_X(connected && channel, Q_FUNC_INFO, "invalid L2CAP channel"); return [channel writeAsync:data length:length refcon:Q_NULLPTR]; } diff --git a/src/bluetooth/osx/osxbtl2capchannel_p.h b/src/bluetooth/osx/osxbtl2capchannel_p.h index 96ea985e..4888be56 100644 --- a/src/bluetooth/osx/osxbtl2capchannel_p.h +++ b/src/bluetooth/osx/osxbtl2capchannel_p.h @@ -44,10 +44,9 @@ #include -// Must be imported (Obj-C header, no inclusion guards). -#import - #include +// Only after Foundation.h: +#include "corebluetoothwrapper_p.h" #include @@ -67,20 +66,20 @@ QT_END_NAMESPACE @interface QT_MANGLE_NAMESPACE(OSXBTL2CAPChannel) : NSObject { - QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *delegate; + QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *delegate; IOBluetoothDevice *device; IOBluetoothL2CAPChannel *channel; bool connected; } -- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *)aDelegate; -- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *)aDelegate +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *)aDelegate; +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *)aDelegate channel:(IOBluetoothL2CAPChannel *)aChannel; - (void)dealloc; -// A single async connection (connect can be called only once). -- (IOReturn)connectAsyncToDevice:(const QBluetoothAddress &)address +// Async. connection (connect can be called only once). +- (IOReturn)connectAsyncToDevice:(const QT_PREPEND_NAMESPACE(QBluetoothAddress) &)address withPSM:(BluetoothL2CAPChannelID)psm; // IOBluetoothL2CAPChannelDelegate: @@ -102,12 +101,12 @@ QT_END_NAMESPACE // Writes the given data synchronously over the target L2CAP channel to the remote // device. -// The length of the data may not exceed the L2CAP channel's ougoing MTU. +// The length of the data may not exceed the L2CAP channel's outgoing MTU. // This method will block until the data has been successfully sent to the // hardware for transmission (or an error occurs). - (IOReturn) writeSync:(void*)data length:(UInt16)length; -// The length of the data may not exceed the L2CAP channel's ougoing MTU. +// The length of the data may not exceed the L2CAP channel's outgoing MTU. // When the data has been successfully passed to the hardware to be transmitted, // the delegate method -l2capChannelWriteComplete:refcon:status: will be called. // Returns kIOReturnSuccess if the data was buffered successfully. diff --git a/src/bluetooth/osx/osxbtrfcommchannel.mm b/src/bluetooth/osx/osxbtrfcommchannel.mm index 996b4ebf..df1fd433 100644 --- a/src/bluetooth/osx/osxbtrfcommchannel.mm +++ b/src/bluetooth/osx/osxbtrfcommchannel.mm @@ -44,10 +44,6 @@ #include "qbluetoothaddress.h" #include "osxbtutility_p.h" -// Import, it's Obj-C header. -#import - - #ifdef QT_NAMESPACE using namespace QT_NAMESPACE; #endif @@ -56,7 +52,7 @@ using namespace QT_NAMESPACE; - (id)initWithDelegate:(OSXBluetooth::ChannelDelegate *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithDelegate:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { delegate = aDelegate; @@ -73,8 +69,8 @@ using namespace QT_NAMESPACE; { // This type of channel does not require connect, it's created with // already open channel. - Q_ASSERT_X(aDelegate, "-initWithDelegate:channel:", "invalid delegate (null)"); - Q_ASSERT_X(aChannel, "-initWithDelegate:channel:", "invalid channel (nil)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(aChannel, Q_FUNC_INFO, "invalid channel (nil)"); if (self = [super init]) { delegate = aDelegate; @@ -105,15 +101,13 @@ using namespace QT_NAMESPACE; withChannelID:(BluetoothRFCOMMChannelID)channelID { if (address.isNull()) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withChannelID:, " - "invalid peer address"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "invalid peer address"; return kIOReturnNoDevice; } // Can never be called twice. if (connected || device || channel) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withChannelID:, " - "connection is already active"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "connection is already active"; return kIOReturnStillOpen; } @@ -122,16 +116,14 @@ using namespace QT_NAMESPACE; const BluetoothDeviceAddress iobtAddress = OSXBluetooth::iobluetooth_address(address); device = [IOBluetoothDevice deviceWithAddress:&iobtAddress]; if (!device) { // TODO: do I always check this BTW??? Apple's docs say nothing about nil. - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withChannelID:, " - "failed to create a device"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to create a device"; return kIOReturnNoDevice; } const IOReturn status = [device openRFCOMMChannelAsync:&channel withChannelID:channelID delegate:self]; if (status != kIOReturnSuccess) { - qCCritical(QT_BT_OSX) << "-connectAsyncToDevice:withChannelID:, " - "failed to open L2CAP channel"; + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "failed to open L2CAP channel"; // device is still autoreleased. device = nil; return status; @@ -148,8 +140,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(rfcommChannel) - Q_ASSERT_X(delegate, "-rfcommChannelData:data:length:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); // Not sure if it can ever happen and if // assert is better. @@ -164,8 +155,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(rfcommChannel) - Q_ASSERT_X(delegate, "-rfcommChannelOpenComplete:status:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (error != kIOReturnSuccess) { delegate->setChannelError(error); @@ -179,7 +169,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(rfcommChannel) - Q_ASSERT_X(delegate, "rfcommChannelClosed:", "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->channelClosed(); connected = false; } @@ -200,8 +190,7 @@ using namespace QT_NAMESPACE; Q_UNUSED(rfcommChannel) Q_UNUSED(refcon) - Q_ASSERT_X(delegate, "-rfcommChannelWriteComplete:refcon:status:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); if (error != kIOReturnSuccess) delegate->setChannelError(error); @@ -250,20 +239,18 @@ using namespace QT_NAMESPACE; - (IOReturn) writeSync:(void*)data length:(UInt16)length { - Q_ASSERT_X(data, "-writeSync:length:", "invalid data (null)"); - Q_ASSERT_X(length, "-writeSync:length:", "invalid data size"); - Q_ASSERT_X(connected && channel, "-writeSync:", - "invalid RFCOMM channel"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(length, Q_FUNC_INFO, "invalid data size"); + Q_ASSERT_X(connected && channel, Q_FUNC_INFO, "invalid RFCOMM channel"); return [channel writeSync:data length:length]; } - (IOReturn) writeAsync:(void*)data length:(UInt16)length { - Q_ASSERT_X(data, "-writeAsync:length:", "invalid data (null)"); - Q_ASSERT_X(length, "-writeAync:length:", "invalid data size"); - Q_ASSERT_X(connected && channel, "-writeAsync:length:", - "invalid RFCOMM channel"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(length, Q_FUNC_INFO, "invalid data size"); + Q_ASSERT_X(connected && channel, Q_FUNC_INFO, "invalid RFCOMM channel"); return [channel writeAsync:data length:length refcon:Q_NULLPTR]; } diff --git a/src/bluetooth/osx/osxbtrfcommchannel_p.h b/src/bluetooth/osx/osxbtrfcommchannel_p.h index 869c9fb3..21c1711c 100644 --- a/src/bluetooth/osx/osxbtrfcommchannel_p.h +++ b/src/bluetooth/osx/osxbtrfcommchannel_p.h @@ -44,10 +44,9 @@ #include -// Has to be imported, Obj-C header, no inclusion guards. -#import - #include +// Only after Foundation.h: +#include "corebluetoothwrapper_p.h" @class QT_MANGLE_NAMESPACE(OSXBTRFCOMMChannel); @class IOBluetoothDevice; @@ -66,20 +65,20 @@ QT_END_NAMESPACE @interface QT_MANGLE_NAMESPACE(OSXBTRFCOMMChannel) : NSObject { - QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *delegate; + QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *delegate; IOBluetoothDevice *device; IOBluetoothRFCOMMChannel *channel; bool connected; } -- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *)aDelegate; -- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::ChannelDelegate) *)aDelegate +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *)aDelegate; +- (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::ChannelDelegate *)aDelegate channel:(IOBluetoothRFCOMMChannel *)aChannel; - (void)dealloc; // A single async connection (can connect only once). -- (IOReturn)connectAsyncToDevice:(const QBluetoothAddress &)address +- (IOReturn)connectAsyncToDevice:(const QT_PREPEND_NAMESPACE(QBluetoothAddress) &)address withChannelID:(BluetoothRFCOMMChannelID)channelID; - (void)rfcommChannelData:(IOBluetoothRFCOMMChannel*)rfcommChannel diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 027c7e37..2bdd1291 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -85,7 +85,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, Q_ASSERT_X(state == QBluetoothSocket::ServiceLookupState || state == QBluetoothSocket::UnconnectedState, - "connectToService()", "invalid state"); + Q_FUNC_INFO, "invalid state"); socketError = QBluetoothSocket::NoSocketError; errorString.clear(); @@ -157,7 +157,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, void QBluetoothSocketPrivate::close() { // Can never be called while we're in connectToService: - Q_ASSERT_X(!isConnecting, "close()", "internal inconsistency - " + Q_ASSERT_X(!isConnecting, Q_FUNC_INFO, "internal inconsistency - " "still in connectToService()"); // Only go through closing if the socket was fully opened @@ -171,7 +171,7 @@ void QBluetoothSocketPrivate::close() void QBluetoothSocketPrivate::abort() { // Can never be called while we're in connectToService: - Q_ASSERT_X(!isConnecting, "abort()", "internal inconsistency - " + Q_ASSERT_X(!isConnecting, Q_FUNC_INFO, "internal inconsistency - " "still in connectToService()"); if (socketType == QBluetoothServiceInfo::RfcommProtocol) @@ -240,10 +240,10 @@ void QBluetoothSocketPrivate::_q_writeNotify() { Q_ASSERT_X(socketType == QBluetoothServiceInfo::L2capProtocol || socketType == QBluetoothServiceInfo::RfcommProtocol, - "_q_writeNotify()", "invalid socket type"); - Q_ASSERT_X(l2capChannel || rfcommChannel, "_q_writeNotify()", + Q_FUNC_INFO, "invalid socket type"); + Q_ASSERT_X(l2capChannel || rfcommChannel, Q_FUNC_INFO, "invalid socket (no open channel)"); - Q_ASSERT_X(q_ptr, "_q_writeNotify()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); if (txBuffer.size()) { const bool isL2CAP = socketType == QBluetoothServiceInfo::L2capProtocol; @@ -281,7 +281,7 @@ bool QBluetoothSocketPrivate::setChannel(IOBluetoothRFCOMMChannel *channel) // It must be a newborn socket! Q_ASSERT_X(socketError == QBluetoothSocket::NoSocketError && state == QBluetoothSocket::UnconnectedState && !rfcommChannel && !l2capChannel, - "QBluetoothSocketPrivate::setChannel()", "unexpected socket state"); + Q_FUNC_INFO, "unexpected socket state"); openMode = QIODevice::ReadWrite; rfcommChannel.reset([[ObjCRFCOMMChannel alloc] initWithDelegate:this channel:channel]); @@ -305,7 +305,7 @@ bool QBluetoothSocketPrivate::setChannel(IOBluetoothL2CAPChannel *channel) // It must be a newborn socket! Q_ASSERT_X(socketError == QBluetoothSocket::NoSocketError && state == QBluetoothSocket::UnconnectedState && !l2capChannel && !rfcommChannel, - "QBluetoothSocketPrivate::setChannel()", "unexpected socket state"); + Q_FUNC_INFO, "unexpected socket state"); openMode = QIODevice::ReadWrite; l2capChannel.reset([[ObjCL2CAPChannel alloc] initWithDelegate:this channel:channel]); @@ -323,7 +323,7 @@ void QBluetoothSocketPrivate::setChannelError(IOReturn errorCode) { Q_UNUSED(errorCode) - Q_ASSERT_X(q_ptr, "setChannelError()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); if (isConnecting) { // The delegate's method was called while we are still in @@ -336,7 +336,7 @@ void QBluetoothSocketPrivate::setChannelError(IOReturn errorCode) void QBluetoothSocketPrivate::channelOpenComplete() { - Q_ASSERT_X(q_ptr, "channelOpenComplete()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); if (!isConnecting) { q_ptr->setSocketState(QBluetoothSocket::ConnectedState); @@ -351,7 +351,7 @@ void QBluetoothSocketPrivate::channelOpenComplete() void QBluetoothSocketPrivate::channelClosed() { - Q_ASSERT_X(q_ptr, "channelClosed()", "invalid q_ptr (null)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); // Channel was closed by IOBluetooth and we can not write any data // (thus close/abort probably will not work). @@ -369,9 +369,9 @@ void QBluetoothSocketPrivate::channelClosed() void QBluetoothSocketPrivate::readChannelData(void *data, std::size_t size) { - Q_ASSERT_X(data, "readChannelData()", "invalid data (null)"); - Q_ASSERT_X(size, "readChannelData()", "invalid data size (0)"); - Q_ASSERT_X(q_ptr, "readChannelData()", "invalid q_ptr (null)"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(size, Q_FUNC_INFO, "invalid data size (0)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); const char *src = static_cast(data); char *dst = buffer.reserve(size); @@ -390,8 +390,8 @@ void QBluetoothSocketPrivate::writeComplete() qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) { - Q_ASSERT_X(data, "writeData()", "invalid data (null)"); - Q_ASSERT_X(maxSize > 0, "writeData()", "invalid data size"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(maxSize > 0, Q_FUNC_INFO, "invalid data size"); if (state != QBluetoothSocket::ConnectedState) { errorString = tr("Cannot write while not connected"); @@ -403,7 +403,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) // IOBluetoothL2CAPChannel buffered (writeAsync). if (!txBuffer.size()) - QMetaObject::invokeMethod(this, "_q_writeNotify", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, Q_FUNC_INFO, Qt::QueuedConnection); char *dst = txBuffer.reserve(maxSize); std::copy(data, data + maxSize, dst); @@ -452,7 +452,7 @@ qint64 QBluetoothSocket::bytesToWrite() const void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, OpenMode openMode) { if (state() != UnconnectedState && state() != ServiceLookupState) { - qCWarning(QT_BT_OSX) << "QBluetoothSocket::connectToService() called on a busy socket"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; d_ptr->errorString = tr("Trying to connect while connection is in progress"); setSocketError(OperationError); return; @@ -468,7 +468,8 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op } else { // Try service discovery. if (service.serviceUuid().isNull()) { - qCWarning(QT_BT_OSX) << "No port, no PSM, and no UUID provided, unable to connect"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "No port, " + "no PSM, and no UUID provided, unable to connect"; return; } @@ -480,7 +481,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const OpenMode openMode) { if (state() != QBluetoothSocket::UnconnectedState) { - qCWarning(QT_BT_OSX) << "QBluetoothSocket::connectToService() called on a busy socket"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; d_ptr->errorString = tr("Trying to connect while connection is in progress"); setSocketError(QBluetoothSocket::OperationError); return; @@ -497,7 +498,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint1 OpenMode openMode) { if (state() != QBluetoothSocket::UnconnectedState) { - qCWarning(QT_BT_OSX) << "QBluetoothSocket::connectToService() called on a busy socket"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; d_ptr->errorString = tr("Trying to connect while connection is in progress"); setSocketError(OperationError); return; @@ -538,8 +539,7 @@ void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state) // We can register for L2CAP/RFCOMM open notifications, // that's different from 'listen' and is implemented // in QBluetoothServer. - qCWarning(QT_BT_OSX) << "QBluetoothSocket::setSocketState(), " - "listening sockets are not supported"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "listening sockets are not supported"; } } @@ -577,7 +577,7 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O if (!service.serviceClassUuids().isEmpty()) d_ptr->discoveryAgent->setUuidFilter(service.serviceClassUuids()); - Q_ASSERT_X(!d_ptr->discoveryAgent->uuidFilter().isEmpty(), "doDeviceDiscovery()", + Q_ASSERT_X(!d_ptr->discoveryAgent->uuidFilter().isEmpty(), Q_FUNC_INFO, "invalid service info"); d_ptr->discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery); -- cgit v1.2.3 From 8da52103171651f459d2e242f6f44ed982433f96 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 12:26:26 +0100 Subject: QBluetoothServer - cleanup (OS X) Use Q_FUNC_INFO in asserts/messages. Change-Id: Ic8659a8e2ea427a53ba4d1308ab9f2e7b6fbf939 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothserver_osx.mm | 71 +++++++++++++++-------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/src/bluetooth/qbluetoothserver_osx.mm b/src/bluetooth/qbluetoothserver_osx.mm index 894209ba..46e8f750 100644 --- a/src/bluetooth/qbluetoothserver_osx.mm +++ b/src/bluetooth/qbluetoothserver_osx.mm @@ -60,8 +60,9 @@ #include // Import, since Obj-C headers do not have inclusion guards. -#import -#import +#include +// Only after Foundation.h +#include "osx/corebluetoothwrapper_p.h" #include @@ -95,11 +96,9 @@ QBluetoothServerPrivate::QBluetoothServerPrivate(QSInfo::Protocol type, QBluetoo port(0), maxPendingConnections(1) { - Q_ASSERT_X(q_ptr, "QBluetoothServerPrivate", "invalid q_ptr (null)"); - if (serverType == QSInfo::UnknownProtocol) { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::QBluetoothServerPrivate(), " - "unknown protocol"; - } + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); + if (serverType == QSInfo::UnknownProtocol) + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown protocol"; } QBluetoothServerPrivate::~QBluetoothServerPrivate() @@ -117,11 +116,10 @@ void QBluetoothServerPrivate::_q_newConnection() bool QBluetoothServerPrivate::startListener(quint16 realPort) { - Q_ASSERT_X(realPort, "startListener", "invalid port"); + Q_ASSERT_X(realPort, Q_FUNC_INFO, "invalid port"); if (serverType == QSInfo::UnknownProtocol) { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::startListener(), " - "invalid protocol"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid protocol"; return false; } @@ -147,9 +145,9 @@ void QBluetoothServerPrivate::stopListener() void QBluetoothServerPrivate::openNotify(IOBluetoothRFCOMMChannel *channel) { - Q_ASSERT_X(listener, "openNotify", "invalid listener (nil)"); - Q_ASSERT_X(channel, "openNotify", "invalid channel (nil)"); - Q_ASSERT_X(q_ptr, "openNotify", "invalid q_ptr (null)"); + Q_ASSERT_X(listener, Q_FUNC_INFO, "invalid listener (nil)"); + Q_ASSERT_X(channel, Q_FUNC_INFO, "invalid channel (nil)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); PendingConnection newConnection(channel, true); pendingConnections.append(newConnection); @@ -159,9 +157,9 @@ void QBluetoothServerPrivate::openNotify(IOBluetoothRFCOMMChannel *channel) void QBluetoothServerPrivate::openNotify(IOBluetoothL2CAPChannel *channel) { - Q_ASSERT_X(listener, "openNotify", "invalid listener (nil)"); - Q_ASSERT_X(channel, "openNotify", "invalid channel (nil)"); - Q_ASSERT_X(q_ptr, "openNotify", "invalid q_ptr (null)"); + Q_ASSERT_X(listener, Q_FUNC_INFO, "invalid listener (nil)"); + Q_ASSERT_X(channel, Q_FUNC_INFO, "invalid channel (nil)"); + Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); PendingConnection newConnection(channel, true); pendingConnections.append(newConnection); @@ -212,20 +210,18 @@ quint16 QBluetoothServerPrivate::findFreePSM() void QBluetoothServerPrivate::registerServer(QBluetoothServerPrivate *server, quint16 port) { // External lock is required + port must be free. - Q_ASSERT_X(server, "registerServer", "invalid server (null)"); + Q_ASSERT_X(server, Q_FUNC_INFO, "invalid server (null)"); const QSInfo::Protocol type = server->serverType; if (type == QSInfo::RfcommProtocol) { - Q_ASSERT_X(!channelIsBusy(port), "registerServer", - "port is busy"); + Q_ASSERT_X(!channelIsBusy(port), Q_FUNC_INFO, "port is busy"); busyChannels()[port] = server; } else if (type == QSInfo::L2capProtocol) { - Q_ASSERT_X(!psmIsBusy(port), "registerServer", - "port is busy"); + Q_ASSERT_X(!psmIsBusy(port), Q_FUNC_INFO, "port is busy"); busyPSMs()[port] = server; } else { - qCWarning(QT_BT_OSX) << "can not register a server with unknown " - "protocol type"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "can not register a server " + "with unknown protocol type"; } } @@ -241,8 +237,7 @@ QBluetoothServerPrivate *QBluetoothServerPrivate::registeredServer(quint16 port, if (it != busyPSMs().end()) return it.value(); } else { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::registeredServer(), " - "invalid protocol"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid protocol"; } return Q_NULLPTR; @@ -259,20 +254,17 @@ void QBluetoothServerPrivate::unregisterServer(QBluetoothServerPrivate *server) if (it != busyChannels().end()) { busyChannels().erase(it); } else { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::unregisterServer(), " - "server is not registered"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "server is not registered"; } } else if (type == QSInfo::L2capProtocol) { ServerMapIterator it = busyPSMs().find(port); if (it != busyPSMs().end()) { busyPSMs().erase(it); } else { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::unregisterServer(), " - "server is not registered"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "server is not registered"; } } else { - qCWarning(QT_BT_OSX) << "QBluetoothServerPrivate::unregisterServer(), " - "invalid protocol"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid protocol"; } } @@ -303,15 +295,14 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) typedef QBluetoothServerPrivate::ObjCListener ObjCListener; if (d_ptr->listener) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen() ", - "already in listen mode, " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "already in listen mode, " "close server first"; return false; } const QBluetoothLocalDevice device(address); if (!device.isValid()) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), device does not support Bluetooth or " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "device does not support Bluetooth or " << address.toString() << " is not a valid local adapter"; d_ptr->lastError = UnknownError; @@ -321,8 +312,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) const QBluetoothLocalDevice::HostMode hostMode = device.hostMode(); if (hostMode == QBluetoothLocalDevice::HostPoweredOff) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), " - "bluetooth device is powered off"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "Bluetooth device is powered off"; d_ptr->lastError = PoweredOffError; emit error(PoweredOffError); return false; @@ -331,8 +321,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) const QSInfo::Protocol type = d_ptr->serverType; if (type == QSInfo::UnknownProtocol) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), " - "invalid protocol"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid protocol"; d_ptr->lastError = UnsupportedProtocolError; emit error(d_ptr->lastError); return false; @@ -346,13 +335,13 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) if (port) { if (type == QSInfo::RfcommProtocol) { if (d_ptr->channelIsBusy(port)) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), server port: " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO <<"server port: " << port << "already registered"; d_ptr->lastError = ServiceAlreadyRegisteredError; } } else { if (d_ptr->psmIsBusy(port)) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), server port: " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "server port: " << port << "already registered"; d_ptr->lastError = ServiceAlreadyRegisteredError; } @@ -368,7 +357,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) } if (!port) { - qCWarning(QT_BT_OSX) << "QBluetoothServer::listen(), all ports are busy"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "all ports are busy"; d_ptr->lastError = ServiceAlreadyRegisteredError; emit error(d_ptr->lastError); return false; -- cgit v1.2.3 From ec2319c59e0ec83c8dbb91ebcf945c5945fb2447 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 12:52:29 +0100 Subject: Bluetooth socket listener (OS X) Replace handwritten function names with Q_FUNC_INFO. Change-Id: Ia12728eb53dc63ac1ca0d2a76bbf2baa06db0ea0 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtsocketlistener.mm | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/bluetooth/osx/osxbtsocketlistener.mm b/src/bluetooth/osx/osxbtsocketlistener.mm index 125f910a..ab7affbe 100644 --- a/src/bluetooth/osx/osxbtsocketlistener.mm +++ b/src/bluetooth/osx/osxbtsocketlistener.mm @@ -34,13 +34,9 @@ #include "osxbtsocketlistener_p.h" #include "osxbtutility_p.h" -#include #include -// Imports, since these are Objective-C headers and -// they do not have inclusion guards. -#import -#import +#include "corebluetoothwrapper_p.h" QT_BEGIN_NAMESPACE @@ -64,7 +60,7 @@ using namespace QT_NAMESPACE; - (id)initWithListener:(OSXBluetooth::SocketListener *)aDelegate { - Q_ASSERT_X(aDelegate, "-initWithListener:", "invalid delegate (null)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); if (self = [super init]) { connectionNotification = nil; delegate = aDelegate; @@ -84,8 +80,7 @@ using namespace QT_NAMESPACE; - (bool)listenRFCOMMConnectionsWithChannelID:(BluetoothRFCOMMChannelID)channelID { - Q_ASSERT_X(!connectionNotification, "-listenRFCOMMConnectionsWithChannelID", - "already listening"); + Q_ASSERT_X(!connectionNotification, Q_FUNC_INFO, "already listening"); connectionNotification = [IOBluetoothRFCOMMChannel registerForChannelOpenNotifications:self selector:@selector(rfcommOpenNotification:channel:) @@ -100,8 +95,7 @@ using namespace QT_NAMESPACE; - (bool)listenL2CAPConnectionsWithPSM:(BluetoothL2CAPPSM)psm { - Q_ASSERT_X(!connectionNotification, "-listenL2CAPConnectionsWithPSM:", - "already listening"); + Q_ASSERT_X(!connectionNotification, Q_FUNC_INFO, "already listening"); connectionNotification = [IOBluetoothL2CAPChannel registerForChannelOpenNotifications:self selector:@selector(l2capOpenNotification:channel:) @@ -119,8 +113,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(notification) - Q_ASSERT_X(delegate, "-rfcommOpenNotification:channel:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->openNotify(newChannel); } @@ -129,8 +122,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(notification) - Q_ASSERT_X(delegate, "-l2capOpenNotification:channel:", - "invalid delegate (null)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); delegate->openNotify(newChannel); } -- cgit v1.2.3 From 14547aa1c8877a620521cee088f832a93805562d Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 17 Dec 2014 12:44:53 +0100 Subject: QBluetoothTransferReply - cleanup (OS X) Q_FUNC_INFO in messages/(Q)asserts. Change-Id: I12285bf97ac766964b656090980858f3fd5de2da Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtobexsession.mm | 90 +++++++++++++--------------- src/bluetooth/osx/osxbtobexsession_p.h | 7 +-- src/bluetooth/qbluetoothtransferreply_osx.mm | 37 +++++------- 3 files changed, 58 insertions(+), 76 deletions(-) diff --git a/src/bluetooth/osx/osxbtobexsession.mm b/src/bluetooth/osx/osxbtobexsession.mm index 8a5feb32..0bed6af2 100644 --- a/src/bluetooth/osx/osxbtobexsession.mm +++ b/src/bluetooth/osx/osxbtobexsession.mm @@ -48,10 +48,6 @@ #include #include -// Import, since it's Obj-C headers: -#import -#import - #include #include #include @@ -91,7 +87,7 @@ enum { quint32 extract_uint32(const uint8_t *bytes) { // Four byte value, high byte first. - Q_ASSERT_X(bytes, "extract_uint32", "invalid input data (null)"); + Q_ASSERT_X(bytes, Q_FUNC_INFO, "invalid input data (null)"); uint32_t value = uint32_t(); std::copy(bytes, bytes + sizeof value, reinterpret_cast(&value)); @@ -102,7 +98,7 @@ quint32 extract_uint32(const uint8_t *bytes) quint16 extract_uint16(const uint8_t *bytes) { // Two byte value, high byte first. - Q_ASSERT_X(bytes, "extract_uint16", "invalid input data (null)"); + Q_ASSERT_X(bytes, Q_FUNC_INFO, "invalid input data (null)"); uint16_t value = uint16_t(); std::copy(bytes, bytes + sizeof value, reinterpret_cast(&value)); @@ -140,8 +136,8 @@ QList qt_bluetooth_headers(const uint8_t *data, std::size_t length) // 3. 10 A single byte value. // 4. 11 A four byte value, sent high byte first. - Q_ASSERT_X(data, "qt_bluetooth_headers", "invalid data (null)"); - Q_ASSERT_X(length >= 2, "qt_bluetooth_headers", "invalid data length"); + Q_ASSERT_X(data, Q_FUNC_INFO, "invalid data (null)"); + Q_ASSERT_X(length >= 2, Q_FUNC_INFO, "invalid data length"); Q_UNUSED(data) Q_UNUSED(length) @@ -209,7 +205,7 @@ QList qt_bluetooth_headers(const uint8_t *data, std::size_t length) break; } default: - qCWarning(QT_BT_OSX) << "qt_bluetooth_headers(), invalid header format"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid header format"; return empty; } @@ -315,7 +311,7 @@ ObjCStrongReference next_data_chunk(QIODevice &inputStream, IOBlu NSUInteger headersLength, bool &isLast) { // Work only for OBEX put (we request a specific payload length). - Q_ASSERT_X(session, "next_data_chunk", "invalid OBEX session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)"); const OBEXMaxPacketLength packetSize = [session getAvailableCommandPayloadLength:kOBEXOpCodePut]; if (!packetSize || headersLength >= packetSize) @@ -345,7 +341,7 @@ ObjCStrongReference next_data_chunk(QIODevice &inputStream, IOBlu bool check_connect_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode &response) { - Q_ASSERT_X(e, "check_connect_event", "invalid event (null)"); + Q_ASSERT_X(e, Q_FUNC_INFO, "invalid event (null)"); // This function tries to extract either an error code or a // server response code. "Good" event has type connect command respond @@ -364,7 +360,7 @@ bool check_connect_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode response = e->u.connectCommandResponseData.serverResponseOpCode; return response == kOBEXResponseCodeSuccessWithFinalBit; } else { - qCWarning(QT_BT_OSX) << "check_connect_event, unexpected event type"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unexpected event type"; error = kOBEXGeneralError; return false; } @@ -372,7 +368,7 @@ bool check_connect_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode bool check_put_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode &response) { - Q_ASSERT_X(e, "check_put_event", "invalid event (null)"); + Q_ASSERT_X(e, Q_FUNC_INFO, "invalid event (null)"); // See the comments above. @@ -384,7 +380,7 @@ bool check_put_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode &re return response == kOBEXResponseCodeContinueWithFinalBit || response == kOBEXResponseCodeSuccessWithFinalBit; } else { - qCWarning(QT_BT_OSX) << "check_put_event, unexpected event type"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unexpected event type"; error = kOBEXGeneralError; return false; } @@ -392,7 +388,7 @@ bool check_put_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode &re bool check_abort_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode &response) { - Q_ASSERT_X(e, "check_abort_event", "invalid event (null)"); + Q_ASSERT_X(e, Q_FUNC_INFO, "invalid event (null)"); if (e->type == kOBEXSessionEventTypeError) { error = e->u.errorData.error; @@ -401,7 +397,7 @@ bool check_abort_event(const OBEXSessionEvent *e, OBEXError &error, OBEXOpCode & response = e->u.abortCommandResponseData.serverResponseOpCode; return response == kOBEXResponseCodeSuccessWithFinalBit; } else { - qCWarning(QT_BT_OSX) << "check_abort_event, unexpected event type"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unexpected event type"; return false; } } @@ -440,12 +436,9 @@ using namespace QT_NAMESPACE; - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth::OBEXSessionDelegate) *)aDelegate remoteDevice:(const QBluetoothAddress &)deviceAddress channelID:(quint16)port { - Q_ASSERT_X(aDelegate, "-initWithDelegate:remoteDevice:channelID:", - "invalid delegate (null)"); - Q_ASSERT_X(!deviceAddress.isNull(), "-initWithDelegate:remoteDevice:channelID:", - "invalid remote device address"); - Q_ASSERT_X(port, "-initWithDelegate:remoteDevice:channelID:", - "invalid port (0)"); + Q_ASSERT_X(aDelegate, Q_FUNC_INFO, "invalid delegate (null)"); + Q_ASSERT_X(!deviceAddress.isNull(), Q_FUNC_INFO, "invalid remote device address"); + Q_ASSERT_X(port, Q_FUNC_INFO, "invalid port (0)"); if (self = [super init]) { connected = false; @@ -456,15 +449,13 @@ using namespace QT_NAMESPACE; const BluetoothDeviceAddress addr(OSXBluetooth::iobluetooth_address(deviceAddress)); device = [[IOBluetoothDevice deviceWithAddress:&addr] retain]; if (!device) { - qCWarning(QT_BT_OSX) << "-initWithDelegate:remoteDevice:channelID:, " - "failed to create an IOBluetoothDevice"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to create an IOBluetoothDevice"; return self; } session = [[IOBluetoothOBEXSession alloc] initWithDevice:device channelID:port]; if (!session) { - qCWarning(QT_BT_OSX) << "-initWithDelegate:remoteDevice:channelID:, " - "failed to create an OBEX session"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to create an OBEX session"; return self; } @@ -489,12 +480,12 @@ using namespace QT_NAMESPACE; - (OBEXError)OBEXConnect { if (!session) { - qCWarning(QT_BT_OSX) << "-OBEXConnect, invalid session (nil)"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid session (nil)"; return kOBEXGeneralError; } // That's a "single-shot" operation: - Q_ASSERT_X(currentRequest == OSXBluetooth::OBEXNoop, "-connect", + Q_ASSERT_X(currentRequest == OSXBluetooth::OBEXNoop, Q_FUNC_INFO, "can not connect in this state (another request is active)"); connected = false; @@ -523,7 +514,7 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(session, "-OBEXConnectHandler:", "invalid session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid session (nil)"); if (pendingAbort) { currentRequest = OBEXNoop; @@ -532,7 +523,7 @@ using namespace QT_NAMESPACE; } if (currentRequest != OBEXConnect) { - qCWarning(QT_BT_OSX) << "-OBEXConnectHandler:, called while there is no" + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called while there is no " "active connect request"; return; } @@ -578,7 +569,7 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(session, "-OBEXAbort", "invalid OBEX session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)"); if (currentRequest == OBEXNoop) { pendingAbort = false; @@ -608,10 +599,10 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(session, "-OBEXAbortHandler:", "invalid OBEX session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)"); if (currentRequest != OBEXAbort) { - qCWarning(QT_BT_OSX) << "-OBEXAbortHandler:, called while there " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called while there " "is no ABORT request"; return; } @@ -634,23 +625,22 @@ using namespace QT_NAMESPACE; if (!session || ![self isConnected]) return kOBEXSessionNotConnectedError; - Q_ASSERT_X(currentRequest == OBEXNoop, "-OBEXPutFile:withName:", + Q_ASSERT_X(currentRequest == OBEXNoop, Q_FUNC_INFO, "the current session has an active request already"); - Q_ASSERT_X(input, "-OBEXPutFile:withName:", "invalid input stream (null)"); - Q_ASSERT_X(input->isReadable(), "-OBEXPutFile:withName:", - "invalid input stream (not readable)"); + Q_ASSERT_X(input, Q_FUNC_INFO, "invalid input stream (null)"); + Q_ASSERT_X(input->isReadable(), Q_FUNC_INFO, "invalid input stream (not readable)"); // We send a put request with a couple of headers (size/file name/may be connection ID) + // a payload. const qint64 fileSize = input->size(); if (fileSize <= 0 || fileSize >= std::numeric_limits::max()) { - qCWarning(QT_BT_OSX) << "-OBEXPutFile:withName:, invalid input file size"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid input file size"; return kOBEXBadArgumentError; } ObjCStrongReference headers([[NSMutableData alloc] init], false); if (!headers) { - qCWarning(QT_BT_OSX) << "-OBEXPutFile:withName:, failed to allocate headers"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate headers"; return kOBEXNoResourcesError; } @@ -660,16 +650,16 @@ using namespace QT_NAMESPACE; if (connectionIDFound) { if (!append_four_byte_header(headers, kOBEXHeaderIDConnectionID, connectionID)) { - qCWarning(QT_BT_OSX) << "-OBEXPutFile:withName:, " - "failed to append connection ID header"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to " + "append connection ID header"; return kOBEXNoResourcesError; } } if (name.length()) { if (!append_unicode_header(headers, kOBEXHeaderIDName, name)) { - qCWarning(QT_BT_OSX) << "-OBEXPutFile:withName:, " - "failed to append a unicode string"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to append " + "a unicode string"; return kOBEXNoResourcesError; } } @@ -682,7 +672,7 @@ using namespace QT_NAMESPACE; if (!chunk || ![chunk length]) { // We do not support PUT-DELETE (?) // At least the first chunk is expected to be non-empty. - qCWarning(QT_BT_OSX) << "-OBEXPutFile:withName:, invalid input stream"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid input stream"; return kOBEXBadArgumentError; } @@ -720,7 +710,7 @@ using namespace QT_NAMESPACE; { using namespace OSXBluetooth; - Q_ASSERT_X(session, "-OBEXPutHandler:", "invalid OBEX session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)"); if (pendingAbort) { currentRequest = OBEXNoop; @@ -729,7 +719,7 @@ using namespace QT_NAMESPACE; } if (currentRequest != OBEXPut) { - qCWarning(QT_BT_OSX) << "-OBEXPutHandler:, called while the current " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called while the current " "request is not a put request"; return; } @@ -751,7 +741,7 @@ using namespace QT_NAMESPACE; // 0 for the headers length, no more headers. ObjCStrongReference chunk(next_data_chunk(*inputStream, session, 0, lastChunk)); if (!chunk && !lastChunk) { - qCWarning(QT_BT_OSX) << "-OBEXPutHandler:, failed to " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to " "allocate the next memory chunk"; return; } @@ -768,7 +758,7 @@ using namespace QT_NAMESPACE; refCon:Q_NULLPTR]; if (status != kOBEXSuccess) { - qCWarning(QT_BT_OSX) << "-OBEXPutHandler:, failed to " + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to " "send the next memory chunk"; currentRequest = OBEXNoop; if (delegate) // Response code is not important here. @@ -794,7 +784,7 @@ using namespace QT_NAMESPACE; - (void)OBEXDisconnect { - Q_ASSERT_X(session, "-OBEXDisconnect", "invalid session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid session (nil)"); currentRequest = OSXBluetooth::OBEXDisconnect; @@ -809,7 +799,7 @@ using namespace QT_NAMESPACE; { Q_UNUSED(event) - Q_ASSERT_X(session, "-OBEXDisconnectHandler:", "invalid session (nil)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid session (nil)"); // Event can have an error type, but there's nothing // we can do - even "cleanup" failed. diff --git a/src/bluetooth/osx/osxbtobexsession_p.h b/src/bluetooth/osx/osxbtobexsession_p.h index aa142b5a..9449ebf0 100644 --- a/src/bluetooth/osx/osxbtobexsession_p.h +++ b/src/bluetooth/osx/osxbtobexsession_p.h @@ -43,9 +43,8 @@ #include #include - -// Import - Obj-C headers do not have inclusion guards: -#import +// Only after Foundation.h: +#include "corebluetoothwrapper_p.h" @class IOBluetoothOBEXSession; @class IOBluetoothDevice; @@ -97,7 +96,7 @@ QT_END_NAMESPACE // It either succeeds or fails and tries to cleanup in any case. @interface QT_MANGLE_NAMESPACE(OSXBTOBEXSession) : NSObject { - QT_PREPEND_NAMESPACE(OSXBluetooth::OBEXSessionDelegate) *delegate; + QT_PREPEND_NAMESPACE(OSXBluetooth)::OBEXSessionDelegate *delegate; IOBluetoothDevice *device; quint16 channelID; IOBluetoothOBEXSession *session; diff --git a/src/bluetooth/qbluetoothtransferreply_osx.mm b/src/bluetooth/qbluetoothtransferreply_osx.mm index 3204e7b6..37d73a56 100644 --- a/src/bluetooth/qbluetoothtransferreply_osx.mm +++ b/src/bluetooth/qbluetoothtransferreply_osx.mm @@ -120,7 +120,7 @@ QBluetoothTransferReplyOSXPrivate::QBluetoothTransferReplyOSXPrivate(QBluetoothT minimalScan(true), requestComplete(false) { - Q_ASSERT_X(q, "QBluetoothTransferReplyOSXPrivate", "invalid q_ptr (null)"); + Q_ASSERT_X(q, Q_FUNC_INFO, "invalid q_ptr (null)"); } QBluetoothTransferReplyOSXPrivate::~QBluetoothTransferReplyOSXPrivate() @@ -140,8 +140,8 @@ bool QBluetoothTransferReplyOSXPrivate::isActive() const bool QBluetoothTransferReplyOSXPrivate::startOPP(const QBluetoothAddress &device) { - Q_ASSERT_X(!isActive(), "startOPP", "already started"); - Q_ASSERT_X(!device.isNull(), "startOPP", "invalid device address"); + Q_ASSERT_X(!isActive(), Q_FUNC_INFO, "already started"); + Q_ASSERT_X(!device.isNull(), Q_FUNC_INFO, "invalid device address"); errorString.clear(); error = QBluetoothTransferReply::NoError; @@ -164,15 +164,13 @@ bool QBluetoothTransferReplyOSXPrivate::startOPP(const QBluetoothAddress &device void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &device, quint16 channelID) { - Q_ASSERT_X(!session, "sendConnect", "session is already active"); + Q_ASSERT_X(!session, Q_FUNC_INFO, "session is already active"); error = QBluetoothTransferReply::NoError; errorString.clear(); if (device.isNull() || !channelID) { - qCWarning(QT_BT_OSX) << "QBluetoothTransferReplyOSXPrivate::sendConnect(), " - "invalid device address or port"; - + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid device address or port"; setReplyError(QBluetoothTransferReply::HostNotFoundError, QObject::tr("Invalid target address")); return; @@ -181,8 +179,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev OBEXSession newSession([[ObjCOBEXSession alloc] initWithDelegate:this remoteDevice:device channelID:channelID]); if (!newSession) { - qCWarning(QT_BT_OSX) << "QBluetoothTransferReplyOSXPrivate::sendConnect(), " - "failed to allocate OSXBTOBEXSession object"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate OSXBTOBEXSession object"; setReplyError(QBluetoothTransferReply::UnknownError, QObject::tr("Failed to create an OBEX session")); @@ -197,8 +194,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev if ([session isConnected]) sendPut();// Connected, send a PUT request. } else { - qCWarning(QT_BT_OSX) << "QBluetoothTransferReplyOSXPrivate::sendConnect(), " - "OBEXConnect failed"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "OBEXConnect failed"; if (error == QBluetoothTransferReply::NoError) { // The error is not set yet. @@ -214,10 +210,10 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev void QBluetoothTransferReplyOSXPrivate::sendPut() { - Q_ASSERT_X(inputStream, "sendPut", "invalid input stream (null)"); - Q_ASSERT_X(session, "sendPut", "invalid OBEX session (nil)"); - Q_ASSERT_X([session isConnected], "sendPut", "not connected"); - Q_ASSERT_X(![session hasActiveRequest], "sendPut", + Q_ASSERT_X(inputStream, Q_FUNC_INFO, "invalid input stream (null)"); + Q_ASSERT_X(session, Q_FUNC_INFO, "invalid OBEX session (nil)"); + Q_ASSERT_X([session isConnected], Q_FUNC_INFO, "not connected"); + Q_ASSERT_X(![session hasActiveRequest], Q_FUNC_INFO, "session already has an active request"); QString fileName; @@ -354,9 +350,7 @@ QBluetoothTransferReplyOSX::QBluetoothTransferReplyOSX(QIODevice *input, if (input) { QMetaObject::invokeMethod(this, "start", Qt::QueuedConnection); } else { - qCWarning(QT_BT_OSX) << "QBluetoothTransferReplyOSX::QBluetoothTransferReplyOSX(), " - "invalid input stream (null)"; - + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid input stream (null)"; osx_d_ptr->requestComplete = true; osx_d_ptr->errorString = tr("Invalid input file (null)"); osx_d_ptr->error = FileNotFoundError; @@ -417,8 +411,7 @@ bool QBluetoothTransferReplyOSX::start() if (!osx_d_ptr->isActive()) { // Step 0: find a channelID. if (request().address().isNull()) { - qCWarning(QT_BT_OSX) << "QBluetoothTransferReplyOSX::start(), " - "invalid device address"; + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid device address"; osx_d_ptr->setReplyError(HostNotFoundError, tr("Invalid target address")); return false; } @@ -432,7 +425,7 @@ bool QBluetoothTransferReplyOSX::start() void QBluetoothTransferReplyOSX::serviceDiscoveryFinished() { - Q_ASSERT_X(osx_d_ptr->agent.data(), "serviceDiscoveryFinished", + Q_ASSERT_X(osx_d_ptr->agent.data(), Q_FUNC_INFO, "invalid service discovery agent (null)"); const QList services = osx_d_ptr->agent->discoveredServices(); @@ -454,7 +447,7 @@ void QBluetoothTransferReplyOSX::serviceDiscoveryFinished() void QBluetoothTransferReplyOSX::serviceDiscoveryError(QBluetoothServiceDiscoveryAgent::Error errorCode) { - Q_ASSERT_X(osx_d_ptr->agent.data(), "serviceDiscoveryError", "invalid service discovery agent (null)"); + Q_ASSERT_X(osx_d_ptr->agent.data(), Q_FUNC_INFO, "invalid service discovery agent (null)"); if (errorCode == QBluetoothServiceDiscoveryAgent::PoweredOffError) { // There's nothing else we can do. -- cgit v1.2.3 From 6634ff02232e306547bcff4c2a405a2d36f2b139 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 22 Dec 2014 13:05:18 +0100 Subject: Make chat example more error tolerant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It becomes more obvious on platforms which do not support Bluetooth that the example will not work. Change-Id: Ia6d249a4a891f93abf29910500ba164662308889 Reviewed-by: Topi Reiniö --- examples/bluetooth/chat/Search.qml | 3 ++- examples/bluetooth/chat/chat.qml | 8 ++++++++ examples/bluetooth/chat/qmlchat.cpp | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/examples/bluetooth/chat/Search.qml b/examples/bluetooth/chat/Search.qml index 4557971b..47fbb6ab 100644 --- a/examples/bluetooth/chat/Search.qml +++ b/examples/bluetooth/chat/Search.qml @@ -41,7 +41,7 @@ import QtQuick 2.2 Rectangle { - property bool animationRunning: ranimation.running + property bool animationRunning: true function appendText(newText) { searchText.text += newText @@ -75,6 +75,7 @@ Rectangle { duration: 2000 loops: Animation.Infinite alwaysRunToEnd: true + running: animationRunning } } diff --git a/examples/bluetooth/chat/chat.qml b/examples/bluetooth/chat/chat.qml index 6614d53c..6a2830ad 100644 --- a/examples/bluetooth/chat/chat.qml +++ b/examples/bluetooth/chat/chat.qml @@ -57,10 +57,18 @@ Item { //! [BtDiscoveryModel-1] onRunningChanged : { if (!btModel.running && top.state == "begin" && !serviceFound) { + searchBox.animationRunning = false; searchBox.appendText("\nNo service found. \n\nPlease start server\nand restart app.") } } + onErrorChanged: { + if (error != BluetoothDiscoveryModel.NoError && !btModel.running) { + searchBox.animationRunning = false + searchBox.appendText("\n\nDiscovery failed.\nPlease ensure Bluetooth is available.") + } + } + //! [BtDiscoveryModel-2] onServiceDiscovered: { if (serviceFound) diff --git a/examples/bluetooth/chat/qmlchat.cpp b/examples/bluetooth/chat/qmlchat.cpp index aefc900a..6e23fe13 100644 --- a/examples/bluetooth/chat/qmlchat.cpp +++ b/examples/bluetooth/chat/qmlchat.cpp @@ -43,11 +43,17 @@ #include #include #include +#include int main(int argc, char *argv[]) { QGuiApplication application(argc, argv); + QList infos = QBluetoothLocalDevice::allDevices(); + if (infos.isEmpty()) + qWarning() << "Missing Bluetooth local device. " + "Example will not work properly."; + const QString mainQmlApp = QLatin1String("qrc:/chat.qml"); QQuickView view; view.setSource(QUrl(mainQmlApp)); -- cgit v1.2.3 From a804c20c3fdd857cb16859b1204d24ce1c74b39f Mon Sep 17 00:00:00 2001 From: Martin Leutelt Date: Fri, 19 Dec 2014 11:34:59 +0100 Subject: Neard: fix tag writing The write operation has to be delayed since neard isn't able to write to tags immediately after tag detection. Change-Id: I177cc700d0688e23909b9b2751a0d11f163a5499 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_neard_p.h | 97 +++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index b35db0b5..5d518551 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -76,6 +76,7 @@ public: { m_readErrorTimer.setSingleShot(true); m_recordPathsCollectedTimer.setSingleShot(true); + m_delayedWriteTimer.setSingleShot(true); qCDebug(QT_NFC_NEARD) << "tag found at path" << interfacePath.path(); m_dbusProperties = new OrgFreedesktopDBusPropertiesInterface(QStringLiteral("org.neard"), @@ -112,6 +113,8 @@ public: this, &NearFieldTarget::createNdefMessage); QObject::connect(&m_readErrorTimer, &QTimer::timeout, this, &NearFieldTarget::handleReadError); + QObject::connect(&m_delayedWriteTimer, &QTimer::timeout, + this, &NearFieldTarget::handleWriteRequest); QObject::connect(NeardHelper::instance(), &NeardHelper::recordFound, this, &NearFieldTarget::handleRecordFound); } @@ -151,12 +154,12 @@ public: if (isValid()) { // if the user calls readNdefMessages before the previous request has been completed // return the current request id. - if (m_currentRequestId.isValid()) - return m_currentRequestId; + if (m_currentReadRequestId.isValid()) + return m_currentReadRequestId; QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); // save the id so it can be passed along with requestCompleted - m_currentRequestId = requestId; + m_currentReadRequestId = requestId; // since the triggering of interfaceAdded will ultimately lead to createNdefMessage being called // we need to make sure that ndefMessagesRead will only be triggered when readNdefMessages has // been called before. In case readNdefMessages is called again after that we can directly call @@ -187,6 +190,10 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) { + // return old request id when previous write request hasn't completed + if (m_currentWriteRequestId.isValid()) + return m_currentReadRequestId; + qCDebug(QT_NFC_NEARD) << "writing messages"; if (messages.isEmpty() || messages.first().isEmpty()) { qCWarning(QT_NFC_NEARD) << "No record specified"; @@ -200,50 +207,34 @@ public: QNdefRecord record = messages.first().first(); if (record.typeNameFormat() == QNdefRecord::NfcRtd) { - QVariantMap recordProperties; + m_currentWriteRequestData.clear(); if (record.isRecordType()) { - recordProperties.insert(QStringLiteral("Type"), QStringLiteral("URI")); + m_currentWriteRequestData.insert(QStringLiteral("Type"), QStringLiteral("URI")); QNdefNfcUriRecord uriRecord = static_cast(record); - recordProperties.insert(QStringLiteral("URI"), uriRecord.uri().toString()); + m_currentWriteRequestData.insert(QStringLiteral("URI"), uriRecord.uri().toString()); } else if (record.isRecordType()) { - recordProperties.insert(QStringLiteral("Type"), QStringLiteral("SmartPoster")); + m_currentWriteRequestData.insert(QStringLiteral("Type"), QStringLiteral("SmartPoster")); QNdefNfcSmartPosterRecord spRecord = static_cast(record); - recordProperties.insert(QStringLiteral("URI"), spRecord.uri().toString()); + m_currentWriteRequestData.insert(QStringLiteral("URI"), spRecord.uri().toString()); // Currently neard only supports the uri property for writing } else if (record.isRecordType()) { - recordProperties.insert(QStringLiteral("Type"), QStringLiteral("Text")); + m_currentWriteRequestData.insert(QStringLiteral("Type"), QStringLiteral("Text")); QNdefNfcTextRecord textRecord = static_cast(record); - recordProperties.insert(QStringLiteral("Representation"), textRecord.text()); - recordProperties.insert(QStringLiteral("Encoding"), + m_currentWriteRequestData.insert(QStringLiteral("Representation"), textRecord.text()); + m_currentWriteRequestData.insert(QStringLiteral("Encoding"), textRecord.encoding() == QNdefNfcTextRecord::Utf8 ? QStringLiteral("UTF-8") : QStringLiteral("UTF-16") ); - recordProperties.insert(QStringLiteral("Language"), textRecord.locale()); + m_currentWriteRequestData.insert(QStringLiteral("Language"), textRecord.locale()); } else { qCWarning(QT_NFC_NEARD) << "Record type not supported for writing"; return QNearFieldTarget::RequestId(); } - OrgNeardTagInterface tagInterface(QStringLiteral("org.neard"), - m_tagPath.path(), - QDBusConnection::systemBus()); - if (!tagInterface.isValid()) { - qCWarning(QT_NFC_NEARD) << "tag interface invalid"; - } else { - QDBusPendingReply<> reply; - reply = tagInterface.Write(recordProperties); - reply.waitForFinished(); - if (reply.isError()) { - qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); - return QNearFieldTarget::RequestId(); - } - - QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); + m_currentWriteRequestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + // trigger delayed write + m_delayedWriteTimer.start(100); - QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId, requestId)); - return requestId; - } + return m_currentWriteRequestId; } return QNearFieldTarget::RequestId(); @@ -351,23 +342,50 @@ private: Q_ARG(const QNdefMessage, newNdefMessage)); // the request id in requestCompleted has to match the one created in readNdefMessages QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId, m_currentRequestId)); + Q_ARG(const QNearFieldTarget::RequestId, m_currentReadRequestId)); } else { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(const QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(const QNearFieldTarget::RequestId, m_currentRequestId)); + Q_ARG(const QNearFieldTarget::RequestId, m_currentReadRequestId)); } m_readRequested = false; // invalidate the current request id - m_currentRequestId = QNearFieldTarget::RequestId(0); + m_currentReadRequestId = QNearFieldTarget::RequestId(0); } } void handleReadError() { - emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, m_currentRequestId); - m_currentRequestId = QNearFieldTarget::RequestId(0); + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, m_currentReadRequestId); + m_currentReadRequestId = QNearFieldTarget::RequestId(0); + } + + void handleWriteRequest() + { + OrgNeardTagInterface tagInterface(QStringLiteral("org.neard"), + m_tagPath.path(), + QDBusConnection::systemBus()); + if (!tagInterface.isValid()) { + qCWarning(QT_NFC_NEARD) << "tag interface invalid"; + } else { + QDBusPendingReply<> reply; + reply = tagInterface.Write(m_currentWriteRequestData); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); + QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::Error, QNearFieldTarget::UnknownError), + Q_ARG(const QNearFieldTarget::RequestId, m_currentWriteRequestId)); + } + + QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, m_currentWriteRequestId)); + } + + // invalidate current write request + m_currentWriteRequestId = QNearFieldTarget::RequestId(0); } protected: @@ -376,9 +394,12 @@ protected: QList m_recordPaths; QTimer m_recordPathsCollectedTimer; QTimer m_readErrorTimer; + QTimer m_delayedWriteTimer; QNearFieldTarget::Type m_type; bool m_readRequested; - QNearFieldTarget::RequestId m_currentRequestId; + QNearFieldTarget::RequestId m_currentReadRequestId; + QNearFieldTarget::RequestId m_currentWriteRequestId; + QVariantMap m_currentWriteRequestData; }; QT_END_NAMESPACE -- cgit v1.2.3 From b81db5fa244ef2a1512907aca12e9574cc81a7f0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 13 Jan 2015 09:50:52 +0100 Subject: Disable writing of Ndef messages due to crash in Neard daemon Task-number: QTBUG-43802 Change-Id: I8500f67e44ad4119ec540eb45c1891ac849d2085 Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_neard_p.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 5d518551..26a699a2 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -190,6 +190,11 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList &messages) { + // disabling write due to neard crash (see QTBUG-43802) + qWarning("QNearFieldTarget::WriteNdefMessages() disabled. See QTBUG-43802\n"); + return QNearFieldTarget::RequestId(); + + // return old request id when previous write request hasn't completed if (m_currentWriteRequestId.isValid()) return m_currentReadRequestId; -- cgit v1.2.3 From 633e5de268996306e444b37e05f703b4905a4ea9 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 13 Jan 2015 10:00:26 +0100 Subject: Don't leave UI hanging if NdefMessage handling returned invalid request Invalid request implies that the platform doesn't support writing of NDEF messages. This case does not trigger an error() signal though. That's why we have to trigger the error handling code manually. Change-Id: I0b95fddfe30052f1c7baa566ebc099998854146d Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- examples/nfc/ndefeditor/mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp index 527ff6c7..fa0fa91f 100644 --- a/examples/nfc/ndefeditor/mainwindow.cpp +++ b/examples/nfc/ndefeditor/mainwindow.cpp @@ -235,6 +235,8 @@ void MainWindow::targetDetected(QNearFieldTarget *target) this, SLOT(targetError(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); m_request = target->readNdefMessages(); + if (!m_request.isValid()) // cannot read messages + targetError(QNearFieldTarget::NdefReadError, m_request); break; case WriteNdef: connect(target, SIGNAL(ndefMessagesWritten()), this, SLOT(ndefMessageWritten())); @@ -242,6 +244,8 @@ void MainWindow::targetDetected(QNearFieldTarget *target) this, SLOT(targetError(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); m_request = target->writeNdefMessages(QList() << ndefMessage()); + if (!m_request.isValid()) // cannot write messages + targetError(QNearFieldTarget::NdefWriteError, m_request); break; } } -- cgit v1.2.3 From 912cdbf15f46c9aa5b64bb76222b09065e8786be Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 16 Jan 2015 21:06:06 +0100 Subject: Bump version Change-Id: I59b24ee6fa29e005233283a10664644d60b7df3c --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index ccd239ad..35f43d51 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.4.1 +MODULE_VERSION = 5.4.2 -- cgit v1.2.3 From 746f45b946e15ac291e86ad3aac80a71ce03e46a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 19 Jan 2015 12:15:18 +0100 Subject: Register PublicBrowseGroup as sequence Based on Bluetooth spec Vol3 PartB 5.1.7 the BrowseGroupList consists of a data element sequence. The current approach was not correct. This was discovered because Bluez5 doesn't add a custom service to the Extended Inquiry Response (EIR) unless it is in a sequence. If the service is not part of the EIR other platforms such as Windows report an error or won't simply see the service. This was not a problem when using Bluez4 because it was more tolerant towards such mistakes and added the custom service to the EIR anyway. Task-number: QTBUG-43806 Change-Id: Ib0ca59005c940249fb6aefd8ecafe5b2ceff3878 Reviewed-by: Aaron McCarthy --- examples/bluetooth/btchat/chatserver.cpp | 4 +++- src/bluetooth/qbluetoothserver.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/bluetooth/btchat/chatserver.cpp b/examples/bluetooth/btchat/chatserver.cpp index 6da4b471..6848e2d7 100644 --- a/examples/bluetooth/btchat/chatserver.cpp +++ b/examples/bluetooth/btchat/chatserver.cpp @@ -101,8 +101,10 @@ void ChatServer::startServer(const QBluetoothAddress& localAdapter) //! [Service UUID set] //! [Service Discoverability] + QBluetoothServiceInfo::Sequence publicBrowse; + publicBrowse << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup)); serviceInfo.setAttribute(QBluetoothServiceInfo::BrowseGroupList, - QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup)); + publicBrowse); //! [Service Discoverability] //! [Protocol descriptor list] diff --git a/src/bluetooth/qbluetoothserver.cpp b/src/bluetooth/qbluetoothserver.cpp index 3001a00b..1c4676e0 100644 --- a/src/bluetooth/qbluetoothserver.cpp +++ b/src/bluetooth/qbluetoothserver.cpp @@ -204,8 +204,10 @@ QBluetoothServiceInfo QBluetoothServer::listen(const QBluetoothUuid &uuid, const //! [listen] QBluetoothServiceInfo serviceInfo; serviceInfo.setAttribute(QBluetoothServiceInfo::ServiceName, serviceName); + QBluetoothServiceInfo::Sequence browseSequence; + browseSequence << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup)); serviceInfo.setAttribute(QBluetoothServiceInfo::BrowseGroupList, - QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup)); + browseSequence); QBluetoothServiceInfo::Sequence classId; classId << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::SerialPort)); -- cgit v1.2.3 From 769a597083a60dc530b9a28fe606dae6d1b02369 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 22 Jan 2015 17:53:20 +0100 Subject: Bluetooth LE - hearlistener example (OS X, iOS) Workaround for CoreBluetooth's limitation (no addresses, only 'uuids'). Change-Id: I9ab83a403d4643df11320185eb473818ef798d70 Reviewed-by: Alex Blasche --- examples/bluetooth/heartlistener/deviceinfo.cpp | 12 ++++++++++++ examples/bluetooth/heartlistener/deviceinfo.h | 2 +- examples/bluetooth/heartlistener/heartrate.cpp | 7 +++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/examples/bluetooth/heartlistener/deviceinfo.cpp b/examples/bluetooth/heartlistener/deviceinfo.cpp index 5be9fcfe..0e832dff 100644 --- a/examples/bluetooth/heartlistener/deviceinfo.cpp +++ b/examples/bluetooth/heartlistener/deviceinfo.cpp @@ -39,6 +39,8 @@ ** ****************************************************************************/ +#include + #include "deviceinfo.h" DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &info): @@ -51,6 +53,16 @@ QBluetoothDeviceInfo DeviceInfo::getDevice() const return m_device; } +QString DeviceInfo::getAddress() const +{ +#ifdef Q_OS_MAC + // workaround for Core Bluetooth: + return m_device.deviceUuid().toString(); +#else + return m_device.address().toString(); +#endif +} + void DeviceInfo::setDevice(const QBluetoothDeviceInfo &device) { m_device = device; diff --git a/examples/bluetooth/heartlistener/deviceinfo.h b/examples/bluetooth/heartlistener/deviceinfo.h index a80f723b..af14547d 100644 --- a/examples/bluetooth/heartlistener/deviceinfo.h +++ b/examples/bluetooth/heartlistener/deviceinfo.h @@ -56,7 +56,7 @@ public: DeviceInfo(const QBluetoothDeviceInfo &device); void setDevice(const QBluetoothDeviceInfo &device); QString getName() const { return m_device.name(); } - QString getAddress() const { return m_device.address().toString(); } + QString getAddress() const; QBluetoothDeviceInfo getDevice() const; signals: diff --git a/examples/bluetooth/heartlistener/heartrate.cpp b/examples/bluetooth/heartlistener/heartrate.cpp index 91fe41c1..dd7371af 100644 --- a/examples/bluetooth/heartlistener/heartrate.cpp +++ b/examples/bluetooth/heartlistener/heartrate.cpp @@ -152,8 +152,15 @@ void HeartRate::connectToService(const QString &address) } //! [Connect signals] +#ifdef Q_OS_MAC + // with CoreBluetooth controller requires QBluetoothDeviceInfo to connect: + m_control = new QLowEnergyController(m_currentDevice.getDevice(), + this); + +#else m_control = new QLowEnergyController(m_currentDevice.getDevice().address(), this); +#endif connect(m_control, SIGNAL(serviceDiscovered(QBluetoothUuid)), this, SLOT(serviceDiscovered(QBluetoothUuid))); connect(m_control, SIGNAL(discoveryFinished()), -- cgit v1.2.3 From cc5a732f3dda39b378459d38d46565f0ce8ef0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20A=C5=9F=C4=B1c=C4=B1?= Date: Thu, 22 Jan 2015 13:14:41 +0200 Subject: Fix build with -no-c++11 With -no-c++11, - Enum type names cannot be used as namespaces. Use old style naming. - For errno, errno.h must be included. - stdint.h must be included to use uint*_t types. Use quint* equivalents instead. Change-Id: I992f531a46cfc997df0aa6fc7ff6bf75fb750fc6 Reviewed-by: Alex Blasche --- src/bluetooth/bluez/bluez5_helper.cpp | 16 ++--- src/bluetooth/bluez/bluez_data_p.h | 94 ++++++++++++++-------------- src/bluetooth/bluez/hcimanager.cpp | 1 + src/bluetooth/qlowenergycontroller_bluez.cpp | 2 + 4 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index eebeae9d..0e3c0063 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -45,16 +45,16 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ) typedef enum Bluez5TestResultType { - Unknown, - Bluez4, - Bluez5 + BluezVersionUnknown, + BluezVersion4, + BluezVersion5 } Bluez5TestResult; -Q_GLOBAL_STATIC_WITH_ARGS(Bluez5TestResult, bluezVersion, (Bluez5TestResult::Unknown)); +Q_GLOBAL_STATIC_WITH_ARGS(Bluez5TestResult, bluezVersion, (BluezVersionUnknown)); bool isBluez5() { - if (*bluezVersion() == Bluez5TestResultType::Unknown) { + if (*bluezVersion() == BluezVersionUnknown) { OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"), QStringLiteral("/"), QDBusConnection::systemBus()); @@ -65,15 +65,15 @@ bool isBluez5() QDBusPendingReply reply = manager.GetManagedObjects(); reply.waitForFinished(); if (reply.isError()) { - *bluezVersion() = Bluez5TestResultType::Bluez4; + *bluezVersion() = BluezVersion4; qCDebug(QT_BT_BLUEZ) << "Bluez 4 detected."; } else { - *bluezVersion() = Bluez5TestResultType::Bluez5; + *bluezVersion() = BluezVersion5; qCDebug(QT_BT_BLUEZ) << "Bluez 5 detected."; } } - return (*bluezVersion() == Bluez5TestResultType::Bluez5); + return (*bluezVersion() == BluezVersion5); } struct AdapterData diff --git a/src/bluetooth/bluez/bluez_data_p.h b/src/bluetooth/bluez/bluez_data_p.h index 7c799977..9d2d96b3 100644 --- a/src/bluetooth/bluez/bluez_data_p.h +++ b/src/bluetooth/bluez/bluez_data_p.h @@ -75,8 +75,8 @@ #define BT_SECURITY 4 struct bt_security { - uint8_t level; - uint8_t key_size; + quint8 level; + quint8 key_size; }; #define BT_SECURITY_SDP 0 #define BT_SECURITY_LOW 1 @@ -162,14 +162,14 @@ static inline void ntoh128(const quint128 *src, quint128 *dst) dst->data[15 - i] = src->data[i]; } -static inline uint16_t bt_get_le16(const void *ptr) +static inline quint16 bt_get_le16(const void *ptr) { - return bt_get_unaligned((const uint16_t *) ptr); + return bt_get_unaligned((const quint16 *) ptr); } #elif __BYTE_ORDER == __BIG_ENDIAN -static inline uint16_t bt_get_le16(const void *ptr) +static inline quint16 bt_get_le16(const void *ptr) { - return bswap_16(bt_get_unaligned((const uint16_t *) ptr)); + return bswap_16(bt_get_unaligned((const quint16 *) ptr)); } static inline void btoh128(const quint128 *src, quint128 *dst) @@ -213,79 +213,79 @@ struct sockaddr_hci { }; struct hci_dev_req { - uint16_t dev_id; - uint32_t dev_opt; + quint16 dev_id; + quint32 dev_opt; }; struct hci_dev_list_req { - uint16_t dev_num; + quint16 dev_num; struct hci_dev_req dev_req[0]; }; struct hci_dev_stats { - uint32_t err_rx; - uint32_t err_tx; - uint32_t cmd_tx; - uint32_t evt_rx; - uint32_t acl_tx; - uint32_t acl_rx; - uint32_t sco_tx; - uint32_t sco_rx; - uint32_t byte_rx; - uint32_t byte_tx; + quint32 err_rx; + quint32 err_tx; + quint32 cmd_tx; + quint32 evt_rx; + quint32 acl_tx; + quint32 acl_rx; + quint32 sco_tx; + quint32 sco_rx; + quint32 byte_rx; + quint32 byte_tx; }; struct hci_dev_info { - uint16_t dev_id; + quint16 dev_id; char name[8]; bdaddr_t bdaddr; - uint32_t flags; - uint8_t type; + quint32 flags; + quint8 type; - uint8_t features[8]; + quint8 features[8]; - uint32_t pkt_type; - uint32_t link_policy; - uint32_t link_mode; + quint32 pkt_type; + quint32 link_policy; + quint32 link_mode; - uint16_t acl_mtu; - uint16_t acl_pkts; - uint16_t sco_mtu; - uint16_t sco_pkts; + quint16 acl_mtu; + quint16 acl_pkts; + quint16 sco_mtu; + quint16 sco_pkts; struct hci_dev_stats stat; }; struct hci_conn_info { - uint16_t handle; + quint16 handle; bdaddr_t bdaddr; - uint8_t type; - uint8_t out; - uint16_t state; - uint32_t link_mode; + quint8 type; + quint8 out; + quint16 state; + quint32 link_mode; }; struct hci_conn_list_req { - uint16_t dev_id; - uint16_t conn_num; + quint16 dev_id; + quint16 conn_num; struct hci_conn_info conn_info[0]; }; struct hci_filter { - uint32_t type_mask; - uint32_t event_mask[2]; - uint16_t opcode; + quint32 type_mask; + quint32 event_mask[2]; + quint16 opcode; }; static inline void hci_set_bit(int nr, void *addr) { - *((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31)); + *((quint32 *) addr + (nr >> 5)) |= (1 << (nr & 31)); } static inline void hci_clear_bit(int nr, void *addr) { - *((uint32_t *) addr + (nr >> 5)) &= ~(1 << (nr & 31)); + *((quint32 *) addr + (nr >> 5)) &= ~(1 << (nr & 31)); } static inline void hci_filter_clear(struct hci_filter *f) { @@ -317,16 +317,16 @@ static inline void hci_filter_all_events(struct hci_filter *f) } typedef struct { - uint8_t evt; - uint8_t plen; + quint8 evt; + quint8 plen; } __attribute__ ((packed)) hci_event_hdr; #define HCI_EVENT_HDR_SIZE 2 #define EVT_ENCRYPT_CHANGE 0x08 typedef struct { - uint8_t status; - uint16_t handle; - uint8_t encrypt; + quint8 status; + quint16 handle; + quint8 encrypt; } __attribute__ ((packed)) evt_encrypt_change; #define EVT_ENCRYPT_CHANGE_SIZE 4 diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index 17d54a4b..32450588 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -38,6 +38,7 @@ #include +#include #include #include #include diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 5629966d..f22cea71 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -41,6 +41,8 @@ #include #include +#include + #define ATTRIBUTE_CHANNEL_ID 4 #define ATT_DEFAULT_LE_MTU 23 -- cgit v1.2.3 From fd88da6bf12c7c8edfd6c3d44cc641aed7477f0b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 16 Jan 2015 16:07:18 +0100 Subject: Convert qRegisterMetaType(const char*) to qRegisterMetaType() This is much safer and cleaner. [ChangeLog][QtBluetooth][Important Behavior Changes] Q_DECLARE_METATYPE added for QBluetoothServiceDiscoveryAgent::Error, QBluetoothSocket::SocketState, QBluetoothSocket::SocketError and QBluetoothDeviceInfo. This breaks source compatibility if application code has defined the above metatypes already. The applications Q_DECLARE_METATYPE must be removed to fix the compile error. Change-Id: I1c7cb1ee25832b7e5337c9aca6f36b21e8caf22e Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/android/serveracceptancethread.cpp | 4 +++- src/bluetooth/qbluetoothaddress.cpp | 2 +- src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp | 2 +- src/bluetooth/qbluetoothdeviceinfo.h | 5 ++++- src/bluetooth/qbluetoothlocaldevice.cpp | 6 +++--- src/bluetooth/qbluetoothservicediscoveryagent.h | 2 ++ src/bluetooth/qbluetoothservicediscoveryagent_android.cpp | 2 +- src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp | 4 ++-- src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp | 4 ++-- src/bluetooth/qbluetoothsocket.h | 3 +++ src/bluetooth/qbluetoothsocket_android.cpp | 5 ++--- src/bluetooth/qlowenergyservice.cpp | 4 ++-- src/bluetooth/qlowenergyservice.h | 3 +++ src/bluetooth/qlowenergyservice_osx.mm | 4 ++-- src/nfc/qnearfieldtarget.cpp | 6 +++--- src/nfc/qnearfieldtarget_emulator.cpp | 2 +- .../tst_qbluetoothdevicediscoveryagent.cpp | 8 ++++---- .../auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp | 4 ++-- tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp | 4 ++-- .../tst_qbluetoothservicediscoveryagent.cpp | 13 ++++++------- .../qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp | 6 +++--- tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp | 6 ++---- .../tst_qbluetoothtransfermanager.cpp | 2 +- tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp | 2 +- .../auto/qlowenergycontroller/tst_qlowenergycontroller.cpp | 1 - tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp | 4 ++-- tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp | 4 ++-- tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp | 4 ++-- 28 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/bluetooth/android/serveracceptancethread.cpp b/src/bluetooth/android/serveracceptancethread.cpp index cc639135..185cfa54 100644 --- a/src/bluetooth/android/serveracceptancethread.cpp +++ b/src/bluetooth/android/serveracceptancethread.cpp @@ -38,10 +38,12 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) +Q_DECLARE_METATYPE(QBluetoothServer::Error) + ServerAcceptanceThread::ServerAcceptanceThread(QObject *parent) : QObject(parent), maxPendingConnections(1) { - qRegisterMetaType("QBluetoothServer::Error"); + qRegisterMetaType(); } ServerAcceptanceThread::~ServerAcceptanceThread() diff --git a/src/bluetooth/qbluetoothaddress.cpp b/src/bluetooth/qbluetoothaddress.cpp index 53ac7881..481bcc0d 100644 --- a/src/bluetooth/qbluetoothaddress.cpp +++ b/src/bluetooth/qbluetoothaddress.cpp @@ -65,7 +65,7 @@ class BluetoothAddressRegisterMetaTypes public: BluetoothAddressRegisterMetaTypes() { - qRegisterMetaType("QBluetoothAddress"); + qRegisterMetaType(); } } _registerBluetoothAddressMetaTypes; } diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp index 93b7c7d4..d2fba203 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp @@ -126,7 +126,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() if (!receiver) { // SDP based device discovery receiver = new DeviceDiscoveryBroadcastReceiver(); - qRegisterMetaType("QBluetoothDeviceInfo"); + qRegisterMetaType(); QObject::connect(receiver, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo,bool)), this, SLOT(processDiscoveredDevices(QBluetoothDeviceInfo,bool))); QObject::connect(receiver, SIGNAL(finished()), this, SLOT(processSdpDiscoveryFinished())); diff --git a/src/bluetooth/qbluetoothdeviceinfo.h b/src/bluetooth/qbluetoothdeviceinfo.h index e86ea62e..c9822193 100644 --- a/src/bluetooth/qbluetoothdeviceinfo.h +++ b/src/bluetooth/qbluetoothdeviceinfo.h @@ -36,7 +36,8 @@ #include -#include +#include +#include QT_BEGIN_NAMESPACE @@ -242,4 +243,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(QBluetoothDeviceInfo) + #endif diff --git a/src/bluetooth/qbluetoothlocaldevice.cpp b/src/bluetooth/qbluetoothlocaldevice.cpp index c76ace95..87e1e521 100644 --- a/src/bluetooth/qbluetoothlocaldevice.cpp +++ b/src/bluetooth/qbluetoothlocaldevice.cpp @@ -103,9 +103,9 @@ class LocalDeviceRegisterMetaTypes public: LocalDeviceRegisterMetaTypes() { - qRegisterMetaType("QBluetoothLocalDevice::HostMode"); - qRegisterMetaType("QBluetoothLocalDevice::Pairing"); - qRegisterMetaType("QBluetoothLocalDevice::Error"); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); } } _registerLocalDeviceMetaTypes; } diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h index 02be2f5b..787d58e3 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent.h @@ -120,4 +120,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(QBluetoothServiceDiscoveryAgent::Error) + #endif diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp index e10d2ffe..92a67caa 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp @@ -81,7 +81,7 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate( if (!btAdapter.isValid()) qCWarning(QT_BT_ANDROID) << "Platform does not support Bluetooth"; - qRegisterMetaType >("QList"); + qRegisterMetaType >(); } QBluetoothServiceDiscoveryAgentPrivate::~QBluetoothServiceDiscoveryAgentPrivate() diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index d82a73a8..6958e1b2 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -71,9 +71,9 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(c managerBluez5 = new OrgFreedesktopDBusObjectManagerInterface( QStringLiteral("org.bluez"), QStringLiteral("/"), QDBusConnection::systemBus()); - qRegisterMetaType("QBluetoothServiceDiscoveryAgent::Error"); + qRegisterMetaType(); } else { - qRegisterMetaType("ServiceMap"); + qRegisterMetaType(); qDBusRegisterMetaType(); manager = new OrgBluezManagerInterface(QStringLiteral("org.bluez"), QStringLiteral("/"), diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp index d8a03105..4b7108be 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp @@ -132,8 +132,8 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(c connect(&m_queryTimer, SIGNAL(timeout()), this, SLOT(queryTimeout())); ppsRegisterForEvent(QStringLiteral("service_updated"), this); //Needed for connecting signals and slots from static function - qRegisterMetaType("QBluetoothServiceInfo"); - qRegisterMetaType("QBluetoothServiceDiscoveryAgent::Error"); + qRegisterMetaType(); + qRegisterMetaType(); } QBluetoothServiceDiscoveryAgentPrivate::~QBluetoothServiceDiscoveryAgentPrivate() diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 5b4d3c5b..e68c2bc3 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -161,4 +161,7 @@ Q_BLUETOOTH_EXPORT QDebug operator<<(QDebug, QBluetoothSocket::SocketState); QT_END_NAMESPACE +Q_DECLARE_METATYPE(QBluetoothSocket::SocketError) +Q_DECLARE_METATYPE(QBluetoothSocket::SocketState) + #endif diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index e8d7d028..02440abc 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -40,7 +40,6 @@ #include #include - QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) @@ -57,8 +56,8 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() adapter = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter", "getDefaultAdapter", "()Landroid/bluetooth/BluetoothAdapter;"); - qRegisterMetaType("QBluetoothSocket::SocketError"); - qRegisterMetaType("QBluetoothSocket::SocketState"); + qRegisterMetaType(); + qRegisterMetaType(); } QBluetoothSocketPrivate::~QBluetoothSocketPrivate() diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index cfb1a599..c33de8d5 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -296,8 +296,8 @@ QLowEnergyService::QLowEnergyService(QSharedPointer p, : QObject(parent), d_ptr(p) { - qRegisterMetaType("QLowEnergyService::ServiceState"); - qRegisterMetaType("QLowEnergyService::ServiceError"); + qRegisterMetaType(); + qRegisterMetaType(); connect(p.data(), SIGNAL(error(QLowEnergyService::ServiceError)), this, SIGNAL(error(QLowEnergyService::ServiceError))); diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 136f85ee..2c86d380 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -120,4 +120,7 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(QLowEnergyService::ServiceState) +Q_DECLARE_METATYPE(QLowEnergyService::ServiceError) + #endif // QLOWENERGYSERVICE_H diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index 2e961c0c..c6284bbd 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -63,8 +63,8 @@ QLowEnergyService::QLowEnergyService(QSharedPointer d, : QObject(parent), d_ptr(d) { - qRegisterMetaType("QLowEnergyService::ServiceState"); - qRegisterMetaType("QLowEnergyService::ServiceError"); + qRegisterMetaType(); + qRegisterMetaType(); connect(d.data(), SIGNAL(error(QLowEnergyService::ServiceError)), this, SIGNAL(error(QLowEnergyService::ServiceError))); diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp index cbf5bd42..6374c8fb 100644 --- a/src/nfc/qnearfieldtarget.cpp +++ b/src/nfc/qnearfieldtarget.cpp @@ -272,9 +272,9 @@ QNearFieldTarget::RequestId &QNearFieldTarget::RequestId::operator=(const Reques QNearFieldTarget::QNearFieldTarget(QObject *parent) : QObject(parent), d_ptr(new QNearFieldTargetPrivate) { - qRegisterMetaType("QNearFieldTarget::RequestId"); - qRegisterMetaType("QNearFieldTarget::Error"); - qRegisterMetaType("QNdefMessage::QNdefMessage"); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); } /*! diff --git a/src/nfc/qnearfieldtarget_emulator.cpp b/src/nfc/qnearfieldtarget_emulator.cpp index ee0c6188..a483fe4b 100644 --- a/src/nfc/qnearfieldtarget_emulator.cpp +++ b/src/nfc/qnearfieldtarget_emulator.cpp @@ -187,7 +187,7 @@ bool TagType2::waitForRequestCompleted(const RequestId &id, int msecs) TagActivator::TagActivator() : timerId(-1) { - qRegisterMetaType("QNearFieldTarget::Error"); + qRegisterMetaType(); } TagActivator::~TagActivator() diff --git a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp index e80a6dc5..89c2805c 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp +++ b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp @@ -44,8 +44,8 @@ QT_USE_NAMESPACE -Q_DECLARE_METATYPE(QBluetoothDeviceInfo) Q_DECLARE_METATYPE(QBluetoothDeviceDiscoveryAgent::InquiryType) +Q_DECLARE_METATYPE(QBluetoothDeviceDiscoveryAgent::Error) /* * Some parts of this test require a remote and discoverable Bluetooth @@ -92,7 +92,7 @@ private: tst_QBluetoothDeviceDiscoveryAgent::tst_QBluetoothDeviceDiscoveryAgent() { QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); - qRegisterMetaType("QBluetoothDeviceDiscoveryAgent::Error"); + qRegisterMetaType(); } tst_QBluetoothDeviceDiscoveryAgent::~tst_QBluetoothDeviceDiscoveryAgent() @@ -101,8 +101,8 @@ tst_QBluetoothDeviceDiscoveryAgent::~tst_QBluetoothDeviceDiscoveryAgent() void tst_QBluetoothDeviceDiscoveryAgent::initTestCase() { - qRegisterMetaType("QBluetoothDeviceInfo"); - qRegisterMetaType("QBluetoothDeviceDiscoveryAgent::InquiryType"); + qRegisterMetaType(); + qRegisterMetaType(); noOfLocalDevices = QBluetoothLocalDevice::allDevices().count(); if (!noOfLocalDevices) diff --git a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp index f43bdb23..18698afd 100644 --- a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp +++ b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp @@ -79,8 +79,8 @@ tst_QBluetoothDeviceInfo::~tst_QBluetoothDeviceInfo() void tst_QBluetoothDeviceInfo::initTestCase() { - qRegisterMetaType("QBluetoothDeviceInfo::ServiceClasses"); - qRegisterMetaType("QBluetoothDeviceInfo::MajorDeviceClass"); + qRegisterMetaType(); + qRegisterMetaType(); // start Bluetooth if not started QBluetoothLocalDevice *device = new QBluetoothLocalDevice(); device->powerOn(); diff --git a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp index 01a79a03..fca02b28 100644 --- a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp +++ b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp @@ -118,8 +118,8 @@ void tst_QBluetoothServer::setHostMode(const QBluetoothAddress &localAdapter, void tst_QBluetoothServer::initTestCase() { - qRegisterMetaType("QBluetooth::SecurityFlags"); - qRegisterMetaType("QBluetoothServer::Error"); + qRegisterMetaType(); + qRegisterMetaType(); QBluetoothLocalDevice device; if (!device.isValid()) diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp index 341c6918..b0c97d07 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp +++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp @@ -47,8 +47,7 @@ QT_USE_NAMESPACE -Q_DECLARE_METATYPE(QBluetoothDeviceInfo) -Q_DECLARE_METATYPE(QBluetoothServiceDiscoveryAgent::Error) +Q_DECLARE_METATYPE(QBluetoothDeviceDiscoveryAgent::Error) // Maximum time to for bluetooth device scan const int MaxScanTime = 5 * 60 * 1000; // 5 minutes in ms @@ -98,11 +97,11 @@ tst_QBluetoothServiceDiscoveryAgent::tst_QBluetoothServiceDiscoveryAgent() localDeviceAvailable = QBluetoothLocalDevice().hostMode() != QBluetoothLocalDevice::HostPoweredOff; #endif - qRegisterMetaType("QBluetoothDeviceInfo"); - qRegisterMetaType("QBluetoothServiceInfo"); - qRegisterMetaType >("QList"); - qRegisterMetaType("QBluetoothServiceDiscoveryAgent::Error"); - qRegisterMetaType("QBluetoothDeviceDiscoveryAgent::Error"); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType >(); + qRegisterMetaType(); + qRegisterMetaType(); } diff --git a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp index 61bad7c5..011b0e5f 100644 --- a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp +++ b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp @@ -78,9 +78,9 @@ tst_QBluetoothServiceInfo::~tst_QBluetoothServiceInfo() void tst_QBluetoothServiceInfo::initTestCase() { - qRegisterMetaType("QBluetoothUuid::ProtocolUuid"); - qRegisterMetaType("QUuid"); - qRegisterMetaType("QBluetoothServiceInfo::Protocol"); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); // start Bluetooth if not started QBluetoothLocalDevice *device = new QBluetoothLocalDevice(); device->powerOn(); diff --git a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp index 6290f075..d7a35b1b 100644 --- a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp +++ b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp @@ -43,8 +43,6 @@ QT_USE_NAMESPACE -Q_DECLARE_METATYPE(QBluetoothSocket::SocketState) -Q_DECLARE_METATYPE(QBluetoothSocket::SocketError) Q_DECLARE_METATYPE(QBluetoothServiceInfo::Protocol) //same uuid as tests/bttestui @@ -100,8 +98,8 @@ Q_DECLARE_METATYPE(tst_QBluetoothSocket::ClientConnectionShutdown) tst_QBluetoothSocket::tst_QBluetoothSocket() { - qRegisterMetaType("QBluetoothSocket::SocketState"); - qRegisterMetaType("QBluetoothSocket::SocketError"); + qRegisterMetaType(); + qRegisterMetaType(); localDeviceFound = false; // true if we have a local adapter done_discovery = false; //true if we found remote device diff --git a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp index b39e6292..b3b80e5e 100644 --- a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp +++ b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp @@ -92,7 +92,7 @@ private: tst_QBluetoothTransferManager::tst_QBluetoothTransferManager() { - qRegisterMetaType("QBluetoothTransferReply*"); + qRegisterMetaType(); } tst_QBluetoothTransferManager::~tst_QBluetoothTransferManager() diff --git a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp index e905eb94..6743d38c 100644 --- a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp +++ b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp @@ -69,7 +69,7 @@ private slots: tst_QBluetoothUuid::tst_QBluetoothUuid() { - qRegisterMetaType("quint128"); + qRegisterMetaType(); } tst_QBluetoothUuid::~tst_QBluetoothUuid() diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 8cd5cdee..8f5db8ab 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -97,7 +97,6 @@ private: Q_DECLARE_METATYPE(QLowEnergyCharacteristic) Q_DECLARE_METATYPE(QLowEnergyDescriptor) -Q_DECLARE_METATYPE(QLowEnergyService::ServiceError) tst_QLowEnergyController::tst_QLowEnergyController() { diff --git a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp index 694b6b1b..8f3009ad 100644 --- a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp +++ b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp @@ -75,8 +75,8 @@ tst_QNearFieldManager::tst_QNearFieldManager() { QDir::setCurrent(QLatin1String(SRCDIR)); - qRegisterMetaType("QNdefMessage"); - qRegisterMetaType("QNearFieldTarget*"); + qRegisterMetaType(); + qRegisterMetaType(); } void tst_QNearFieldManager::initTestCase() diff --git a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp index 0d733e1d..a36fdffb 100644 --- a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp +++ b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp @@ -72,8 +72,8 @@ tst_QNearFieldTagType1::tst_QNearFieldTagType1() { QDir::setCurrent(QLatin1String(SRCDIR)); - qRegisterMetaType("QNdefMessage"); - qRegisterMetaType("QNearFieldTarget*"); + qRegisterMetaType(); + qRegisterMetaType(); } void tst_QNearFieldTagType1::init() diff --git a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp index 39a2c68b..510be44f 100644 --- a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp +++ b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp @@ -74,8 +74,8 @@ tst_QNearFieldTagType2::tst_QNearFieldTagType2() { QDir::setCurrent(QLatin1String(SRCDIR)); - qRegisterMetaType("QNdefMessage"); - qRegisterMetaType("QNearFieldTarget*"); + qRegisterMetaType(); + qRegisterMetaType(); } void tst_QNearFieldTagType2::init() -- cgit v1.2.3 From 3402cb8695aee2625eee8a4a4a96f81511c820e8 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 16 Jan 2015 16:25:21 +0100 Subject: Optimize qRegisterMetaType() calls for QBluetoothTransferReply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reduces the number of registration calls since a QBluetoothTransferManager is created once or twice whereas multiple QBluetoothTransferReply instances are common. Change-Id: I14bc636cb91d9bd399d8dae55140808ec6bf7fe5 Reviewed-by: Timur Pocheptsov Reviewed-by: Jędrzej Nowacki --- src/bluetooth/qbluetoothtransfermanager.cpp | 2 ++ src/bluetooth/qbluetoothtransferreply.cpp | 2 -- tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qbluetoothtransfermanager.cpp b/src/bluetooth/qbluetoothtransfermanager.cpp index 65eecae3..ea2406f1 100644 --- a/src/bluetooth/qbluetoothtransfermanager.cpp +++ b/src/bluetooth/qbluetoothtransfermanager.cpp @@ -90,6 +90,8 @@ QT_BEGIN_NAMESPACE QBluetoothTransferManager::QBluetoothTransferManager(QObject *parent) : QObject(parent) { + qRegisterMetaType(); + qRegisterMetaType(); } /*! diff --git a/src/bluetooth/qbluetoothtransferreply.cpp b/src/bluetooth/qbluetoothtransferreply.cpp index af1bf828..a40e7191 100644 --- a/src/bluetooth/qbluetoothtransferreply.cpp +++ b/src/bluetooth/qbluetoothtransferreply.cpp @@ -118,8 +118,6 @@ void QBluetoothTransferReply::abort() QBluetoothTransferReply::QBluetoothTransferReply(QObject *parent) : QObject(parent), d_ptr(new QBluetoothTransferReplyPrivate()) { - qRegisterMetaType(); - qRegisterMetaType(); } /*! diff --git a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp index b3b80e5e..b3271a5d 100644 --- a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp +++ b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp @@ -92,7 +92,6 @@ private: tst_QBluetoothTransferManager::tst_QBluetoothTransferManager() { - qRegisterMetaType(); } tst_QBluetoothTransferManager::~tst_QBluetoothTransferManager() -- cgit v1.2.3 From 4706708254176ca2b971a709697d0e8c77f55974 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 28 Jan 2015 15:49:29 +0100 Subject: Add changelog for QtBluetooth/QtNfc 5.4.1 release. Change-Id: I1f4f3ace78b4619a43581182d885c479314a7603 Reviewed-by: Aaron McCarthy --- dist/changes-5.4.1 | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 dist/changes-5.4.1 diff --git a/dist/changes-5.4.1 b/dist/changes-5.4.1 new file mode 100644 index 00000000..5a4a5dba --- /dev/null +++ b/dist/changes-5.4.1 @@ -0,0 +1,38 @@ +Qt 5.4.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.4.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtBluetooth +----------- + + - General: + * Extended documentation with regards to Bluetooth Low Energy. The + affected classes were QLowEnergyController and QLowEnergyService. + * LowEnergyScanner and chat examples improved. + + - QBluetoothServer: + * [QTBUG-43806] Fixed SDP registration of PublicBrowseGroup in BlueZ 5.x. + + - QLowEnergyController: + * Fixed blocking of ATT command processing due to a reconnect to the target + device. + -- cgit v1.2.3 From 9cc6a9b3af559004bbfdfec3aa7dd258bee1eb77 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 26 Jan 2015 08:47:06 +0100 Subject: Fix crashing btchat example when selecting remote device The example immidiately destroys the QBluetoothServiceDiscoveryAgent when the user selects a remote chat service from the remote selector dialog. This may happen even when the scheduled QtConcurrent call to runSdpScan() was still pending. The subsequent signal callback into the deleted parent caused a crash. Unfortunately QtConcurrent::run() returns a QFuture which does not permit stopping the pending thread execution. Therefore the runSdpScan() had to be rewritten using QProcess to properly destruct pending calls. Change-Id: I1ed5e147feb94a26240901a02d836056eddabbf6 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- examples/bluetooth/btchat/main.cpp | 2 + examples/bluetooth/btchat/remoteselector.cpp | 2 + src/bluetooth/qbluetoothservicediscoveryagent.cpp | 5 + src/bluetooth/qbluetoothservicediscoveryagent.h | 6 +- .../qbluetoothservicediscoveryagent_bluez.cpp | 107 ++++++++++----------- src/bluetooth/qbluetoothservicediscoveryagent_p.h | 6 +- 6 files changed, 69 insertions(+), 59 deletions(-) diff --git a/examples/bluetooth/btchat/main.cpp b/examples/bluetooth/btchat/main.cpp index ac23a11d..ed362d23 100644 --- a/examples/bluetooth/btchat/main.cpp +++ b/examples/bluetooth/btchat/main.cpp @@ -41,9 +41,11 @@ #include "chat.h" #include +//#include int main(int argc, char *argv[]) { + //QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); QApplication app(argc, argv); Chat d; diff --git a/examples/bluetooth/btchat/remoteselector.cpp b/examples/bluetooth/btchat/remoteselector.cpp index 79dc0564..913988a2 100644 --- a/examples/bluetooth/btchat/remoteselector.cpp +++ b/examples/bluetooth/btchat/remoteselector.cpp @@ -136,6 +136,8 @@ void RemoteSelector::on_remoteDevices_itemActivated(QListWidgetItem *item) { qDebug() << "got click" << item->text(); m_service = m_discoveredServices.value(item); + if (m_discoveryAgent->isActive()) + m_discoveryAgent->stop(); accept(); } diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index ef28ef82..7274780a 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -183,6 +183,11 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoot QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent() { + if (isActive()) { + disconnect(); //don't emit any signals due to stop() + stop(); + } + delete d_ptr; } diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h index 5e47ada0..b4f9d5f3 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent.h @@ -42,6 +42,10 @@ #include #include +#ifdef QT_BLUEZ_BLUETOOTH +#include +#endif + QT_BEGIN_NAMESPACE class QBluetoothAddress; @@ -106,7 +110,7 @@ private: #ifdef QT_BLUEZ_BLUETOOTH Q_PRIVATE_SLOT(d_func(), void _q_discoveredServices(QDBusPendingCallWatcher*)) Q_PRIVATE_SLOT(d_func(), void _q_createdDevice(QDBusPendingCallWatcher*)) - Q_PRIVATE_SLOT(d_func(), void _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::Error, const QString &, const QStringList &)) + Q_PRIVATE_SLOT(d_func(), void _q_sdpScannerDone(int,QProcess::ExitStatus)) #endif #ifdef QT_ANDROID_BLUETOOTH Q_PRIVATE_SLOT(d_func(), void _q_processFetchedUuids(const QBluetoothAddress &address, diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index d82a73a8..75efa37d 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -65,7 +65,7 @@ static inline void convertAddress(quint64 from, quint8 (&to)[6]) QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) : error(QBluetoothServiceDiscoveryAgent::NoError), m_deviceAdapterAddress(deviceAdapter), state(Inactive), deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), singleDevice(false), - manager(0), managerBluez5(0), adapter(0), device(0) + manager(0), managerBluez5(0), adapter(0), device(0), sdpScannerProcess(0) { if (isBluez5()) { managerBluez5 = new OrgFreedesktopDBusObjectManagerInterface( @@ -136,6 +136,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr } +// Bluez 5 void QBluetoothServiceDiscoveryAgentPrivate::startBluez5(const QBluetoothAddress &address) { Q_Q(QBluetoothServiceDiscoveryAgent); @@ -185,81 +186,64 @@ void QBluetoothServiceDiscoveryAgentPrivate::startBluez5(const QBluetoothAddress if (DiscoveryMode() == QBluetoothServiceDiscoveryAgent::MinimalDiscovery) { performMinimalServiceDiscovery(address); } else { - // we need to run the discovery in a different thread - // as it involves blocking calls - QtConcurrent::run(this, &QBluetoothServiceDiscoveryAgentPrivate::runSdpScan, - address, QBluetoothAddress(adapter.address())); + runExternalSdpScan(address, QBluetoothAddress(adapter.address())); } } -/* - * This function runs in a different thread. We need to be very careful what we - * access from here. That's why invokeMethod is used below. - * +/* Bluez 5 * src/tools/sdpscanner performs an SDP scan. This is * done out-of-process to avoid license issues. At this stage Bluez uses GPLv2. */ -void QBluetoothServiceDiscoveryAgentPrivate::runSdpScan( +void QBluetoothServiceDiscoveryAgentPrivate::runExternalSdpScan( const QBluetoothAddress &remoteAddress, const QBluetoothAddress localAddress) { Q_Q(QBluetoothServiceDiscoveryAgent); - const QString binPath = QLibraryInfo::location(QLibraryInfo::BinariesPath); - - QFileInfo fileInfo(binPath, QStringLiteral("sdpscanner")); - if (!fileInfo.exists() || !fileInfo.isExecutable()) { - QMetaObject::invokeMethod(q, "_q_finishSdpScan", Qt::QueuedConnection, - Q_ARG(QBluetoothServiceDiscoveryAgent::Error, - QBluetoothServiceDiscoveryAgent::InputOutputError), - Q_ARG(QString, - QBluetoothServiceDiscoveryAgent::tr("Unable to find sdpscanner")), - Q_ARG(QStringList, QStringList())); - qCWarning(QT_BT_BLUEZ) << "Cannot find sdpscanner:" - << fileInfo.canonicalFilePath(); - return; + if (!sdpScannerProcess) { + const QString binPath = QLibraryInfo::location(QLibraryInfo::BinariesPath); + QFileInfo fileInfo(binPath, QStringLiteral("sdpscanner")); + if (!fileInfo.exists() || !fileInfo.isExecutable()) { + _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::InputOutputError, + QBluetoothServiceDiscoveryAgent::tr("Unable to find sdpscanner"), + QStringList()); + qCWarning(QT_BT_BLUEZ) << "Cannot find sdpscanner:" + << fileInfo.canonicalFilePath(); + return; + } + + sdpScannerProcess = new QProcess(q); + sdpScannerProcess->setReadChannel(QProcess::StandardOutput); + sdpScannerProcess->setProgram(fileInfo.canonicalFilePath()); + q->connect(sdpScannerProcess, SIGNAL(finished(int,QProcess::ExitStatus)), + q, SLOT(_q_sdpScannerDone(int,QProcess::ExitStatus))); + } QStringList arguments; arguments << remoteAddress.toString() << localAddress.toString(); - QByteArray output; - - QProcess process; - process.setProcessChannelMode(QProcess::ForwardedErrorChannel); - process.setReadChannel(QProcess::StandardOutput); - process.start(fileInfo.canonicalFilePath(), arguments); - - if (process.waitForStarted(-1)) { - while (process.waitForReadyRead(-1)) - output += process.readAllStandardOutput(); - } - - process.waitForFinished(); + sdpScannerProcess->setArguments(arguments); + sdpScannerProcess->start(); +} - if (process.exitStatus() != QProcess::NormalExit - || process.exitCode() != 0) { - qCWarning(QT_BT_BLUEZ) << "SDP scan failure" - << process.exitStatus() << process.exitCode() - << remoteAddress; +// Bluez 5 +void QBluetoothServiceDiscoveryAgentPrivate::_q_sdpScannerDone(int exitCode, QProcess::ExitStatus status) +{ + if (status != QProcess::NormalExit || exitCode != 0) { + qCWarning(QT_BT_BLUEZ) << "SDP scan failure" << status << exitCode; if (singleDevice) { - QMetaObject::invokeMethod(q, "_q_finishSdpScan", Qt::QueuedConnection, - Q_ARG(QBluetoothServiceDiscoveryAgent::Error, - QBluetoothServiceDiscoveryAgent::InputOutputError), - Q_ARG(QString, - QBluetoothServiceDiscoveryAgent::tr("Unable to perform SDP scan")), - Q_ARG(QStringList, QStringList())); + _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::InputOutputError, + QBluetoothServiceDiscoveryAgent::tr("Unable to perform SDP scan"), + QStringList()); } else { // go to next device - QMetaObject::invokeMethod(q, "_q_finishSdpScan", Qt::QueuedConnection, - Q_ARG(QBluetoothServiceDiscoveryAgent::Error, - QBluetoothServiceDiscoveryAgent::NoError), - Q_ARG(QString, QString()), - Q_ARG(QStringList, QStringList())); + _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::NoError, QString(), QStringList()); } return; } QStringList xmlRecords; + const QByteArray output = sdpScannerProcess->readAllStandardOutput(); const QString decodedData = QString::fromUtf8(QByteArray::fromBase64(output)); // split the various xml docs up @@ -276,13 +260,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::runSdpScan( } while ( start != -1); } - QMetaObject::invokeMethod(q, "_q_finishSdpScan", Qt::QueuedConnection, - Q_ARG(QBluetoothServiceDiscoveryAgent::Error, - QBluetoothServiceDiscoveryAgent::NoError), - Q_ARG(QString, QString()), - Q_ARG(QStringList, xmlRecords)); + _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::NoError, QString(), xmlRecords); } +// Bluez 5 void QBluetoothServiceDiscoveryAgentPrivate::_q_finishSdpScan(QBluetoothServiceDiscoveryAgent::Error errorCode, const QString &errorDescription, const QStringList &xmlRecords) @@ -352,8 +333,19 @@ void QBluetoothServiceDiscoveryAgentPrivate::stop() Q_ASSERT(!device); } + discoveredDevices.clear(); setDiscoveryState(Inactive); + + // must happen after discoveredDevices.clear() above to avoid retrigger of next scan + // while waitForFinished() is waiting + if (sdpScannerProcess) { // Bluez 5 + if (sdpScannerProcess->state() != QProcess::NotRunning) { + sdpScannerProcess->kill(); + sdpScannerProcess->waitForFinished(); + } + } + Q_Q(QBluetoothServiceDiscoveryAgent); emit q->canceled(); } @@ -591,6 +583,7 @@ QBluetoothServiceInfo QBluetoothServiceDiscoveryAgentPrivate::parseServiceXml( return serviceInfo; } +// Bluez 5 void QBluetoothServiceDiscoveryAgentPrivate::performMinimalServiceDiscovery(const QBluetoothAddress &deviceAddress) { if (foundHostAdapterPath.isEmpty()) { diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.h b/src/bluetooth/qbluetoothservicediscoveryagent_p.h index ea985627..3b9c0a42 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.h @@ -58,6 +58,7 @@ class OrgBluezManagerInterface; class OrgBluezAdapterInterface; class OrgBluezDeviceInterface; class OrgFreedesktopDBusObjectManagerInterface; +#include QT_BEGIN_NAMESPACE class QDBusPendingCallWatcher; @@ -127,6 +128,7 @@ public: void _q_discoverGattCharacteristics(QDBusPendingCallWatcher *watcher); void _q_discoveredGattCharacteristic(QDBusPendingCallWatcher *watcher); */ + void _q_sdpScannerDone(int exitCode, QProcess::ExitStatus status); void _q_finishSdpScan(QBluetoothServiceDiscoveryAgent::Error errorCode, const QString &errorDescription, const QStringList &xmlRecords); @@ -147,8 +149,9 @@ private: #ifdef QT_BLUEZ_BLUETOOTH void startBluez5(const QBluetoothAddress &address); - void runSdpScan(const QBluetoothAddress &remoteAddress, + void runExternalSdpScan(const QBluetoothAddress &remoteAddress, const QBluetoothAddress localAddress); + void sdpScannerDone(int exitCode, QProcess::ExitStatus exitStatus); QVariant readAttributeValue(QXmlStreamReader &xml); QBluetoothServiceInfo parseServiceXml(const QString& xml); void performMinimalServiceDiscovery(const QBluetoothAddress &deviceAddress); @@ -195,6 +198,7 @@ private: OrgFreedesktopDBusObjectManagerInterface *managerBluez5; OrgBluezAdapterInterface *adapter; OrgBluezDeviceInterface *device; + QProcess *sdpScannerProcess; #endif #ifdef QT_ANDROID_BLUETOOTH -- cgit v1.2.3 From df1320d940d56a2a8d2b98bde1bce1c4124e9950 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 19 Jan 2015 11:04:06 +0100 Subject: Android: Enable pairing for Android v15+ The required API became public in Android v19 which is what was used as check so far. However the same API was already privately provided since Android v15. THis patch ensures that older Android versions can create pairing requests too. This patch was provided by George Najarian. Task-number: QTBUG-43757 Change-Id: I0f38e538a972341a6acf719098f1010e52b639b7 Reviewed-by: BogDan Vatra Reviewed-by: Timur Pocheptsov --- src/bluetooth/android/localdevicebroadcastreceiver.cpp | 4 ++-- src/bluetooth/qbluetoothlocaldevice_android.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bluetooth/android/localdevicebroadcastreceiver.cpp b/src/bluetooth/android/localdevicebroadcastreceiver.cpp index c54c5e32..a3b92252 100644 --- a/src/bluetooth/android/localdevicebroadcastreceiver.cpp +++ b/src/bluetooth/android/localdevicebroadcastreceiver.cpp @@ -50,8 +50,8 @@ LocalDeviceBroadcastReceiver::LocalDeviceBroadcastReceiver(QObject *parent) : addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionScanModeChanged)); addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclConnected)); addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclDisconnected)); - if (QtAndroidPrivate::androidSdkVersion() >= 19) - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionPairingRequest)); //API 19 + if (QtAndroidPrivate::androidSdkVersion() >= 15) + addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionPairingRequest)); //API 15 //cache integer values for host & bonding mode //don't use the java fields directly but refer to them by name diff --git a/src/bluetooth/qbluetoothlocaldevice_android.cpp b/src/bluetooth/qbluetoothlocaldevice_android.cpp index 4c1b1d4e..11515743 100644 --- a/src/bluetooth/qbluetoothlocaldevice_android.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_android.cpp @@ -376,9 +376,9 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai return; } - // BluetoothDevice::createBond() requires Android API 19 - if (QtAndroidPrivate::androidSdkVersion() < 19 || !d_ptr->adapter()) { - qCWarning(QT_BT_ANDROID) << "Unable to pair: requires Android API 19+"; + // BluetoothDevice::createBond() requires Android API 15 + if (QtAndroidPrivate::androidSdkVersion() < 15 || !d_ptr->adapter()) { + qCWarning(QT_BT_ANDROID) << "Unable to pair: requires Android API 15+"; QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QBluetoothLocalDevice::Error, QBluetoothLocalDevice::PairingError)); -- cgit v1.2.3 From 6839bd80c041678c3d738f9274f7277b825e9dc6 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 4 Feb 2015 14:33:22 +0100 Subject: Mark new NearField signals and property with Revision tag This enables proper versioning. Change-Id: Iae3e54ed91a7fa78ba6b978cb4c5194f4e1e105a Reviewed-by: Frank Meerkoetter Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativenearfield_p.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/imports/nfc/qdeclarativenearfield_p.h b/src/imports/nfc/qdeclarativenearfield_p.h index 2242d578..eb29509a 100644 --- a/src/imports/nfc/qdeclarativenearfield_p.h +++ b/src/imports/nfc/qdeclarativenearfield_p.h @@ -63,7 +63,7 @@ class QDeclarativeNearField : public QObject, public QQmlParserStatus Q_PROPERTY(QQmlListProperty messageRecords READ messageRecords NOTIFY messageRecordsChanged) Q_PROPERTY(QQmlListProperty filter READ filter NOTIFY filterChanged) Q_PROPERTY(bool orderMatch READ orderMatch WRITE setOrderMatch NOTIFY orderMatchChanged) - Q_PROPERTY(bool polling READ polling WRITE setPolling NOTIFY pollingChanged) + Q_PROPERTY(bool polling READ polling WRITE setPolling NOTIFY pollingChanged REVISION 1) Q_INTERFACES(QQmlParserStatus) @@ -88,10 +88,10 @@ signals: void messageRecordsChanged(); void filterChanged(); void orderMatchChanged(); - void pollingChanged(); + Q_REVISION(1) void pollingChanged(); - void tagFound(); - void tagRemoved(); + Q_REVISION(1) void tagFound(); + Q_REVISION(1) void tagRemoved(); private slots: void _q_handleNdefMessage(const QNdefMessage &message); -- cgit v1.2.3 From 7a053af71f7f53365128f8c337d73ccfbab7f616 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 4 Feb 2015 14:34:05 +0100 Subject: Bump QtNfc QML API version to 5.5 NearField QML type introduces a new revision which must be registered. Change-Id: Icc8499380babff5060548c1d25bd9cd67c5229df Reviewed-by: Frank Meerkoetter Reviewed-by: Martin Leutelt Reviewed-by: Alex Blasche --- src/imports/nfc/plugin.cpp | 4 ++++ src/imports/nfc/plugins.qmltypes | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp index 52b4db9c..d9a8bc07 100644 --- a/src/imports/nfc/plugin.cpp +++ b/src/imports/nfc/plugin.cpp @@ -79,6 +79,10 @@ public: // introduces 5.4 version, other existing 5.2 exports become automatically available under 5.2-5.4l minor = 4; qmlRegisterType(uri, major, minor, "NearField"); + + // Register the 5.5 types + minor = 5; + qmlRegisterType(uri, major, minor, "NearField"); } }; diff --git a/src/imports/nfc/plugins.qmltypes b/src/imports/nfc/plugins.qmltypes index bbdc4398..6abc211d 100644 --- a/src/imports/nfc/plugins.qmltypes +++ b/src/imports/nfc/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.1 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -notrelocatable QtNfc 5.4' +// 'qmlplugindump -nonrelocatable QtNfc 5.5' Module { Component { @@ -55,12 +55,17 @@ Module { exports: [ "QtNfc/NearField 5.0", "QtNfc/NearField 5.2", - "QtNfc/NearField 5.4" + "QtNfc/NearField 5.4", + "QtNfc/NearField 5.5" ] - exportMetaObjectRevisions: [0, 0, 0] + exportMetaObjectRevisions: [0, 0, 0, 1] Property { name: "messageRecords"; type: "QQmlNdefRecord"; isList: true; isReadonly: true } Property { name: "filter"; type: "QDeclarativeNdefFilter"; isList: true; isReadonly: true } Property { name: "orderMatch"; type: "bool" } + Property { name: "polling"; revision: 1; type: "bool" } + Signal { name: "pollingChanged"; revision: 1 } + Signal { name: "tagFound"; revision: 1 } + Signal { name: "tagRemoved"; revision: 1 } } Component { name: "QQmlNdefRecord" -- cgit v1.2.3 From 9ef4f53f1ff0696d5aae4496715975a2fc884c9b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 4 Feb 2015 14:46:34 +0100 Subject: Bump QtBluetooth QML versions to 5.5 There have been no new additions in Qt 5.5 so far. Change-Id: Ib6c0d7b333bba327942fc48737f9762079062e7b Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/imports/bluetooth/plugin.cpp | 6 +++--- src/imports/bluetooth/plugins.qmltypes | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp index 24206106..dd889d30 100644 --- a/src/imports/bluetooth/plugin.cpp +++ b/src/imports/bluetooth/plugin.cpp @@ -67,9 +67,9 @@ public: qmlRegisterType(uri, major, minor, "BluetoothService"); qmlRegisterType(uri, major, minor, "BluetoothSocket"); - // Register the 5.4 types - // introduces 5.4 version, other existing 5.2 exports become automatically available under 5.2-5.4 - minor = 4; + // Register the 5.5 types + // introduces 5.5 version, other existing 5.2 exports become automatically available under 5.2-5.4 + minor = 5; qmlRegisterType(uri, major, minor, "BluetoothDiscoveryModel"); } }; diff --git a/src/imports/bluetooth/plugins.qmltypes b/src/imports/bluetooth/plugins.qmltypes index cf2146e2..e9b93e54 100644 --- a/src/imports/bluetooth/plugins.qmltypes +++ b/src/imports/bluetooth/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.1 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -notrelocatable QtBluetooth 5.4' +// 'qmlplugindump -nonrelocatable QtBluetooth 5.5' Module { Component { @@ -13,7 +13,7 @@ Module { exports: [ "QtBluetooth/BluetoothDiscoveryModel 5.0", "QtBluetooth/BluetoothDiscoveryModel 5.2", - "QtBluetooth/BluetoothDiscoveryModel 5.4" + "QtBluetooth/BluetoothDiscoveryModel 5.5" ] exportMetaObjectRevisions: [0, 0, 0] Enum { -- cgit v1.2.3 From 8d3f8eabf5428de257c46dda10d541d0ce4b582a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 2 Feb 2015 14:35:21 +0100 Subject: Android: Fix leaking of local reference table in QBluetoothSocket In certain situations internal java objects of QBluetoothSocket cannot be deleted fast enough. This causes a crash when the local reference table exceeds its maximum size of entries. This patch converts the pure JNI code to a QAndroidJniObject based version. It ensures faster cleanup of local jobject references and improves readability too. [ChangeLog][Platform Specific Changes][Android] Fixed leaking of java objects when calling QBluetoothSocket::connectToService() on Android. Task-number: QTBUG-44164 Change-Id: Iaa696bfeee69c6a79f3aeddec262ae34d8891743 Reviewed-by: Christian Stromme --- src/bluetooth/qbluetoothsocket_android.cpp | 65 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index e8d7d028..c8216ea2 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -37,6 +37,7 @@ #include "qbluetoothaddress.h" #include #include +#include #include #include @@ -91,32 +92,37 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe qCWarning(QT_BT_ANDROID) << "Falling back to workaround."; QAndroidJniEnvironment env; - jclass remoteDeviceClazz = env->GetObjectClass(remoteDevice.object()); - jmethodID getClassMethod = env->GetMethodID(remoteDeviceClazz, "getClass", "()Ljava/lang/Class;"); - if (!getClassMethod) { - qCWarning(QT_BT_ANDROID) << "BluetoothDevice.getClass method could not be found."; - return false; - } - - QAndroidJniObject remoteDeviceClass = QAndroidJniObject(env->CallObjectMethod(remoteDevice.object(), getClassMethod)); + QAndroidJniObject remoteDeviceClass = remoteDevice.callObjectMethod("getClass", "()Ljava/lang/Class;"); if (!remoteDeviceClass.isValid()) { qCWarning(QT_BT_ANDROID) << "Could not invoke BluetoothDevice.getClass."; return false; } - jclass classClass = env->FindClass("java/lang/Class"); - jclass integerClass = env->FindClass("java/lang/Integer"); - jfieldID integerType = env->GetStaticFieldID(integerClass, "TYPE", "Ljava/lang/Class;"); - jobject integerObject = env->GetStaticObjectField(integerClass, integerType); - if (!integerObject) { + QAndroidJniObject integerObject = QAndroidJniObject::getStaticObjectField( + "java/lang/Integer", "TYPE", "Ljava/lang/Class;"); + if (!integerObject.isValid()) { qCWarning(QT_BT_ANDROID) << "Could not get Integer.TYPE"; + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } + return false; } - jobjectArray paramTypes = env->NewObjectArray(1, classClass, integerObject); - if (!paramTypes) { + jclass classClass = QJNIEnvironmentPrivate::findClass("java/lang/Class"); + jobjectArray rawArray = env->NewObjectArray(1, classClass, + integerObject.object()); + QAndroidJniObject paramTypes(rawArray); + env->DeleteLocalRef(rawArray); + if (!paramTypes.isValid()) { qCWarning(QT_BT_ANDROID) << "Could not create new Class[]{Integer.TYPE}"; + + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } return false; } @@ -144,7 +150,7 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", QAndroidJniObject::fromString(QLatin1String("createRfcommSocket")).object(), - paramTypes); + paramTypes.object()); if (!method.isValid() || env->ExceptionCheck()) { qCWarning(QT_BT_ANDROID) << "Could not invoke getMethod"; if (env->ExceptionCheck()) { @@ -154,29 +160,23 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe return false; } - jclass methodClass = env->GetObjectClass(method.object()); - jmethodID invokeMethodId = env->GetMethodID( - methodClass, "invoke", - "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"); - if (!invokeMethodId) { - qCWarning(QT_BT_ANDROID) << "Could not invoke method."; - return false; - } + jclass objectClass = QJNIEnvironmentPrivate::findClass("java/lang/Object"); + QAndroidJniObject channelObject = QAndroidJniObject::callStaticObjectMethod( + "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", channel); + rawArray = env->NewObjectArray(1, objectClass, channelObject.object()); - jmethodID valueOfMethodId = env->GetStaticMethodID(integerClass, "valueOf", "(I)Ljava/lang/Integer;"); - jclass objectClass = env->FindClass("java/lang/Object"); - jobjectArray invokeParams = env->NewObjectArray(1, objectClass, env->CallStaticObjectMethod(integerClass, valueOfMethodId, channel)); - - - jobject invokeResult = env->CallObjectMethod(method.object(), invokeMethodId, - remoteDevice.object(), invokeParams); - if (!invokeResult) + QAndroidJniObject invokeResult = method.callObjectMethod("invoke", + "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", + remoteDevice.object(), rawArray); + env->DeleteLocalRef(rawArray); + if (!invokeResult.isValid()) { qCWarning(QT_BT_ANDROID) << "Invoke Resulted with error."; if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } + return false; } @@ -187,7 +187,6 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe env->ExceptionClear(); qCWarning(QT_BT_ANDROID) << "Socket connect via workaround failed."; - return false; } -- cgit v1.2.3 From 87d2660b0878ad08521ad10f364fbe9c3c59f7af Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 11:00:20 +0100 Subject: Qt Bluetooth - update documentation Add notes about handles on OS X and iOS and their meaning(less). Change-Id: I61fda1de27d194bd904b88536c180a2acf376690 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycharacteristic.cpp | 6 ++++++ src/bluetooth/qlowenergydescriptor.cpp | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp index 91e9d94d..f764eace 100644 --- a/src/bluetooth/qlowenergycharacteristic.cpp +++ b/src/bluetooth/qlowenergycharacteristic.cpp @@ -214,6 +214,9 @@ QByteArray QLowEnergyCharacteristic::value() const Returns the handle of the characteristic's value attribute; or \c 0 if the handle cannot be accessed on the platform or if the characteristic is invalid. + + \note On OS X and iOS handles can differ from 0, but these + values have no special meaning outside of internal/private API. */ QLowEnergyHandle QLowEnergyCharacteristic::handle() const { @@ -314,6 +317,9 @@ bool QLowEnergyCharacteristic::isValid() const \c 0 if the handle cannot be accessed on the platform or if the characteristic is invalid. + \note On OS X and iOS handles can differ from 0, but these + values have no special meaning outside of internal/private API. + \sa isValid() */ QLowEnergyHandle QLowEnergyCharacteristic::attributeHandle() const diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp index 9c25baa4..e18a4f6b 100644 --- a/src/bluetooth/qlowenergydescriptor.cpp +++ b/src/bluetooth/qlowenergydescriptor.cpp @@ -222,6 +222,9 @@ QBluetoothUuid QLowEnergyDescriptor::uuid() const /*! Returns the handle of the descriptor or \c 0 if the handle cannot be accessed on the platform or the descriptor is invalid. + + \note On OS X and iOS handles can differ from 0, but these + values have no special meaning outside of internal/private API. */ QLowEnergyHandle QLowEnergyDescriptor::handle() const { -- cgit v1.2.3 From 35be7aecc06f6e2bfe9b6a5a267d77c94dbe3a4a Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 09:29:48 +0100 Subject: Qt Bluetooth - add runtime OS version check (OS X, iOS) Compile time check of SDK version is not sufficient if Qt is build for older device. Change-Id: I0e4d0baf903c6291e67462890107b0e5cc30e7c4 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 54 +++++++++++++++++--------------- src/bluetooth/osx/osxbtutility_p.h | 12 +++++++ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 2fc74e36..6e927590 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -45,6 +45,7 @@ #include +#include #include #include @@ -206,31 +207,33 @@ using namespace QT_NAMESPACE; } #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) - const quint128 qtUuidData(deviceUuid.toUInt128()); - // STATIC_ASSERT on sizes would be handy! - uuid_t uuidData = {}; - std::copy(qtUuidData.data, qtUuidData.data + 16, uuidData); - const ObjCScopedPointer nsUuid([[NSUUID alloc] initWithUUIDBytes:uuidData]); - if (!nsUuid) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate NSUUID identifier"; - return QLowEnergyController::ConnectionError; - } + if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_9, QSysInfo::MV_IOS_6_0)) { + const quint128 qtUuidData(deviceUuid.toUInt128()); + // STATIC_ASSERT on sizes would be handy! + uuid_t uuidData = {}; + std::copy(qtUuidData.data, qtUuidData.data + 16, uuidData); + const ObjCScopedPointer nsUuid([[NSUUID alloc] initWithUUIDBytes:uuidData]); + if (!nsUuid) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate NSUUID identifier"; + return QLowEnergyController::ConnectionError; + } - [uuids addObject:nsUuid]; + [uuids addObject:nsUuid]; - // With the latest CoreBluetooth, we can synchronously retrive peripherals: - QT_BT_MAC_AUTORELEASEPOOL; - NSArray *const peripherals = [manager retrievePeripheralsWithIdentifiers:uuids]; - if (!peripherals || peripherals.count != 1) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to retrive a peripheral"; - return QLowEnergyController::UnknownRemoteDeviceError; - } + // With the latest CoreBluetooth, we can synchronously retrive peripherals: + QT_BT_MAC_AUTORELEASEPOOL; + NSArray *const peripherals = [manager retrievePeripheralsWithIdentifiers:uuids]; + if (!peripherals || peripherals.count != 1) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to retrive a peripheral"; + return QLowEnergyController::UnknownRemoteDeviceError; + } - peripheral = [static_cast([peripherals objectAtIndex:0]) retain]; - [self connectToPeripheral]; + peripheral = [static_cast([peripherals objectAtIndex:0]) retain]; + [self connectToPeripheral]; - return QLowEnergyController::NoError; -#else + return QLowEnergyController::NoError; + } +#endif OSXBluetooth::CFStrongReference cfUuid(OSXBluetooth::cf_uuid(deviceUuid)); if (!cfUuid) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to create CFUUID object"; @@ -243,7 +246,6 @@ using namespace QT_NAMESPACE; [manager retrievePeripherals:uuids]; return QLowEnergyController::NoError; -#endif } - (void)connectToPeripheral @@ -270,10 +272,12 @@ using namespace QT_NAMESPACE; return false; #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_7_0) - return peripheral.state == CBPeripheralStateConnected; -#else - return peripheral.isConnected; + using OSXBluetooth::qt_OS_limit; + + if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_9, QSysInfo::MV_IOS_7_0)) + return peripheral.state == CBPeripheralStateConnected; #endif + return peripheral.isConnected; } - (void)disconnectFromDevice diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index cc80d25a..6d5fbce7 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -291,6 +292,17 @@ QByteArray qt_bytearray(NSData *data); QByteArray qt_bytearray(NSObject *data); ObjCStrongReference data_from_bytearray(const QByteArray & qtData); +inline QSysInfo::MacVersion qt_OS_limit(QSysInfo::MacVersion osxVersion, QSysInfo::MacVersion iosVersion) +{ +#ifdef Q_OS_OSX + Q_UNUSED(iosVersion) + return osxVersion; +#else + Q_UNUSED(osxVersion) + return iosVersion; +#endif +} + } // namespace OSXBluetooth // Logging category for both OS X and iOS. -- cgit v1.2.3 From f3934083d37149acaa5065dce33fa55bd3dd7c71 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 09:49:40 +0100 Subject: Bluetooth - runtime OS X/iOS version check Add runtime checks, compile time is not enough. Change-Id: I1821c9718d4e4af1e2d7989bd1ee7a1f11d5c051 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtledeviceinquiry.mm | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index dd5a5c73..6bbddcf9 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -45,6 +45,7 @@ #include "osxbtutility_p.h" #include +#include #include #include "corebluetoothwrapper_p.h" @@ -57,7 +58,6 @@ LEDeviceInquiryDelegate::~LEDeviceInquiryDelegate() { } -// TODO: check versions! #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) QBluetoothUuid qt_uuid(NSUUID *nsUuid) @@ -72,7 +72,7 @@ QBluetoothUuid qt_uuid(NSUUID *nsUuid) return QBluetoothUuid(qtUuidData); } -#else +#endif QBluetoothUuid qt_uuid(CFUUIDRef uuid) { @@ -104,8 +104,6 @@ StringStrongReference uuid_as_nsstring(CFUUIDRef uuid) return StringStrongReference((NSString *)cfStr, false); } -#endif - } @@ -301,17 +299,20 @@ using namespace QT_NAMESPACE; #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) - if (!peripheral.identifier) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "peripheral without NSUUID"; - return; - } + if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_9, QSysInfo::MV_IOS_6_0)) { + if (!peripheral.identifier) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "peripheral without NSUUID"; + return; + } - if (![peripherals objectForKey:peripheral.identifier]) { - [peripherals setObject:peripheral forKey:peripheral.identifier]; - const QBluetoothUuid deviceUuid(OSXBluetooth::qt_uuid(peripheral.identifier)); - delegate->LEdeviceFound(peripheral, deviceUuid, advertisementData, RSSI); + if (![peripherals objectForKey:peripheral.identifier]) { + [peripherals setObject:peripheral forKey:peripheral.identifier]; + const QBluetoothUuid deviceUuid(OSXBluetooth::qt_uuid(peripheral.identifier)); + delegate->LEdeviceFound(peripheral, deviceUuid, advertisementData, RSSI); + } + return; } -#else +#endif if (!peripheral.UUID) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "peripheral without UUID"; return; @@ -323,8 +324,6 @@ using namespace QT_NAMESPACE; const QBluetoothUuid deviceUuid(OSXBluetooth::qt_uuid(peripheral.UUID)); delegate->LEdeviceFound(peripheral, deviceUuid, advertisementData, RSSI); } -#endif - } - (bool)isActive -- cgit v1.2.3 From a59972b02fd2c67c41245e76769489bfa887b3e7 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 09:39:17 +0100 Subject: Bluetooth - check OS X version in runtime Add OS X version check, compile time check is not enough if Qt is built for older versions. Change-Id: Ieebd3f05f0fd9942516ea1d9b40ee929905cb799 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtdevicepair.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/osx/osxbtdevicepair.mm b/src/bluetooth/osx/osxbtdevicepair.mm index fdb95522..3dfc4d33 100644 --- a/src/bluetooth/osx/osxbtdevicepair.mm +++ b/src/bluetooth/osx/osxbtdevicepair.mm @@ -43,6 +43,7 @@ #include "osxbtutility_p.h" #include +#include #include QT_BEGIN_NAMESPACE @@ -92,10 +93,13 @@ using namespace QT_NAMESPACE; - (void)dealloc { -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) +#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9) // Stop also sets a delegate to nil (Apple's docs). // 10.9 only. - [m_pairing stop]; + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_9) + [m_pairing stop]; + else + [m_pairing setDelegate:nil]; #else [m_pairing setDelegate:nil]; #endif -- cgit v1.2.3 From 3a443d269bdb0b5becfe36069bdff40bdff42277 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 09:57:35 +0100 Subject: Bluetooth - check OS X/iOS version in runtime Add runtime version checks, compile time can be not enough. Change-Id: If59131b3a9039a7fe15ccba0346fa71d58f36736 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_osx.mm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index a0ad49de..5b4b24aa 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -95,10 +96,13 @@ ServicePrivate qt_createLEService(QLowEnergyControllerPrivateOSX *controller, CB // TODO: isPrimary is ... always 'NO' - to be investigated. /* #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) - if (!cbService.isPrimary) { - // Our guess included/not was probably wrong. - newService->type &= ~QLowEnergyService::PrimaryService; - newService->type |= QLowEnergyService::IncludedService; + using OSXBluetooth::qt_OS_limit; + if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_9, QSysInfo::MV_IOS_6_0)) { + if (!cbService.isPrimary) { + // Our guess included/not was probably wrong. + newService->type &= ~QLowEnergyService::PrimaryService; + newService->type |= QLowEnergyService::IncludedService; + } } #endif */ -- cgit v1.2.3 From 515ccffb8d56b42c89e9c2c04abe0ef2619ece4e Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 6 Feb 2015 10:17:51 +0100 Subject: Bluetooth - add runtime OS version check (OS X) Compile time checks (SDK version) are not sufficient, add runtime checks also. Change-Id: I4214d0a32544883d07da06a2ce2db24ea42678cf Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothserviceinfo_osx.mm | 76 ++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/src/bluetooth/qbluetoothserviceinfo_osx.mm b/src/bluetooth/qbluetoothserviceinfo_osx.mm index 1240df18..abe3fc75 100644 --- a/src/bluetooth/qbluetoothserviceinfo_osx.mm +++ b/src/bluetooth/qbluetoothserviceinfo_osx.mm @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -66,7 +67,11 @@ namespace { class ServiceRecordRefGuard { public: - ServiceRecordRefGuard(IOBluetoothSDPServiceRecordRef r) + ServiceRecordRefGuard() + : recordRef(Q_NULLPTR) + { + } + explicit ServiceRecordRefGuard(IOBluetoothSDPServiceRecordRef r) : recordRef(r) { } @@ -76,6 +81,14 @@ public: CFRelease(recordRef); } + void reset(IOBluetoothSDPServiceRecordRef r) + { + if (recordRef) + CFRelease(recordRef); + // Take the ownership: + recordRef = r; + } + private: IOBluetoothSDPServiceRecordRef recordRef; @@ -138,23 +151,28 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca return false; } + ServiceRecordRefGuard refGuard; SDPRecord newRecord; -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) - newRecord.reset([[IOBluetoothSDPServiceRecord - publishedServiceRecordWithDictionary:serviceDict] retain]); +#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_9) { + newRecord.reset([[IOBluetoothSDPServiceRecord + publishedServiceRecordWithDictionary:serviceDict] retain]); + } else { #else - IOBluetoothSDPServiceRecordRef recordRef = Q_NULLPTR; - // With ARC this will require a different cast? - const IOReturn status = IOBluetoothAddServiceDict((CFDictionaryRef)serviceDict.data(), &recordRef); - if (status != kIOReturnSuccess) { - qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; - return false; - } - - const ServiceRecordRefGuard refGuard(recordRef); - newRecord.reset([[IOBluetoothSDPServiceRecord withSDPServiceRecordRef:recordRef] retain]); - // It's weird, but ... it's not possible to release a record ref yet. + { #endif + IOBluetoothSDPServiceRecordRef recordRef = Q_NULLPTR; + // With ARC this will require a different cast? + const IOReturn status = IOBluetoothAddServiceDict((CFDictionaryRef)serviceDict.data(), &recordRef); + if (status != kIOReturnSuccess) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; + return false; + } + + refGuard.reset(recordRef); + newRecord.reset([[IOBluetoothSDPServiceRecord withSDPServiceRecordRef:recordRef] retain]); + // It's weird, but ... it's not possible to release a record ref yet. + } if (!newRecord) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; @@ -166,8 +184,9 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca BluetoothSDPServiceRecordHandle newRecordHandle = 0; if ([newRecord getServiceRecordHandle:&newRecordHandle] != kIOReturnSuccess) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) - [newRecord removeServiceRecord]; +#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_9) + [newRecord removeServiceRecord]; #endif // With SDK < 10.9 there is no way to unregister at this point ... return false; @@ -195,11 +214,16 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca } if (!configured) { -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) - [newRecord removeServiceRecord]; +#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_9) { + [newRecord removeServiceRecord]; + } else { #else - IOBluetoothRemoveServiceWithRecordHandle(newRecordHandle); + {// Just to balance braces ... #endif + IOBluetoothRemoveServiceWithRecordHandle(newRecordHandle); + } + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to register a service record"; return false; } @@ -226,12 +250,16 @@ bool QBluetoothServiceInfoPrivate::unregisterService() Q_ASSERT_X(serviceRecord, Q_FUNC_INFO, "service registered, but serviceRecord is nil"); -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_NA) - [serviceRecord removeServiceRecord]; +#if QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_9) { + [serviceRecord removeServiceRecord]; + } else { #else - // Assert on newRecordHandle? Is 0 a valid/invalid handle? - IOBluetoothRemoveServiceWithRecordHandle(serviceRecordHandle); + { #endif + // Assert on newRecordHandle? Is 0 a valid/invalid handle? + IOBluetoothRemoveServiceWithRecordHandle(serviceRecordHandle); + } serviceRecord.reset(nil); -- cgit v1.2.3 From 76e0133d8cc627995d95847715527e79a33e5471 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Mon, 9 Feb 2015 12:15:23 +0100 Subject: Avoid potential memory leak on variable 'device' Change-Id: I4a3907dc1f8b8608b1c1b34e16d2e987cdc23be3 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice_bluez.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp index c7ee556d..0df7cc5d 100644 --- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp @@ -345,6 +345,7 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QBluetoothLocalDevice::Error, QBluetoothLocalDevice::PairingError)); + delete device; return; } delete device; @@ -368,6 +369,7 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QBluetoothLocalDevice::Error, QBluetoothLocalDevice::PairingError)); + delete device; return; } delete device; @@ -579,15 +581,21 @@ QBluetoothLocalDevice::Pairing QBluetoothLocalDevice::pairingStatus( QDBusPendingReply deviceReply = device->GetProperties(); deviceReply.waitForFinished(); - if (deviceReply.isError()) + if (deviceReply.isError()) { + delete device; return Unpaired; + } QVariantMap map = deviceReply.value(); - if (map.value(QStringLiteral("Trusted")).toBool() && map.value(QStringLiteral("Paired")).toBool()) + if (map.value(QStringLiteral("Trusted")).toBool() && map.value(QStringLiteral("Paired")).toBool()) { + delete device; return AuthorizedPaired; - else if (map.value(QStringLiteral("Paired")).toBool()) + } else if (map.value(QStringLiteral("Paired")).toBool()) { + delete device; return Paired; + } + delete device; } else if (d_ptr->adapterBluez5) { QDBusPendingReply reply = d_ptr->managerBluez5->GetManagedObjects(); -- cgit v1.2.3 From 0c1409fb517e98200cdc4d4790aa03119f14cb9f Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Mon, 9 Feb 2015 16:14:19 +0100 Subject: Use single-char QString operations for efficiency Change-Id: Ifdb98e21999ecdcf57c89a3664b8d0db796c73a1 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager_qnx.cpp | 4 ++-- src/tools/sdpscanner/main.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/nfc/qnearfieldmanager_qnx.cpp b/src/nfc/qnearfieldmanager_qnx.cpp index 6e3b0eb9..78b1231c 100644 --- a/src/nfc/qnearfieldmanager_qnx.cpp +++ b/src/nfc/qnearfieldmanager_qnx.cpp @@ -85,7 +85,7 @@ void QNearFieldManagerPrivateImpl::stopTargetDetection() int QNearFieldManagerPrivateImpl::registerNdefMessageHandler(QObject *object, const QMetaMethod &method) { QList filterList; - filterList += "*"; + filterList += '*'; QNXNFCManager::instance()->updateNdefFilters(filterList, this); ndefMessageHandlers.append(QPair, QMetaMethod>(QPair(m_handlerID, object), method)); @@ -180,7 +180,7 @@ void QNearFieldManagerPrivateImpl::updateNdefFilter() qQNXNFCDebug() << "Updating NDEF filter"; QList filterList; if (ndefMessageHandlers.size() > 0) { ///SUbscribe for all ndef messages - filterList += "*"; + filterList += '*'; QNXNFCManager::instance()->updateNdefFilters(filterList, this); } else if (ndefFilterHandlers.size() > 0){ for (int i = 0; i < ndefFilterHandlers.count(); i++) { diff --git a/src/tools/sdpscanner/main.cpp b/src/tools/sdpscanner/main.cpp index 5f2fd976..5cf4ceb0 100644 --- a/src/tools/sdpscanner/main.cpp +++ b/src/tools/sdpscanner/main.cpp @@ -152,10 +152,10 @@ static void parseAttributeValues(sdp_data_t *data, int indentation, QByteArray & xmlOutput.append("encoding=\"hex\" value=\""); xmlOutput.append(text.toHex()); } else { - text.replace("&", "&"); - text.replace("<", "<"); - text.replace(">", ">"); - text.replace("\"", """); + text.replace('&', "&"); + text.replace('<', "<"); + text.replace('>', ">"); + text.replace('"', """); xmlOutput.append("value=\""); xmlOutput.append(text); -- cgit v1.2.3 From 26d3681ed7bf2b6681a594511291e39a840dc8af Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 10 Feb 2015 10:59:15 +0100 Subject: Bluez5: Fix plain text handover of xml from sdpscanner The plain text option was never triggered as the raw data processing always considered \0 as part of the string. Subsequently the string was always evaluated to be non-printable and the hex based handover was triggered. Fortunately the hex based handover worked without trouble. In addition the plain value was not properly escaped to be valid XML. Change-Id: I537a94ef4705c7eeab143b3053affc6abbd548cc Reviewed-by: Kai Koehne --- src/tools/sdpscanner/main.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/tools/sdpscanner/main.cpp b/src/tools/sdpscanner/main.cpp index 5cf4ceb0..cb1bdd15 100644 --- a/src/tools/sdpscanner/main.cpp +++ b/src/tools/sdpscanner/main.cpp @@ -141,9 +141,13 @@ static void parseAttributeValues(sdp_data_t *data, int indentation, QByteArray & QByteArray text = QByteArray::fromRawData(data->val.str, data->unitSize); bool hasNonPrintableChar = false; - for (int i = 0; i < text.count() && !hasNonPrintableChar; i++) { - if (!isprint(text[i])) { + for (int i = 0; i < text.count(); i++) { + if (text[i] == '\0') { + text.resize(i); // cut trailing content + break; + } else if (!isprint(text[i])) { hasNonPrintableChar = true; + text.resize(text.indexOf('\0')); // cut trailing content break; } } @@ -152,10 +156,10 @@ static void parseAttributeValues(sdp_data_t *data, int indentation, QByteArray & xmlOutput.append("encoding=\"hex\" value=\""); xmlOutput.append(text.toHex()); } else { - text.replace('&', "&"); - text.replace('<', "<"); - text.replace('>', ">"); - text.replace('"', """); + text.replace('&', "&"); + text.replace('<', "<"); + text.replace('>', ">"); + text.replace('"', """); xmlOutput.append("value=\""); xmlOutput.append(text); -- cgit v1.2.3 From 90291d71308db90d763e5b42a8f096301ceb9666 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 11 Feb 2015 18:52:03 +0100 Subject: Add the QtCore/ library prefix in public headers Change-Id: I01f01575a03d95f558b1f1994e0c76b22b3c19e0 Reviewed-by: Oswald Buddenhagen --- src/bluetooth/qbluetoothdevicediscoveryagent.h | 2 +- src/bluetooth/qbluetoothdeviceinfo.h | 2 +- src/bluetooth/qbluetoothlocaldevice.h | 4 ++-- src/bluetooth/qbluetoothserver.h | 2 +- src/bluetooth/qbluetoothservicediscoveryagent.h | 2 +- src/bluetooth/qbluetoothsocket.h | 2 +- src/bluetooth/qlowenergycontroller.h | 2 +- src/nfc/qnearfieldsharetarget.h | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.h b/src/bluetooth/qbluetoothdevicediscoveryagent.h index 4638a4f2..7800f6f7 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent.h @@ -36,7 +36,7 @@ #include -#include +#include #include #include diff --git a/src/bluetooth/qbluetoothdeviceinfo.h b/src/bluetooth/qbluetoothdeviceinfo.h index ea8b7627..6e268dcf 100644 --- a/src/bluetooth/qbluetoothdeviceinfo.h +++ b/src/bluetooth/qbluetoothdeviceinfo.h @@ -36,7 +36,7 @@ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/qbluetoothlocaldevice.h b/src/bluetooth/qbluetoothlocaldevice.h index 4c1e9016..4a70757f 100644 --- a/src/bluetooth/qbluetoothlocaldevice.h +++ b/src/bluetooth/qbluetoothlocaldevice.h @@ -36,9 +36,9 @@ #include -#include +#include #include -#include +#include #include diff --git a/src/bluetooth/qbluetoothserver.h b/src/bluetooth/qbluetoothserver.h index 2eadd1d4..fde07784 100644 --- a/src/bluetooth/qbluetoothserver.h +++ b/src/bluetooth/qbluetoothserver.h @@ -37,7 +37,7 @@ #include -#include +#include #include #include diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h index b4f9d5f3..dddd67b2 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent.h @@ -36,7 +36,7 @@ #include -#include +#include #include #include diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 6540e0c9..8252fa99 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -40,7 +40,7 @@ #include #include -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h index bd8ef5f3..6c4be59e 100644 --- a/src/bluetooth/qlowenergycontroller.h +++ b/src/bluetooth/qlowenergycontroller.h @@ -34,7 +34,7 @@ #ifndef QLOWENERGYCONTROLLER_H #define QLOWENERGYCONTROLLER_H -#include +#include #include #include #include diff --git a/src/nfc/qnearfieldsharetarget.h b/src/nfc/qnearfieldsharetarget.h index 41d6880d..822a8ed5 100644 --- a/src/nfc/qnearfieldsharetarget.h +++ b/src/nfc/qnearfieldsharetarget.h @@ -36,7 +36,7 @@ #define QNEARFIELDSHARETARGET_H #include -#include +#include #include #include -- cgit v1.2.3 From 7354c6d3939440803d0d0d884baec48040c02bb3 Mon Sep 17 00:00:00 2001 From: Jani Heikkinen Date: Wed, 11 Feb 2015 15:06:23 +0200 Subject: Update copyright headers Qt copyrights are now in The Qt Company, so we could update the source code headers accordingly. In the same go we should also fix the links to point to qt.io. Change-Id: I3822a6484e8f7a420330de1cb1aeb0c3d1cf41b7 Reviewed-by: Sergio Ahumada --- LGPL_EXCEPTION.txt | 2 +- LICENSE.GPLv2 | 4 +-- LICENSE.LGPLv21 | 4 +-- LICENSE.LGPLv3 | 4 +-- config.tests/bluez/main.cpp | 14 ++++---- config.tests/bluez_le/main.cpp | 14 ++++---- config.tests/btapi10_2_1/main.cpp | 14 ++++---- config.tests/libbb2/main.cpp | 12 +++---- examples/bluetooth/btchat/chat.cpp | 8 ++--- examples/bluetooth/btchat/chat.h | 8 ++--- examples/bluetooth/btchat/chatclient.cpp | 8 ++--- examples/bluetooth/btchat/chatclient.h | 8 ++--- examples/bluetooth/btchat/chatserver.cpp | 8 ++--- examples/bluetooth/btchat/chatserver.h | 8 ++--- examples/bluetooth/btchat/doc/src/btchat.qdoc | 12 +++---- examples/bluetooth/btchat/main.cpp | 8 ++--- examples/bluetooth/btchat/remoteselector.cpp | 8 ++--- examples/bluetooth/btchat/remoteselector.h | 8 ++--- .../btfiletransfer/doc/src/btfiletransfer.qdoc | 12 +++---- examples/bluetooth/btfiletransfer/main.cpp | 8 ++--- examples/bluetooth/btfiletransfer/pindisplay.cpp | 8 ++--- examples/bluetooth/btfiletransfer/pindisplay.h | 8 ++--- examples/bluetooth/btfiletransfer/progress.cpp | 8 ++--- examples/bluetooth/btfiletransfer/progress.h | 8 ++--- .../bluetooth/btfiletransfer/remoteselector.cpp | 8 ++--- examples/bluetooth/btfiletransfer/remoteselector.h | 8 ++--- examples/bluetooth/btscanner/device.cpp | 8 ++--- examples/bluetooth/btscanner/device.h | 8 ++--- .../bluetooth/btscanner/doc/src/btscanner.qdoc | 12 +++---- examples/bluetooth/btscanner/main.cpp | 8 ++--- examples/bluetooth/btscanner/service.cpp | 8 ++--- examples/bluetooth/btscanner/service.h | 8 ++--- examples/bluetooth/chat/Button.qml | 8 ++--- examples/bluetooth/chat/InputBox.qml | 8 ++--- examples/bluetooth/chat/Search.qml | 8 ++--- examples/bluetooth/chat/chat.qml | 8 ++--- examples/bluetooth/chat/doc/src/chat.qdoc | 12 +++---- examples/bluetooth/chat/qmlchat.cpp | 8 ++--- examples/bluetooth/heartlistener/assets/Button.qml | 6 ++-- examples/bluetooth/heartlistener/assets/Point.qml | 6 ++-- examples/bluetooth/heartlistener/assets/dialog.qml | 6 ++-- examples/bluetooth/heartlistener/assets/draw.js | 6 ++-- examples/bluetooth/heartlistener/assets/home.qml | 6 ++-- examples/bluetooth/heartlistener/assets/main.qml | 6 ++-- .../bluetooth/heartlistener/assets/monitor.qml | 6 ++-- .../bluetooth/heartlistener/assets/results.qml | 8 ++--- examples/bluetooth/heartlistener/deviceinfo.cpp | 8 ++--- examples/bluetooth/heartlistener/deviceinfo.h | 8 ++--- .../heartlistener/doc/src/heartlistener.qdoc | 12 +++---- examples/bluetooth/heartlistener/heartrate.cpp | 8 ++--- examples/bluetooth/heartlistener/heartrate.h | 8 ++--- examples/bluetooth/heartlistener/main.cpp | 8 ++--- .../lowenergyscanner/assets/Characteristics.qml | 8 ++--- .../bluetooth/lowenergyscanner/assets/Dialog.qml | 6 ++-- .../bluetooth/lowenergyscanner/assets/Header.qml | 6 ++-- .../bluetooth/lowenergyscanner/assets/Label.qml | 6 ++-- .../bluetooth/lowenergyscanner/assets/Menu.qml | 8 ++--- .../bluetooth/lowenergyscanner/assets/Services.qml | 8 ++--- .../bluetooth/lowenergyscanner/assets/main.qml | 8 ++--- .../lowenergyscanner/characteristicinfo.cpp | 8 ++--- .../lowenergyscanner/characteristicinfo.h | 8 ++--- examples/bluetooth/lowenergyscanner/device.cpp | 8 ++--- examples/bluetooth/lowenergyscanner/device.h | 8 ++--- examples/bluetooth/lowenergyscanner/deviceinfo.cpp | 8 ++--- examples/bluetooth/lowenergyscanner/deviceinfo.h | 8 ++--- .../lowenergyscanner/doc/src/lowenergyscanner.qdoc | 12 +++---- examples/bluetooth/lowenergyscanner/main.cpp | 8 ++--- .../bluetooth/lowenergyscanner/serviceinfo.cpp | 8 ++--- examples/bluetooth/lowenergyscanner/serviceinfo.h | 8 ++--- examples/bluetooth/picturetransfer/Button.qml | 6 ++-- .../bluetooth/picturetransfer/DeviceDiscovery.qml | 8 ++--- examples/bluetooth/picturetransfer/FileSending.qml | 6 ++-- .../bluetooth/picturetransfer/PictureSelector.qml | 8 ++--- examples/bluetooth/picturetransfer/bttransfer.qml | 8 ++--- .../picturetransfer/doc/src/picturetransfer.qdoc | 12 +++---- .../bluetooth/picturetransfer/filetransfer.cpp | 6 ++-- examples/bluetooth/picturetransfer/filetransfer.h | 6 ++-- examples/bluetooth/picturetransfer/main.cpp | 6 ++-- examples/bluetooth/pingpong/assets/Board.qml | 6 ++-- examples/bluetooth/pingpong/assets/Dialog.qml | 6 ++-- examples/bluetooth/pingpong/assets/Menu.qml | 6 ++-- examples/bluetooth/pingpong/assets/main.qml | 6 ++-- examples/bluetooth/pingpong/doc/src/pingpong.qdoc | 12 +++---- examples/bluetooth/pingpong/main.cpp | 6 ++-- examples/bluetooth/pingpong/pingpong.cpp | 6 ++-- examples/bluetooth/pingpong/pingpong.h | 6 ++-- examples/bluetooth/scanner/Button.qml | 6 ++-- examples/bluetooth/scanner/doc/src/scanner.qdoc | 12 +++---- examples/bluetooth/scanner/qmlscanner.cpp | 8 ++--- examples/bluetooth/scanner/scanner.qml | 8 ++--- examples/nfc/annotatedurl/annotatedurl.cpp | 8 ++--- examples/nfc/annotatedurl/annotatedurl.h | 8 ++--- .../nfc/annotatedurl/doc/src/annotatedurl.qdoc | 12 +++---- examples/nfc/annotatedurl/main.cpp | 8 ++--- examples/nfc/annotatedurl/mainwindow.cpp | 8 ++--- examples/nfc/annotatedurl/mainwindow.h | 8 ++--- examples/nfc/corkboard/Mode.qml | 8 ++--- examples/nfc/corkboard/corkboards.qml | 8 ++--- examples/nfc/corkboard/doc/src/corkboard.qdoc | 12 +++---- examples/nfc/corkboard/main.cpp | 8 ++--- examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc | 12 +++---- examples/nfc/ndefeditor/main.cpp | 8 ++--- examples/nfc/ndefeditor/mainwindow.cpp | 8 ++--- examples/nfc/ndefeditor/mainwindow.h | 8 ++--- examples/nfc/ndefeditor/mimeimagerecordeditor.cpp | 8 ++--- examples/nfc/ndefeditor/mimeimagerecordeditor.h | 8 ++--- examples/nfc/ndefeditor/textrecordeditor.cpp | 8 ++--- examples/nfc/ndefeditor/textrecordeditor.h | 8 ++--- examples/nfc/ndefeditor/urirecordeditor.cpp | 8 ++--- examples/nfc/ndefeditor/urirecordeditor.h | 8 ++--- examples/nfc/poster/doc/src/poster.qdoc | 12 +++---- examples/nfc/poster/poster.qml | 8 ++--- examples/nfc/poster/qmlposter.cpp | 8 ++--- .../bluetooth/QtBluetoothBroadcastReceiver.java | 14 ++++---- .../bluetooth/QtBluetoothInputStreamThread.java | 14 ++++---- .../qt5/android/bluetooth/QtBluetoothLE.java | 14 ++++---- .../android/bluetooth/QtBluetoothSocketServer.java | 14 ++++---- src/bluetooth/android/androidbroadcastreceiver.cpp | 14 ++++---- src/bluetooth/android/androidbroadcastreceiver_p.h | 14 ++++---- .../android/devicediscoverybroadcastreceiver.cpp | 14 ++++---- .../android/devicediscoverybroadcastreceiver_p.h | 14 ++++---- src/bluetooth/android/inputstreamthread.cpp | 14 ++++---- src/bluetooth/android/inputstreamthread_p.h | 14 ++++---- src/bluetooth/android/jni_android.cpp | 14 ++++---- src/bluetooth/android/jni_android_p.h | 14 ++++---- .../android/localdevicebroadcastreceiver.cpp | 14 ++++---- .../android/localdevicebroadcastreceiver_p.h | 14 ++++---- src/bluetooth/android/lowenergynotificationhub.cpp | 14 ++++---- src/bluetooth/android/lowenergynotificationhub_p.h | 14 ++++---- src/bluetooth/android/serveracceptancethread.cpp | 14 ++++---- src/bluetooth/android/serveracceptancethread_p.h | 14 ++++---- .../android/servicediscoverybroadcastreceiver.cpp | 14 ++++---- .../android/servicediscoverybroadcastreceiver_p.h | 14 ++++---- src/bluetooth/bluez/adapter.cpp | 2 +- src/bluetooth/bluez/adapter1_bluez5.cpp | 2 +- src/bluetooth/bluez/adapter1_bluez5_p.h | 2 +- src/bluetooth/bluez/adapter_p.h | 2 +- src/bluetooth/bluez/agent.cpp | 2 +- src/bluetooth/bluez/agent_p.h | 2 +- src/bluetooth/bluez/bluez5_helper.cpp | 14 ++++---- src/bluetooth/bluez/bluez5_helper_p.h | 14 ++++---- src/bluetooth/bluez/bluez_data_p.h | 14 ++++---- src/bluetooth/bluez/device.cpp | 2 +- src/bluetooth/bluez/device1_bluez5.cpp | 2 +- src/bluetooth/bluez/device1_bluez5_p.h | 2 +- src/bluetooth/bluez/device_p.h | 2 +- src/bluetooth/bluez/hcimanager.cpp | 14 ++++---- src/bluetooth/bluez/hcimanager_p.h | 14 ++++---- src/bluetooth/bluez/manager.cpp | 2 +- src/bluetooth/bluez/manager_p.h | 2 +- src/bluetooth/bluez/obex_agent.cpp | 2 +- src/bluetooth/bluez/obex_agent_p.h | 2 +- src/bluetooth/bluez/obex_client.cpp | 2 +- src/bluetooth/bluez/obex_client1_bluez5.cpp | 2 +- src/bluetooth/bluez/obex_client1_bluez5_p.h | 2 +- src/bluetooth/bluez/obex_client_p.h | 2 +- src/bluetooth/bluez/obex_manager.cpp | 2 +- src/bluetooth/bluez/obex_manager_p.h | 2 +- src/bluetooth/bluez/obex_objectpush1_bluez5.cpp | 2 +- src/bluetooth/bluez/obex_objectpush1_bluez5_p.h | 2 +- src/bluetooth/bluez/obex_transfer.cpp | 2 +- src/bluetooth/bluez/obex_transfer1_bluez5.cpp | 2 +- src/bluetooth/bluez/obex_transfer1_bluez5_p.h | 2 +- src/bluetooth/bluez/obex_transfer_p.h | 2 +- src/bluetooth/bluez/objectmanager.cpp | 2 +- src/bluetooth/bluez/objectmanager_p.h | 2 +- src/bluetooth/bluez/profile1.cpp | 2 +- src/bluetooth/bluez/profile1_p.h | 2 +- src/bluetooth/bluez/properties.cpp | 2 +- src/bluetooth/bluez/properties_p.h | 2 +- src/bluetooth/bluez/service.cpp | 2 +- src/bluetooth/bluez/service_p.h | 2 +- src/bluetooth/bluez/servicemap.cpp | 14 ++++---- src/bluetooth/bluez/servicemap_p.h | 14 ++++---- src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp | 8 ++--- src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml | 8 ++--- src/bluetooth/doc/src/bluetooth-cpp.qdoc | 12 +++---- src/bluetooth/doc/src/bluetooth-index.qdoc | 12 +++---- src/bluetooth/doc/src/bluetooth-le-overview.qdoc | 12 +++---- src/bluetooth/doc/src/bluetooth-overview.qdoc | 12 +++---- src/bluetooth/doc/src/bluetooth-qml.qdoc | 12 +++---- src/bluetooth/doc/src/examples.qdoc | 12 +++---- src/bluetooth/osx/corebluetoothwrapper_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtcentralmanager.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtcentralmanager_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtchanneldelegate.mm | 38 +++++++++------------- src/bluetooth/osx/osxbtchanneldelegate_p.h | 38 +++++++++------------- src/bluetooth/osx/osxbtconnectionmonitor.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtconnectionmonitor_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtdeviceinquiry.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtdeviceinquiry_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtdevicepair.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtdevicepair_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtl2capchannel.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtl2capchannel_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtledeviceinquiry.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtledeviceinquiry_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtobexsession.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtobexsession_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtrfcommchannel.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtrfcommchannel_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtsdpinquiry.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtsdpinquiry_p.h | 36 ++++++++------------ src/bluetooth/osx/osxbtservicerecord.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtservicerecord_p.h | 38 +++++++++------------- src/bluetooth/osx/osxbtsocketlistener.mm | 14 ++++---- src/bluetooth/osx/osxbtsocketlistener_p.h | 14 ++++---- src/bluetooth/osx/osxbtutility.mm | 36 ++++++++------------ src/bluetooth/osx/osxbtutility_p.h | 36 ++++++++------------ src/bluetooth/qbluetooth.cpp | 14 ++++---- src/bluetooth/qbluetooth.h | 14 ++++---- src/bluetooth/qbluetoothaddress.cpp | 14 ++++---- src/bluetooth/qbluetoothaddress.h | 14 ++++---- src/bluetooth/qbluetoothaddress_p.h | 14 ++++---- src/bluetooth/qbluetoothdevicediscoveryagent.cpp | 14 ++++---- src/bluetooth/qbluetoothdevicediscoveryagent.h | 14 ++++---- .../qbluetoothdevicediscoveryagent_android.cpp | 14 ++++---- .../qbluetoothdevicediscoveryagent_bluez.cpp | 14 ++++---- .../qbluetoothdevicediscoveryagent_ios.mm | 36 ++++++++------------ .../qbluetoothdevicediscoveryagent_osx.mm | 36 ++++++++------------ src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp | 14 ++++---- src/bluetooth/qbluetoothdevicediscoveryagent_p.h | 14 ++++---- .../qbluetoothdevicediscoveryagent_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothdeviceinfo.cpp | 14 ++++---- src/bluetooth/qbluetoothdeviceinfo.h | 14 ++++---- src/bluetooth/qbluetoothdeviceinfo_p.h | 14 ++++---- src/bluetooth/qbluetoothglobal.h | 14 ++++---- src/bluetooth/qbluetoothhostinfo.cpp | 14 ++++---- src/bluetooth/qbluetoothhostinfo.h | 14 ++++---- src/bluetooth/qbluetoothhostinfo_p.h | 14 ++++---- src/bluetooth/qbluetoothlocaldevice.cpp | 14 ++++---- src/bluetooth/qbluetoothlocaldevice.h | 14 ++++---- src/bluetooth/qbluetoothlocaldevice_android.cpp | 14 ++++---- src/bluetooth/qbluetoothlocaldevice_bluez.cpp | 14 ++++---- src/bluetooth/qbluetoothlocaldevice_osx.mm | 36 ++++++++------------ src/bluetooth/qbluetoothlocaldevice_p.cpp | 14 ++++---- src/bluetooth/qbluetoothlocaldevice_p.h | 14 ++++---- src/bluetooth/qbluetoothlocaldevice_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothserver.cpp | 14 ++++---- src/bluetooth/qbluetoothserver.h | 14 ++++---- src/bluetooth/qbluetoothserver_android.cpp | 14 ++++---- src/bluetooth/qbluetoothserver_bluez.cpp | 14 ++++---- src/bluetooth/qbluetoothserver_osx.mm | 36 ++++++++------------ src/bluetooth/qbluetoothserver_osx_p.h | 14 ++++---- src/bluetooth/qbluetoothserver_p.cpp | 14 ++++---- src/bluetooth/qbluetoothserver_p.h | 14 ++++---- src/bluetooth/qbluetoothserver_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothservicediscoveryagent.cpp | 14 ++++---- src/bluetooth/qbluetoothservicediscoveryagent.h | 14 ++++---- .../qbluetoothservicediscoveryagent_android.cpp | 14 ++++---- .../qbluetoothservicediscoveryagent_bluez.cpp | 14 ++++---- .../qbluetoothservicediscoveryagent_osx.mm | 36 ++++++++------------ .../qbluetoothservicediscoveryagent_p.cpp | 14 ++++---- src/bluetooth/qbluetoothservicediscoveryagent_p.h | 14 ++++---- .../qbluetoothservicediscoveryagent_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothserviceinfo.cpp | 14 ++++---- src/bluetooth/qbluetoothserviceinfo.h | 14 ++++---- src/bluetooth/qbluetoothserviceinfo_android.cpp | 14 ++++---- src/bluetooth/qbluetoothserviceinfo_bluez.cpp | 14 ++++---- src/bluetooth/qbluetoothserviceinfo_osx.mm | 36 ++++++++------------ src/bluetooth/qbluetoothserviceinfo_p.cpp | 14 ++++---- src/bluetooth/qbluetoothserviceinfo_p.h | 14 ++++---- src/bluetooth/qbluetoothserviceinfo_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothsocket.cpp | 14 ++++---- src/bluetooth/qbluetoothsocket.h | 14 ++++---- src/bluetooth/qbluetoothsocket_android.cpp | 14 ++++---- src/bluetooth/qbluetoothsocket_bluez.cpp | 14 ++++---- src/bluetooth/qbluetoothsocket_osx.mm | 36 ++++++++------------ src/bluetooth/qbluetoothsocket_osx_p.h | 36 ++++++++------------ src/bluetooth/qbluetoothsocket_p.cpp | 14 ++++---- src/bluetooth/qbluetoothsocket_p.h | 14 ++++---- src/bluetooth/qbluetoothsocket_qnx.cpp | 12 +++---- src/bluetooth/qbluetoothtransfermanager.cpp | 14 ++++---- src/bluetooth/qbluetoothtransfermanager.h | 14 ++++---- src/bluetooth/qbluetoothtransferreply.cpp | 14 ++++---- src/bluetooth/qbluetoothtransferreply.h | 14 ++++---- src/bluetooth/qbluetoothtransferreply_bluez.cpp | 14 ++++---- src/bluetooth/qbluetoothtransferreply_bluez_p.h | 14 ++++---- src/bluetooth/qbluetoothtransferreply_osx.mm | 14 ++++---- src/bluetooth/qbluetoothtransferreply_osx_p.h | 14 ++++---- src/bluetooth/qbluetoothtransferreply_p.h | 14 ++++---- src/bluetooth/qbluetoothtransferreply_qnx.cpp | 14 ++++---- src/bluetooth/qbluetoothtransferreply_qnx_p.h | 12 +++---- src/bluetooth/qbluetoothtransferrequest.cpp | 14 ++++---- src/bluetooth/qbluetoothtransferrequest.h | 14 ++++---- src/bluetooth/qbluetoothtransferrequest_p.h | 14 ++++---- src/bluetooth/qbluetoothuuid.cpp | 14 ++++---- src/bluetooth/qbluetoothuuid.h | 14 ++++---- src/bluetooth/qlowenergycharacteristic.cpp | 12 +++---- src/bluetooth/qlowenergycharacteristic.h | 14 ++++---- src/bluetooth/qlowenergycontroller.cpp | 14 ++++---- src/bluetooth/qlowenergycontroller.h | 14 ++++---- src/bluetooth/qlowenergycontroller_android.cpp | 14 ++++---- src/bluetooth/qlowenergycontroller_bluez.cpp | 14 ++++---- src/bluetooth/qlowenergycontroller_osx.mm | 14 ++++---- src/bluetooth/qlowenergycontroller_osx_p.h | 14 ++++---- src/bluetooth/qlowenergycontroller_p.cpp | 14 ++++---- src/bluetooth/qlowenergycontroller_p.h | 14 ++++---- src/bluetooth/qlowenergydescriptor.cpp | 14 ++++---- src/bluetooth/qlowenergydescriptor.h | 14 ++++---- src/bluetooth/qlowenergyservice.cpp | 14 ++++---- src/bluetooth/qlowenergyservice.h | 14 ++++---- src/bluetooth/qlowenergyservice_osx.mm | 14 ++++---- src/bluetooth/qlowenergyserviceprivate.cpp | 14 ++++---- src/bluetooth/qlowenergyserviceprivate_p.h | 14 ++++---- src/bluetooth/qnx/ppshelpers.cpp | 12 +++---- src/bluetooth/qnx/ppshelpers_p.h | 12 +++---- src/bluetooth/qprivatelinearbuffer_p.h | 14 ++++---- src/imports/bluetooth/plugin.cpp | 14 ++++---- .../qdeclarativebluetoothdiscoverymodel.cpp | 14 ++++---- .../qdeclarativebluetoothdiscoverymodel_p.h | 14 ++++---- .../bluetooth/qdeclarativebluetoothservice.cpp | 14 ++++---- .../bluetooth/qdeclarativebluetoothservice_p.h | 14 ++++---- .../bluetooth/qdeclarativebluetoothsocket.cpp | 14 ++++---- .../bluetooth/qdeclarativebluetoothsocket_p.h | 14 ++++---- src/imports/nfc/plugin.cpp | 14 ++++---- src/imports/nfc/qdeclarativendeffilter.cpp | 14 ++++---- src/imports/nfc/qdeclarativendeffilter_p.h | 14 ++++---- src/imports/nfc/qdeclarativendefmimerecord.cpp | 14 ++++---- src/imports/nfc/qdeclarativendefmimerecord_p.h | 14 ++++---- src/imports/nfc/qdeclarativendeftextrecord.cpp | 14 ++++---- src/imports/nfc/qdeclarativendeftextrecord_p.h | 14 ++++---- src/imports/nfc/qdeclarativendefurirecord.cpp | 14 ++++---- src/imports/nfc/qdeclarativendefurirecord_p.h | 14 ++++---- src/imports/nfc/qdeclarativenearfield.cpp | 14 ++++---- src/imports/nfc/qdeclarativenearfield_p.h | 14 ++++---- src/imports/nfc/qdeclarativenearfieldsocket.cpp | 14 ++++---- src/imports/nfc/qdeclarativenearfieldsocket_p.h | 14 ++++---- src/nfc/doc/snippets/doc_src_qtnfc.cpp | 6 ++-- src/nfc/doc/snippets/doc_src_qtnfc.qml | 8 ++--- src/nfc/doc/snippets/foorecord.cpp | 8 ++--- src/nfc/doc/snippets/foorecord.h | 8 ++--- src/nfc/doc/snippets/main.cpp | 8 ++--- src/nfc/doc/snippets/nfc.cpp | 8 ++--- src/nfc/doc/src/examples.qdoc | 10 +++--- src/nfc/doc/src/nfc-cpp.qdoc | 10 +++--- src/nfc/doc/src/nfc-index.qdoc | 12 +++---- src/nfc/doc/src/nfc-overview.qdoc | 12 +++---- src/nfc/doc/src/nfc-qml.qdoc | 10 +++--- src/nfc/neard/adapter.cpp | 2 +- src/nfc/neard/adapter_p.h | 2 +- src/nfc/neard/agent.cpp | 2 +- src/nfc/neard/agent_p.h | 2 +- src/nfc/neard/dbusobjectmanager.cpp | 2 +- src/nfc/neard/dbusobjectmanager_p.h | 2 +- src/nfc/neard/dbusproperties.cpp | 2 +- src/nfc/neard/dbusproperties_p.h | 2 +- src/nfc/neard/manager.cpp | 2 +- src/nfc/neard/manager_p.h | 2 +- src/nfc/neard/neard_helper.cpp | 36 ++++++++------------ src/nfc/neard/neard_helper_p.h | 36 ++++++++------------ src/nfc/neard/tag.cpp | 2 +- src/nfc/neard/tag_p.h | 2 +- src/nfc/qllcpserver.cpp | 14 ++++---- src/nfc/qllcpserver_p.cpp | 14 ++++---- src/nfc/qllcpserver_p.h | 14 ++++---- src/nfc/qllcpserver_p_p.h | 14 ++++---- src/nfc/qllcpserver_qnx_p.cpp | 12 +++---- src/nfc/qllcpserver_qnx_p.h | 12 +++---- src/nfc/qllcpserver_simulator_p.cpp | 14 ++++---- src/nfc/qllcpserver_simulator_p.h | 14 ++++---- src/nfc/qllcpsocket.cpp | 14 ++++---- src/nfc/qllcpsocket_p.cpp | 14 ++++---- src/nfc/qllcpsocket_p.h | 14 ++++---- src/nfc/qllcpsocket_p_p.h | 14 ++++---- src/nfc/qllcpsocket_qnx_p.cpp | 12 +++---- src/nfc/qllcpsocket_qnx_p.h | 12 +++---- src/nfc/qllcpsocket_simulator_p.cpp | 14 ++++---- src/nfc/qllcpsocket_simulator_p.h | 14 ++++---- src/nfc/qndeffilter.cpp | 14 ++++---- src/nfc/qndeffilter.h | 14 ++++---- src/nfc/qndefmessage.cpp | 14 ++++---- src/nfc/qndefmessage.h | 14 ++++---- src/nfc/qndefnfcsmartposterrecord.cpp | 12 +++---- src/nfc/qndefnfcsmartposterrecord.h | 12 +++---- src/nfc/qndefnfcsmartposterrecord_p.h | 12 +++---- src/nfc/qndefnfctextrecord.cpp | 14 ++++---- src/nfc/qndefnfctextrecord.h | 14 ++++---- src/nfc/qndefnfcurirecord.cpp | 14 ++++---- src/nfc/qndefnfcurirecord.h | 14 ++++---- src/nfc/qndefrecord.cpp | 14 ++++---- src/nfc/qndefrecord.h | 14 ++++---- src/nfc/qndefrecord_p.h | 14 ++++---- src/nfc/qnearfieldmanager.cpp | 14 ++++---- src/nfc/qnearfieldmanager.h | 14 ++++---- src/nfc/qnearfieldmanager_emulator.cpp | 14 ++++---- src/nfc/qnearfieldmanager_emulator_p.h | 14 ++++---- src/nfc/qnearfieldmanager_neard.cpp | 34 ++++++++----------- src/nfc/qnearfieldmanager_neard_p.h | 34 ++++++++----------- src/nfc/qnearfieldmanager_p.h | 14 ++++---- src/nfc/qnearfieldmanager_qnx.cpp | 12 +++---- src/nfc/qnearfieldmanager_qnx_p.h | 12 +++---- src/nfc/qnearfieldmanager_simulator.cpp | 14 ++++---- src/nfc/qnearfieldmanager_simulator_p.h | 14 ++++---- src/nfc/qnearfieldmanagerimpl_p.cpp | 14 ++++---- src/nfc/qnearfieldmanagerimpl_p.h | 14 ++++---- src/nfc/qnearfieldmanagervirtualbase.cpp | 14 ++++---- src/nfc/qnearfieldmanagervirtualbase_p.h | 14 ++++---- src/nfc/qnearfieldsharemanager.cpp | 12 +++---- src/nfc/qnearfieldsharemanager.h | 12 +++---- src/nfc/qnearfieldsharemanager_p.h | 12 +++---- src/nfc/qnearfieldsharemanager_qnx_p.cpp | 12 +++---- src/nfc/qnearfieldsharemanager_qnx_p.h | 12 +++---- src/nfc/qnearfieldsharemanagerimpl_p.cpp | 12 +++---- src/nfc/qnearfieldsharemanagerimpl_p.h | 12 +++---- src/nfc/qnearfieldsharetarget.cpp | 12 +++---- src/nfc/qnearfieldsharetarget.h | 12 +++---- src/nfc/qnearfieldsharetarget_p.h | 12 +++---- src/nfc/qnearfieldsharetarget_qnx_p.cpp | 12 +++---- src/nfc/qnearfieldsharetarget_qnx_p.h | 12 +++---- src/nfc/qnearfieldsharetargetimpl_p.cpp | 12 +++---- src/nfc/qnearfieldsharetargetimpl_p.h | 12 +++---- src/nfc/qnearfieldtagtype1.cpp | 14 ++++---- src/nfc/qnearfieldtagtype1_p.h | 14 ++++---- src/nfc/qnearfieldtagtype2.cpp | 14 ++++---- src/nfc/qnearfieldtagtype2_p.h | 14 ++++---- src/nfc/qnearfieldtagtype3.cpp | 14 ++++---- src/nfc/qnearfieldtagtype3_p.h | 14 ++++---- src/nfc/qnearfieldtagtype4.cpp | 14 ++++---- src/nfc/qnearfieldtagtype4_p.h | 14 ++++---- src/nfc/qnearfieldtarget.cpp | 14 ++++---- src/nfc/qnearfieldtarget.h | 14 ++++---- src/nfc/qnearfieldtarget_emulator.cpp | 14 ++++---- src/nfc/qnearfieldtarget_emulator_p.h | 14 ++++---- src/nfc/qnearfieldtarget_neard_p.h | 34 ++++++++----------- src/nfc/qnearfieldtarget_p.h | 14 ++++---- src/nfc/qnearfieldtarget_qnx_p.h | 12 +++---- src/nfc/qnfc.cpp | 36 ++++++++------------ src/nfc/qnfcglobal.h | 14 ++++---- src/nfc/qnx/qnxnfceventfilter.cpp | 12 +++---- src/nfc/qnx/qnxnfceventfilter_p.h | 12 +++---- src/nfc/qnx/qnxnfcmanager.cpp | 12 +++---- src/nfc/qnx/qnxnfcmanager_p.h | 12 +++---- src/nfc/qnx/qnxnfcsharemanager_p.cpp | 12 +++---- src/nfc/qnx/qnxnfcsharemanager_p.h | 12 +++---- src/nfc/qqmlndefrecord.cpp | 14 ++++---- src/nfc/qqmlndefrecord.h | 14 ++++---- src/nfc/qtlv.cpp | 14 ++++---- src/nfc/qtlv_p.h | 14 ++++---- src/nfc/targetemulator.cpp | 14 ++++---- src/nfc/targetemulator_p.h | 14 ++++---- src/tools/sdpscanner/main.cpp | 14 ++++---- .../qbluetoothaddress/tst_qbluetoothaddress.cpp | 14 ++++---- .../tst_qbluetoothdevicediscoveryagent.cpp | 14 ++++---- .../tst_qbluetoothdeviceinfo.cpp | 14 ++++---- .../qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp | 14 ++++---- .../tst_qbluetoothlocaldevice.cpp | 14 ++++---- .../auto/qbluetoothserver/tst_qbluetoothserver.cpp | 14 ++++---- .../tst_qbluetoothservicediscoveryagent.cpp | 14 ++++---- .../tst_qbluetoothserviceinfo.cpp | 14 ++++---- .../auto/qbluetoothsocket/tst_qbluetoothsocket.cpp | 14 ++++---- .../tst_qbluetoothtransfermanager.cpp | 14 ++++---- .../tst_qbluetoothtransferrequest.cpp | 14 ++++---- tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp | 14 ++++---- .../tst_qlowenergycharacteristic.cpp | 14 ++++---- .../tst_qlowenergycontroller.cpp | 14 ++++---- .../tst_qlowenergydescriptor.cpp | 14 ++++---- tests/auto/qndefmessage/tst_qndefmessage.cpp | 14 ++++---- .../tst_qndefnfcsmartposterrecord.cpp | 12 +++---- tests/auto/qndefrecord/tst_qndefrecord.cpp | 14 ++++---- .../qnearfieldmanager/tst_qnearfieldmanager.cpp | 14 ++++---- .../qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp | 14 ++++---- .../qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp | 14 ++++---- tests/bttestui/Button.qml | 14 ++++---- tests/bttestui/btlocaldevice.cpp | 14 ++++---- tests/bttestui/btlocaldevice.h | 14 ++++---- tests/bttestui/main.cpp | 14 ++++---- tests/bttestui/main.qml | 14 ++++---- 468 files changed, 2859 insertions(+), 3171 deletions(-) diff --git a/LGPL_EXCEPTION.txt b/LGPL_EXCEPTION.txt index 7e2e30ff..5cdacb9a 100644 --- a/LGPL_EXCEPTION.txt +++ b/LGPL_EXCEPTION.txt @@ -1,4 +1,4 @@ -Digia Qt LGPL Exception version 1.1 +The Qt Company Qt LGPL Exception version 1.1 As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate diff --git a/LICENSE.GPLv2 b/LICENSE.GPLv2 index 194c39cb..6dbb032f 100644 --- a/LICENSE.GPLv2 +++ b/LICENSE.GPLv2 @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE - The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - Contact: http://www.qt-project.org/legal + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU General Public License version 2, which is displayed below. diff --git a/LICENSE.LGPLv21 b/LICENSE.LGPLv21 index 341aa9ee..6e184611 100644 --- a/LICENSE.LGPLv21 +++ b/LICENSE.LGPLv21 @@ -1,7 +1,7 @@ GNU LESSER GENERAL PUBLIC LICENSE - The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - Contact: http://www.qt-project.org/legal + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. diff --git a/LICENSE.LGPLv3 b/LICENSE.LGPLv3 index aed671a0..8fbb7439 100644 --- a/LICENSE.LGPLv3 +++ b/LICENSE.LGPLv3 @@ -1,7 +1,7 @@ GNU LESSER GENERAL PUBLIC LICENSE - The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - Contact: http://www.qt-project.org/legal + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 3, which is displayed below. diff --git a/config.tests/bluez/main.cpp b/config.tests/bluez/main.cpp index c7867cdc..f0be7d3e 100644 --- a/config.tests/bluez/main.cpp +++ b/config.tests/bluez/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtConnectivity module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/config.tests/bluez_le/main.cpp b/config.tests/bluez_le/main.cpp index 11218b8e..3a601748 100644 --- a/config.tests/bluez_le/main.cpp +++ b/config.tests/bluez_le/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtConnectivity module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/config.tests/btapi10_2_1/main.cpp b/config.tests/btapi10_2_1/main.cpp index e7d5812e..e34585d1 100644 --- a/config.tests/btapi10_2_1/main.cpp +++ b/config.tests/btapi10_2_1/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtConnectivity module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/config.tests/libbb2/main.cpp b/config.tests/libbb2/main.cpp index baa509b3..f606744b 100644 --- a/config.tests/libbb2/main.cpp +++ b/config.tests/libbb2/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtConnectivity module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/btchat/chat.cpp b/examples/bluetooth/btchat/chat.cpp index 61943ac0..51a2d4ed 100644 --- a/examples/bluetooth/btchat/chat.cpp +++ b/examples/bluetooth/btchat/chat.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/chat.h b/examples/bluetooth/btchat/chat.h index 75d7669f..564b7867 100644 --- a/examples/bluetooth/btchat/chat.h +++ b/examples/bluetooth/btchat/chat.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/chatclient.cpp b/examples/bluetooth/btchat/chatclient.cpp index 06930145..09a2f138 100644 --- a/examples/bluetooth/btchat/chatclient.cpp +++ b/examples/bluetooth/btchat/chatclient.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/chatclient.h b/examples/bluetooth/btchat/chatclient.h index 07f23164..73b1bc91 100644 --- a/examples/bluetooth/btchat/chatclient.h +++ b/examples/bluetooth/btchat/chatclient.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/chatserver.cpp b/examples/bluetooth/btchat/chatserver.cpp index 6848e2d7..6b21a507 100644 --- a/examples/bluetooth/btchat/chatserver.cpp +++ b/examples/bluetooth/btchat/chatserver.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/chatserver.h b/examples/bluetooth/btchat/chatserver.h index 8af21f55..c40daf52 100644 --- a/examples/bluetooth/btchat/chatserver.h +++ b/examples/bluetooth/btchat/chatserver.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/doc/src/btchat.qdoc b/examples/bluetooth/btchat/doc/src/btchat.qdoc index a78b9ede..213db715 100644 --- a/examples/bluetooth/btchat/doc/src/btchat.qdoc +++ b/examples/bluetooth/btchat/doc/src/btchat.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/btchat/main.cpp b/examples/bluetooth/btchat/main.cpp index ed362d23..bb862798 100644 --- a/examples/bluetooth/btchat/main.cpp +++ b/examples/bluetooth/btchat/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/remoteselector.cpp b/examples/bluetooth/btchat/remoteselector.cpp index 913988a2..5a417c5c 100644 --- a/examples/bluetooth/btchat/remoteselector.cpp +++ b/examples/bluetooth/btchat/remoteselector.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btchat/remoteselector.h b/examples/bluetooth/btchat/remoteselector.h index 5b123127..2165cdd9 100644 --- a/examples/bluetooth/btchat/remoteselector.h +++ b/examples/bluetooth/btchat/remoteselector.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/doc/src/btfiletransfer.qdoc b/examples/bluetooth/btfiletransfer/doc/src/btfiletransfer.qdoc index 53832725..5f07e088 100644 --- a/examples/bluetooth/btfiletransfer/doc/src/btfiletransfer.qdoc +++ b/examples/bluetooth/btfiletransfer/doc/src/btfiletransfer.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/btfiletransfer/main.cpp b/examples/bluetooth/btfiletransfer/main.cpp index 44288caa..2e96ce45 100644 --- a/examples/bluetooth/btfiletransfer/main.cpp +++ b/examples/bluetooth/btfiletransfer/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/pindisplay.cpp b/examples/bluetooth/btfiletransfer/pindisplay.cpp index 6577d54e..1aabb719 100644 --- a/examples/bluetooth/btfiletransfer/pindisplay.cpp +++ b/examples/bluetooth/btfiletransfer/pindisplay.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/pindisplay.h b/examples/bluetooth/btfiletransfer/pindisplay.h index 52d14f43..f8d89352 100644 --- a/examples/bluetooth/btfiletransfer/pindisplay.h +++ b/examples/bluetooth/btfiletransfer/pindisplay.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/progress.cpp b/examples/bluetooth/btfiletransfer/progress.cpp index c9913c44..7b7c6bac 100644 --- a/examples/bluetooth/btfiletransfer/progress.cpp +++ b/examples/bluetooth/btfiletransfer/progress.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/progress.h b/examples/bluetooth/btfiletransfer/progress.h index eab84746..b71009b7 100644 --- a/examples/bluetooth/btfiletransfer/progress.h +++ b/examples/bluetooth/btfiletransfer/progress.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/remoteselector.cpp b/examples/bluetooth/btfiletransfer/remoteselector.cpp index 08072d14..4a1f96c0 100644 --- a/examples/bluetooth/btfiletransfer/remoteselector.cpp +++ b/examples/bluetooth/btfiletransfer/remoteselector.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btfiletransfer/remoteselector.h b/examples/bluetooth/btfiletransfer/remoteselector.h index ec2e4fd5..1d2c3de2 100644 --- a/examples/bluetooth/btfiletransfer/remoteselector.h +++ b/examples/bluetooth/btfiletransfer/remoteselector.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btscanner/device.cpp b/examples/bluetooth/btscanner/device.cpp index 016d1107..910791fb 100644 --- a/examples/bluetooth/btscanner/device.cpp +++ b/examples/bluetooth/btscanner/device.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btscanner/device.h b/examples/bluetooth/btscanner/device.h index 6dbfb870..9e5c59f6 100644 --- a/examples/bluetooth/btscanner/device.h +++ b/examples/bluetooth/btscanner/device.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btscanner/doc/src/btscanner.qdoc b/examples/bluetooth/btscanner/doc/src/btscanner.qdoc index e4d28ee2..600cfe39 100644 --- a/examples/bluetooth/btscanner/doc/src/btscanner.qdoc +++ b/examples/bluetooth/btscanner/doc/src/btscanner.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/btscanner/main.cpp b/examples/bluetooth/btscanner/main.cpp index 74094e8d..8ec92769 100644 --- a/examples/bluetooth/btscanner/main.cpp +++ b/examples/bluetooth/btscanner/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btscanner/service.cpp b/examples/bluetooth/btscanner/service.cpp index c886c901..bd4b7207 100644 --- a/examples/bluetooth/btscanner/service.cpp +++ b/examples/bluetooth/btscanner/service.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/btscanner/service.h b/examples/bluetooth/btscanner/service.h index 293bc7a9..5b47d11a 100644 --- a/examples/bluetooth/btscanner/service.h +++ b/examples/bluetooth/btscanner/service.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/chat/Button.qml b/examples/bluetooth/chat/Button.qml index 6259c097..d1136730 100644 --- a/examples/bluetooth/chat/Button.qml +++ b/examples/bluetooth/chat/Button.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/chat/InputBox.qml b/examples/bluetooth/chat/InputBox.qml index 5cd5a768..8a10a5d1 100644 --- a/examples/bluetooth/chat/InputBox.qml +++ b/examples/bluetooth/chat/InputBox.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/chat/Search.qml b/examples/bluetooth/chat/Search.qml index 47fbb6ab..f1f8f6ac 100644 --- a/examples/bluetooth/chat/Search.qml +++ b/examples/bluetooth/chat/Search.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/chat/chat.qml b/examples/bluetooth/chat/chat.qml index 6a2830ad..ecac39fc 100644 --- a/examples/bluetooth/chat/chat.qml +++ b/examples/bluetooth/chat/chat.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/chat/doc/src/chat.qdoc b/examples/bluetooth/chat/doc/src/chat.qdoc index 5f61fd74..4b5e8778 100644 --- a/examples/bluetooth/chat/doc/src/chat.qdoc +++ b/examples/bluetooth/chat/doc/src/chat.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/chat/qmlchat.cpp b/examples/bluetooth/chat/qmlchat.cpp index 6e23fe13..8cd90bda 100644 --- a/examples/bluetooth/chat/qmlchat.cpp +++ b/examples/bluetooth/chat/qmlchat.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/Button.qml b/examples/bluetooth/heartlistener/assets/Button.qml index 40e98875..51c377b1 100644 --- a/examples/bluetooth/heartlistener/assets/Button.qml +++ b/examples/bluetooth/heartlistener/assets/Button.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/Point.qml b/examples/bluetooth/heartlistener/assets/Point.qml index 2ed94a4d..0341d11a 100644 --- a/examples/bluetooth/heartlistener/assets/Point.qml +++ b/examples/bluetooth/heartlistener/assets/Point.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/dialog.qml b/examples/bluetooth/heartlistener/assets/dialog.qml index 45b64cf3..bcaf299f 100644 --- a/examples/bluetooth/heartlistener/assets/dialog.qml +++ b/examples/bluetooth/heartlistener/assets/dialog.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/draw.js b/examples/bluetooth/heartlistener/assets/draw.js index a5de5474..f884d472 100644 --- a/examples/bluetooth/heartlistener/assets/draw.js +++ b/examples/bluetooth/heartlistener/assets/draw.js @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/home.qml b/examples/bluetooth/heartlistener/assets/home.qml index 2c5e9485..e77081ae 100644 --- a/examples/bluetooth/heartlistener/assets/home.qml +++ b/examples/bluetooth/heartlistener/assets/home.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/main.qml b/examples/bluetooth/heartlistener/assets/main.qml index e892eb47..89d9f600 100644 --- a/examples/bluetooth/heartlistener/assets/main.qml +++ b/examples/bluetooth/heartlistener/assets/main.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/monitor.qml b/examples/bluetooth/heartlistener/assets/monitor.qml index 2fcbef3d..1d74ad84 100644 --- a/examples/bluetooth/heartlistener/assets/monitor.qml +++ b/examples/bluetooth/heartlistener/assets/monitor.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/assets/results.qml b/examples/bluetooth/heartlistener/assets/results.qml index bdc7147d..301762c3 100644 --- a/examples/bluetooth/heartlistener/assets/results.qml +++ b/examples/bluetooth/heartlistener/assets/results.qml @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/deviceinfo.cpp b/examples/bluetooth/heartlistener/deviceinfo.cpp index 0e832dff..cfddf56d 100644 --- a/examples/bluetooth/heartlistener/deviceinfo.cpp +++ b/examples/bluetooth/heartlistener/deviceinfo.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/deviceinfo.h b/examples/bluetooth/heartlistener/deviceinfo.h index af14547d..636f7905 100644 --- a/examples/bluetooth/heartlistener/deviceinfo.h +++ b/examples/bluetooth/heartlistener/deviceinfo.h @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/doc/src/heartlistener.qdoc b/examples/bluetooth/heartlistener/doc/src/heartlistener.qdoc index c73c13f7..e7e1176f 100644 --- a/examples/bluetooth/heartlistener/doc/src/heartlistener.qdoc +++ b/examples/bluetooth/heartlistener/doc/src/heartlistener.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/heartlistener/heartrate.cpp b/examples/bluetooth/heartlistener/heartrate.cpp index dd7371af..b4496925 100644 --- a/examples/bluetooth/heartlistener/heartrate.cpp +++ b/examples/bluetooth/heartlistener/heartrate.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/heartrate.h b/examples/bluetooth/heartlistener/heartrate.h index 8f5ee061..1766ce3a 100644 --- a/examples/bluetooth/heartlistener/heartrate.h +++ b/examples/bluetooth/heartlistener/heartrate.h @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/heartlistener/main.cpp b/examples/bluetooth/heartlistener/main.cpp index e50b87f1..7aa17080 100644 --- a/examples/bluetooth/heartlistener/main.cpp +++ b/examples/bluetooth/heartlistener/main.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml index 8e6e2868..957eee70 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml index 190e6b90..8195b842 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Header.qml b/examples/bluetooth/lowenergyscanner/assets/Header.qml index 654fda34..0c8bc2c5 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Header.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Header.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Label.qml b/examples/bluetooth/lowenergyscanner/assets/Label.qml index 1dced831..5443ee6b 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Label.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Label.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Menu.qml b/examples/bluetooth/lowenergyscanner/assets/Menu.qml index 3669223a..e0a7b710 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Menu.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Menu.qml @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml index e3e05cac..a536152d 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Services.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/assets/main.qml b/examples/bluetooth/lowenergyscanner/assets/main.qml index 7f03d4fa..085c3e4f 100644 --- a/examples/bluetooth/lowenergyscanner/assets/main.qml +++ b/examples/bluetooth/lowenergyscanner/assets/main.qml @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp index f5290459..91bbfbc8 100644 --- a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.h b/examples/bluetooth/lowenergyscanner/characteristicinfo.h index d06c962e..c0566ba7 100644 --- a/examples/bluetooth/lowenergyscanner/characteristicinfo.h +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.h @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index 7ba27ad1..a95bc48b 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h index 756209da..331d4458 100644 --- a/examples/bluetooth/lowenergyscanner/device.h +++ b/examples/bluetooth/lowenergyscanner/device.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the demonstration applications of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp index d774cb22..89371a76 100644 --- a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.h b/examples/bluetooth/lowenergyscanner/deviceinfo.h index 48f11cfe..0c9ad673 100644 --- a/examples/bluetooth/lowenergyscanner/deviceinfo.h +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.h @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/doc/src/lowenergyscanner.qdoc b/examples/bluetooth/lowenergyscanner/doc/src/lowenergyscanner.qdoc index 0dc38efa..b4ad9fa2 100644 --- a/examples/bluetooth/lowenergyscanner/doc/src/lowenergyscanner.qdoc +++ b/examples/bluetooth/lowenergyscanner/doc/src/lowenergyscanner.qdoc @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited all rights reserved -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -11,15 +11,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/lowenergyscanner/main.cpp b/examples/bluetooth/lowenergyscanner/main.cpp index ce359545..27076f14 100644 --- a/examples/bluetooth/lowenergyscanner/main.cpp +++ b/examples/bluetooth/lowenergyscanner/main.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp index c05422ca..c424b046 100644 --- a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.h b/examples/bluetooth/lowenergyscanner/serviceinfo.h index 1d35b1b7..af040554 100644 --- a/examples/bluetooth/lowenergyscanner/serviceinfo.h +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.h @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/Button.qml b/examples/bluetooth/picturetransfer/Button.qml index eed6a4e9..2c5afb0b 100644 --- a/examples/bluetooth/picturetransfer/Button.qml +++ b/examples/bluetooth/picturetransfer/Button.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/DeviceDiscovery.qml b/examples/bluetooth/picturetransfer/DeviceDiscovery.qml index 77391ec2..16d9972e 100644 --- a/examples/bluetooth/picturetransfer/DeviceDiscovery.qml +++ b/examples/bluetooth/picturetransfer/DeviceDiscovery.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/FileSending.qml b/examples/bluetooth/picturetransfer/FileSending.qml index 3a4a282f..bdd4167e 100644 --- a/examples/bluetooth/picturetransfer/FileSending.qml +++ b/examples/bluetooth/picturetransfer/FileSending.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/PictureSelector.qml b/examples/bluetooth/picturetransfer/PictureSelector.qml index ca81ae44..5626cf64 100644 --- a/examples/bluetooth/picturetransfer/PictureSelector.qml +++ b/examples/bluetooth/picturetransfer/PictureSelector.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/bttransfer.qml b/examples/bluetooth/picturetransfer/bttransfer.qml index bdfb47f0..87dd70fb 100644 --- a/examples/bluetooth/picturetransfer/bttransfer.qml +++ b/examples/bluetooth/picturetransfer/bttransfer.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/doc/src/picturetransfer.qdoc b/examples/bluetooth/picturetransfer/doc/src/picturetransfer.qdoc index 3b0218d4..f597819d 100644 --- a/examples/bluetooth/picturetransfer/doc/src/picturetransfer.qdoc +++ b/examples/bluetooth/picturetransfer/doc/src/picturetransfer.qdoc @@ -1,7 +1,7 @@ a/**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the QtBluetooth module. ** @@ -10,15 +10,15 @@ a/**************************************************************************** ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/picturetransfer/filetransfer.cpp b/examples/bluetooth/picturetransfer/filetransfer.cpp index 6f0a25b2..2051f69c 100644 --- a/examples/bluetooth/picturetransfer/filetransfer.cpp +++ b/examples/bluetooth/picturetransfer/filetransfer.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/filetransfer.h b/examples/bluetooth/picturetransfer/filetransfer.h index 1bc9c78d..5fb65bd4 100644 --- a/examples/bluetooth/picturetransfer/filetransfer.h +++ b/examples/bluetooth/picturetransfer/filetransfer.h @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/picturetransfer/main.cpp b/examples/bluetooth/picturetransfer/main.cpp index cad9c66c..1ce3112e 100644 --- a/examples/bluetooth/picturetransfer/main.cpp +++ b/examples/bluetooth/picturetransfer/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/assets/Board.qml b/examples/bluetooth/pingpong/assets/Board.qml index 65e06e66..0adf6508 100644 --- a/examples/bluetooth/pingpong/assets/Board.qml +++ b/examples/bluetooth/pingpong/assets/Board.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/assets/Dialog.qml b/examples/bluetooth/pingpong/assets/Dialog.qml index da7f09d2..2a332715 100644 --- a/examples/bluetooth/pingpong/assets/Dialog.qml +++ b/examples/bluetooth/pingpong/assets/Dialog.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/assets/Menu.qml b/examples/bluetooth/pingpong/assets/Menu.qml index b14c7b2d..b7516262 100644 --- a/examples/bluetooth/pingpong/assets/Menu.qml +++ b/examples/bluetooth/pingpong/assets/Menu.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/assets/main.qml b/examples/bluetooth/pingpong/assets/main.qml index 2a155662..7b62f0bd 100644 --- a/examples/bluetooth/pingpong/assets/main.qml +++ b/examples/bluetooth/pingpong/assets/main.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/doc/src/pingpong.qdoc b/examples/bluetooth/pingpong/doc/src/pingpong.qdoc index 0e82a71a..1fabdf5c 100644 --- a/examples/bluetooth/pingpong/doc/src/pingpong.qdoc +++ b/examples/bluetooth/pingpong/doc/src/pingpong.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/pingpong/main.cpp b/examples/bluetooth/pingpong/main.cpp index 86cbb8bf..d2a84440 100644 --- a/examples/bluetooth/pingpong/main.cpp +++ b/examples/bluetooth/pingpong/main.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/pingpong.cpp b/examples/bluetooth/pingpong/pingpong.cpp index 423eced4..ab6ba8c7 100644 --- a/examples/bluetooth/pingpong/pingpong.cpp +++ b/examples/bluetooth/pingpong/pingpong.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/pingpong/pingpong.h b/examples/bluetooth/pingpong/pingpong.h index 17fe176b..650cd597 100644 --- a/examples/bluetooth/pingpong/pingpong.h +++ b/examples/bluetooth/pingpong/pingpong.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/scanner/Button.qml b/examples/bluetooth/scanner/Button.qml index 17fb38b5..566f539f 100644 --- a/examples/bluetooth/scanner/Button.qml +++ b/examples/bluetooth/scanner/Button.qml @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/scanner/doc/src/scanner.qdoc b/examples/bluetooth/scanner/doc/src/scanner.qdoc index f4e292a8..da5e55da 100644 --- a/examples/bluetooth/scanner/doc/src/scanner.qdoc +++ b/examples/bluetooth/scanner/doc/src/scanner.qdoc @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -11,15 +11,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/bluetooth/scanner/qmlscanner.cpp b/examples/bluetooth/scanner/qmlscanner.cpp index 5c09c8f3..fe961511 100644 --- a/examples/bluetooth/scanner/qmlscanner.cpp +++ b/examples/bluetooth/scanner/qmlscanner.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/bluetooth/scanner/scanner.qml b/examples/bluetooth/scanner/scanner.qml index 543e19de..10eeb83a 100644 --- a/examples/bluetooth/scanner/scanner.qml +++ b/examples/bluetooth/scanner/scanner.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index 909f199b..cd35c4ef 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/annotatedurl/annotatedurl.h b/examples/nfc/annotatedurl/annotatedurl.h index b0c69a62..08e5b38e 100644 --- a/examples/nfc/annotatedurl/annotatedurl.h +++ b/examples/nfc/annotatedurl/annotatedurl.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc b/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc index 08001fdf..a6ed6b34 100644 --- a/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc +++ b/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/nfc/annotatedurl/main.cpp b/examples/nfc/annotatedurl/main.cpp index 659aeb15..f46d303e 100644 --- a/examples/nfc/annotatedurl/main.cpp +++ b/examples/nfc/annotatedurl/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/annotatedurl/mainwindow.cpp b/examples/nfc/annotatedurl/mainwindow.cpp index 6ec256db..b0c7fc18 100644 --- a/examples/nfc/annotatedurl/mainwindow.cpp +++ b/examples/nfc/annotatedurl/mainwindow.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/annotatedurl/mainwindow.h b/examples/nfc/annotatedurl/mainwindow.h index b038be4a..0d367171 100644 --- a/examples/nfc/annotatedurl/mainwindow.h +++ b/examples/nfc/annotatedurl/mainwindow.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/corkboard/Mode.qml b/examples/nfc/corkboard/Mode.qml index 36b5afd7..81c42682 100644 --- a/examples/nfc/corkboard/Mode.qml +++ b/examples/nfc/corkboard/Mode.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index 22804c06..fc2377bc 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/corkboard/doc/src/corkboard.qdoc b/examples/nfc/corkboard/doc/src/corkboard.qdoc index db982d2e..46179107 100644 --- a/examples/nfc/corkboard/doc/src/corkboard.qdoc +++ b/examples/nfc/corkboard/doc/src/corkboard.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/nfc/corkboard/main.cpp b/examples/nfc/corkboard/main.cpp index 044c083f..320412ff 100644 --- a/examples/nfc/corkboard/main.cpp +++ b/examples/nfc/corkboard/main.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc b/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc index 3ebc5525..51801609 100644 --- a/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc +++ b/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/nfc/ndefeditor/main.cpp b/examples/nfc/ndefeditor/main.cpp index 05bc2bb1..c60517dc 100644 --- a/examples/nfc/ndefeditor/main.cpp +++ b/examples/nfc/ndefeditor/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp index fa0fa91f..28c2054a 100644 --- a/examples/nfc/ndefeditor/mainwindow.cpp +++ b/examples/nfc/ndefeditor/mainwindow.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/mainwindow.h b/examples/nfc/ndefeditor/mainwindow.h index 69e1e50f..374b2ee3 100644 --- a/examples/nfc/ndefeditor/mainwindow.h +++ b/examples/nfc/ndefeditor/mainwindow.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp index 1b84ab4d..134d674c 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.h b/examples/nfc/ndefeditor/mimeimagerecordeditor.h index 150f11cd..996cabc3 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.h +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/textrecordeditor.cpp b/examples/nfc/ndefeditor/textrecordeditor.cpp index 9015aeee..77e8a085 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.cpp +++ b/examples/nfc/ndefeditor/textrecordeditor.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/textrecordeditor.h b/examples/nfc/ndefeditor/textrecordeditor.h index 0da016ee..2699cdb5 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.h +++ b/examples/nfc/ndefeditor/textrecordeditor.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/urirecordeditor.cpp b/examples/nfc/ndefeditor/urirecordeditor.cpp index fa4f9ca0..4ea12768 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.cpp +++ b/examples/nfc/ndefeditor/urirecordeditor.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/ndefeditor/urirecordeditor.h b/examples/nfc/ndefeditor/urirecordeditor.h index aaf46b9a..156b5147 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.h +++ b/examples/nfc/ndefeditor/urirecordeditor.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/poster/doc/src/poster.qdoc b/examples/nfc/poster/doc/src/poster.qdoc index 05cfd6d3..a569f47a 100644 --- a/examples/nfc/poster/doc/src/poster.qdoc +++ b/examples/nfc/poster/doc/src/poster.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index 34181017..499839e7 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/examples/nfc/poster/qmlposter.cpp b/examples/nfc/poster/qmlposter.cpp index f6f3bbc8..eb96e1c2 100644 --- a/examples/nfc/poster/qmlposter.cpp +++ b/examples/nfc/poster/qmlposter.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java index c8453a0b..57d92c03 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java index 455054a8..90cacdb6 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 10aaf9ca..ffef93dd 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -1,7 +1,7 @@ /**************************************************************************** ** - ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - ** Contact: http://www.qt-project.org/legal + ** Copyright (C) 2015 The Qt Company Ltd. + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java index 1b1aaac9..b2db2bac 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothSocketServer.java @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp index 2ddf56c5..cb47dcb7 100644 --- a/src/bluetooth/android/androidbroadcastreceiver.cpp +++ b/src/bluetooth/android/androidbroadcastreceiver.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/androidbroadcastreceiver_p.h b/src/bluetooth/android/androidbroadcastreceiver_p.h index e09eb6e0..1f84a146 100644 --- a/src/bluetooth/android/androidbroadcastreceiver_p.h +++ b/src/bluetooth/android/androidbroadcastreceiver_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp index 4818fa0f..af68bc0d 100644 --- a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp +++ b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h b/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h index 5378e9aa..1fd93baa 100644 --- a/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h +++ b/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/inputstreamthread.cpp b/src/bluetooth/android/inputstreamthread.cpp index 98c245a7..c0e410b3 100644 --- a/src/bluetooth/android/inputstreamthread.cpp +++ b/src/bluetooth/android/inputstreamthread.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/inputstreamthread_p.h b/src/bluetooth/android/inputstreamthread_p.h index e7f7597e..5897a524 100644 --- a/src/bluetooth/android/inputstreamthread_p.h +++ b/src/bluetooth/android/inputstreamthread_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index a877b6bf..a91b7c88 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/jni_android_p.h b/src/bluetooth/android/jni_android_p.h index 0a90cfea..b45e634c 100644 --- a/src/bluetooth/android/jni_android_p.h +++ b/src/bluetooth/android/jni_android_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/localdevicebroadcastreceiver.cpp b/src/bluetooth/android/localdevicebroadcastreceiver.cpp index a3b92252..0487e376 100644 --- a/src/bluetooth/android/localdevicebroadcastreceiver.cpp +++ b/src/bluetooth/android/localdevicebroadcastreceiver.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/localdevicebroadcastreceiver_p.h b/src/bluetooth/android/localdevicebroadcastreceiver_p.h index c3830c8c..146b6671 100644 --- a/src/bluetooth/android/localdevicebroadcastreceiver_p.h +++ b/src/bluetooth/android/localdevicebroadcastreceiver_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index a0dbe565..325178b2 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 286c8120..b4c67b85 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/serveracceptancethread.cpp b/src/bluetooth/android/serveracceptancethread.cpp index 185cfa54..3a30cacb 100644 --- a/src/bluetooth/android/serveracceptancethread.cpp +++ b/src/bluetooth/android/serveracceptancethread.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/serveracceptancethread_p.h b/src/bluetooth/android/serveracceptancethread_p.h index 1adda433..ed565eec 100644 --- a/src/bluetooth/android/serveracceptancethread_p.h +++ b/src/bluetooth/android/serveracceptancethread_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp index 5ca9d59b..d0f3c3de 100644 --- a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp +++ b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h b/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h index 3e9e9c7f..9e953ab9 100644 --- a/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h +++ b/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/adapter.cpp b/src/bluetooth/bluez/adapter.cpp index e4b4f1ad..10b46f3b 100644 --- a/src/bluetooth/bluez/adapter.cpp +++ b/src/bluetooth/bluez/adapter.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p adapter_p.h:adapter.cpp org.bluez.all.xml org.bluez.Adapter * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/adapter1_bluez5.cpp b/src/bluetooth/bluez/adapter1_bluez5.cpp index 8de63d32..0f1e0acd 100644 --- a/src/bluetooth/bluez/adapter1_bluez5.cpp +++ b/src/bluetooth/bluez/adapter1_bluez5.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p adapter1 -v org.bluez.Adapter1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/adapter1_bluez5_p.h b/src/bluetooth/bluez/adapter1_bluez5_p.h index 32a70b3d..5568da4c 100644 --- a/src/bluetooth/bluez/adapter1_bluez5_p.h +++ b/src/bluetooth/bluez/adapter1_bluez5_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p adapter1 -v org.bluez.Adapter1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/adapter_p.h b/src/bluetooth/bluez/adapter_p.h index 2c865df4..d9b6a0c7 100644 --- a/src/bluetooth/bluez/adapter_p.h +++ b/src/bluetooth/bluez/adapter_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p adapter_p.h:adapter.cpp org.bluez.all.xml org.bluez.Adapter * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/agent.cpp b/src/bluetooth/bluez/agent.cpp index 453f6143..89840531 100644 --- a/src/bluetooth/bluez/agent.cpp +++ b/src/bluetooth/bluez/agent.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -c OrgBluezAgentAdaptor -a agent_p.h:agent.cpp org.bluez.Agent.xml org.bluez.Agent * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/agent_p.h b/src/bluetooth/bluez/agent_p.h index 2ccc487d..8329089f 100644 --- a/src/bluetooth/bluez/agent_p.h +++ b/src/bluetooth/bluez/agent_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -c OrgBluezAgentAdaptor -a agent_p.h:agent.cpp org.bluez.Agent.xml org.bluez.Agent * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index 0e3c0063..e4cb37d6 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/bluez5_helper_p.h b/src/bluetooth/bluez/bluez5_helper_p.h index 7935877c..e1fb90c5 100644 --- a/src/bluetooth/bluez/bluez5_helper_p.h +++ b/src/bluetooth/bluez/bluez5_helper_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/bluez_data_p.h b/src/bluetooth/bluez/bluez_data_p.h index 9d2d96b3..32cccb69 100644 --- a/src/bluetooth/bluez/bluez_data_p.h +++ b/src/bluetooth/bluez/bluez_data_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/device.cpp b/src/bluetooth/bluez/device.cpp index 5bffbd8b..5dc814dc 100644 --- a/src/bluetooth/bluez/device.cpp +++ b/src/bluetooth/bluez/device.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -i servicemap_p.h -p device_p.h:device.cpp org.bluez.Device.xml org.bluez.Device * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/device1_bluez5.cpp b/src/bluetooth/bluez/device1_bluez5.cpp index 50bef4cb..a4c01d3f 100644 --- a/src/bluetooth/bluez/device1_bluez5.cpp +++ b/src/bluetooth/bluez/device1_bluez5.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p device1_bluez5 -v org.bluez.Device1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/device1_bluez5_p.h b/src/bluetooth/bluez/device1_bluez5_p.h index 4caae28a..d6181b34 100644 --- a/src/bluetooth/bluez/device1_bluez5_p.h +++ b/src/bluetooth/bluez/device1_bluez5_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p device1_bluez5 -v org.bluez.Device1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/device_p.h b/src/bluetooth/bluez/device_p.h index d4ec45f9..417db3d9 100644 --- a/src/bluetooth/bluez/device_p.h +++ b/src/bluetooth/bluez/device_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -i servicemap_p.h -p device_p.h:device.cpp org.bluez.Device.xml org.bluez.Device * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index 32450588..bf2754f5 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/hcimanager_p.h b/src/bluetooth/bluez/hcimanager_p.h index 3a923519..9dd2ceee 100644 --- a/src/bluetooth/bluez/hcimanager_p.h +++ b/src/bluetooth/bluez/hcimanager_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/manager.cpp b/src/bluetooth/bluez/manager.cpp index aa974625..b5d6590d 100644 --- a/src/bluetooth/bluez/manager.cpp +++ b/src/bluetooth/bluez/manager.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p manager_p.h:manager.cpp org.bluez.Manager.xml org.bluez.Manager * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/manager_p.h b/src/bluetooth/bluez/manager_p.h index 1cd8975c..edb1c73b 100644 --- a/src/bluetooth/bluez/manager_p.h +++ b/src/bluetooth/bluez/manager_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p manager_p.h:manager.cpp org.bluez.Manager.xml org.bluez.Manager * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_agent.cpp b/src/bluetooth/bluez/obex_agent.cpp index b4b27d2e..c5252898 100644 --- a/src/bluetooth/bluez/obex_agent.cpp +++ b/src/bluetooth/bluez/obex_agent.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_agent_p.h b/src/bluetooth/bluez/obex_agent_p.h index 4eebbc32..8af38d86 100644 --- a/src/bluetooth/bluez/obex_agent_p.h +++ b/src/bluetooth/bluez/obex_agent_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_client.cpp b/src/bluetooth/bluez/obex_client.cpp index b90438f5..07730d42 100644 --- a/src/bluetooth/bluez/obex_client.cpp +++ b/src/bluetooth/bluez/obex_client.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_client_p.h:obex_client.cpp org.openobex.client.xml org.openobex.Client * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_client1_bluez5.cpp b/src/bluetooth/bluez/obex_client1_bluez5.cpp index fe0fd1f3..fb66708a 100644 --- a/src/bluetooth/bluez/obex_client1_bluez5.cpp +++ b/src/bluetooth/bluez/obex_client1_bluez5.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.Client1.xml -p asd * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_client1_bluez5_p.h b/src/bluetooth/bluez/obex_client1_bluez5_p.h index f8f0f89a..5133faea 100644 --- a/src/bluetooth/bluez/obex_client1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_client1_bluez5_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.Client1.xml -p asd * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_client_p.h b/src/bluetooth/bluez/obex_client_p.h index a7b32621..b2dd0f61 100644 --- a/src/bluetooth/bluez/obex_client_p.h +++ b/src/bluetooth/bluez/obex_client_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_client_p.h:obex_client.cpp org.openobex.client.xml org.openobex.Client * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_manager.cpp b/src/bluetooth/bluez/obex_manager.cpp index d2a173d7..0eb5d1c8 100644 --- a/src/bluetooth/bluez/obex_manager.cpp +++ b/src/bluetooth/bluez/obex_manager.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_manager_p.h:obex_manager.cpp org.openobex.all.xml org.openobex.Manager * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_manager_p.h b/src/bluetooth/bluez/obex_manager_p.h index 339d8a70..a6e4d189 100644 --- a/src/bluetooth/bluez/obex_manager_p.h +++ b/src/bluetooth/bluez/obex_manager_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_manager_p.h:obex_manager.cpp org.openobex.all.xml org.openobex.Manager * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp b/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp index 637a3a62..6edb27a8 100644 --- a/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp +++ b/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.obex.ObjectPush1.xml -p obex_objectpush1_bluez5 * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h b/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h index f8adcab4..ba5f090d 100644 --- a/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.obex.ObjectPush1.xml -p obex_objectpush1_bluez5 * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_transfer.cpp b/src/bluetooth/bluez/obex_transfer.cpp index c125a4e4..49e1f7c9 100644 --- a/src/bluetooth/bluez/obex_transfer.cpp +++ b/src/bluetooth/bluez/obex_transfer.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_transfer_p.h:obex_transfer.cpp org.openobex.transfer.xml org.openobex.Transfer * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_transfer1_bluez5.cpp b/src/bluetooth/bluez/obex_transfer1_bluez5.cpp index 51f2a013..8cddd05e 100644 --- a/src/bluetooth/bluez/obex_transfer1_bluez5.cpp +++ b/src/bluetooth/bluez/obex_transfer1_bluez5.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.obex.Transfer1.xml -p obex_transfer1_bluez5 * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/obex_transfer1_bluez5_p.h b/src/bluetooth/bluez/obex_transfer1_bluez5_p.h index 46b86248..2307f2ae 100644 --- a/src/bluetooth/bluez/obex_transfer1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_transfer1_bluez5_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.bluez.obex.Transfer1.xml -p obex_transfer1_bluez5 * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/obex_transfer_p.h b/src/bluetooth/bluez/obex_transfer_p.h index 6578969c..81b9eb22 100644 --- a/src/bluetooth/bluez/obex_transfer_p.h +++ b/src/bluetooth/bluez/obex_transfer_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p obex_transfer_p.h:obex_transfer.cpp org.openobex.transfer.xml org.openobex.Transfer * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/objectmanager.cpp b/src/bluetooth/bluez/objectmanager.cpp index 521012f6..a8e8fdba 100644 --- a/src/bluetooth/bluez/objectmanager.cpp +++ b/src/bluetooth/bluez/objectmanager.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p objectmanager -v -i bluez5_helper.h org.freedesktop.dbus.objectmanager.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/objectmanager_p.h b/src/bluetooth/bluez/objectmanager_p.h index 5ecde487..823badeb 100644 --- a/src/bluetooth/bluez/objectmanager_p.h +++ b/src/bluetooth/bluez/objectmanager_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p objectmanager -v -i bluez5_helper.h org.freedesktop.dbus.objectmanager.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/profile1.cpp b/src/bluetooth/bluez/profile1.cpp index 2cf15d7e..c289c89b 100644 --- a/src/bluetooth/bluez/profile1.cpp +++ b/src/bluetooth/bluez/profile1.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p profile1 org.bluez.ProfileManager1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/profile1_p.h b/src/bluetooth/bluez/profile1_p.h index d94f1916..a08f10e0 100644 --- a/src/bluetooth/bluez/profile1_p.h +++ b/src/bluetooth/bluez/profile1_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p profile1 org.bluez.ProfileManager1.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/properties.cpp b/src/bluetooth/bluez/properties.cpp index 53c9021c..4ddbc30c 100644 --- a/src/bluetooth/bluez/properties.cpp +++ b/src/bluetooth/bluez/properties.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p properties -v org.freedesktop.dbus.properties.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/properties_p.h b/src/bluetooth/bluez/properties_p.h index 44a79664..daadfefc 100644 --- a/src/bluetooth/bluez/properties_p.h +++ b/src/bluetooth/bluez/properties_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p properties -v org.freedesktop.dbus.properties.xml * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/service.cpp b/src/bluetooth/bluez/service.cpp index fb9c2e9c..2004bea7 100644 --- a/src/bluetooth/bluez/service.cpp +++ b/src/bluetooth/bluez/service.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p service_p.h:service.cpp org.bluez.all.xml org.bluez.Service * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/bluetooth/bluez/service_p.h b/src/bluetooth/bluez/service_p.h index 3e13e672..e8c5e1f4 100644 --- a/src/bluetooth/bluez/service_p.h +++ b/src/bluetooth/bluez/service_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.7 * Command line was: qdbusxml2cpp -p service_p.h:service.cpp org.bluez.all.xml org.bluez.Service * - * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + * Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/bluetooth/bluez/servicemap.cpp b/src/bluetooth/bluez/servicemap.cpp index 411eb6d8..dcc8760a 100644 --- a/src/bluetooth/bluez/servicemap.cpp +++ b/src/bluetooth/bluez/servicemap.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/bluez/servicemap_p.h b/src/bluetooth/bluez/servicemap_p.h index 6ae3afb3..56f8d61e 100644 --- a/src/bluetooth/bluez/servicemap_p.h +++ b/src/bluetooth/bluez/servicemap_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp index d8e5b23f..0c017e45 100644 --- a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp +++ b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml index eac7c144..fcafbd53 100644 --- a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml +++ b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/bluetooth/doc/src/bluetooth-cpp.qdoc b/src/bluetooth/doc/src/bluetooth-cpp.qdoc index df18cc6a..ae39772f 100644 --- a/src/bluetooth/doc/src/bluetooth-cpp.qdoc +++ b/src/bluetooth/doc/src/bluetooth-cpp.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/src/bluetooth-index.qdoc b/src/bluetooth/doc/src/bluetooth-index.qdoc index af2c2421..f5e76ff0 100644 --- a/src/bluetooth/doc/src/bluetooth-index.qdoc +++ b/src/bluetooth/doc/src/bluetooth-index.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc index a56e43fc..8cba2f64 100644 --- a/src/bluetooth/doc/src/bluetooth-le-overview.qdoc +++ b/src/bluetooth/doc/src/bluetooth-le-overview.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/src/bluetooth-overview.qdoc b/src/bluetooth/doc/src/bluetooth-overview.qdoc index 1aa0d28d..1b712f23 100644 --- a/src/bluetooth/doc/src/bluetooth-overview.qdoc +++ b/src/bluetooth/doc/src/bluetooth-overview.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/src/bluetooth-qml.qdoc b/src/bluetooth/doc/src/bluetooth-qml.qdoc index 9c9fe0aa..2fb64f45 100644 --- a/src/bluetooth/doc/src/bluetooth-qml.qdoc +++ b/src/bluetooth/doc/src/bluetooth-qml.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt local connectivty modules. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/doc/src/examples.qdoc b/src/bluetooth/doc/src/examples.qdoc index 7eb26cab..d21c7932 100644 --- a/src/bluetooth/doc/src/examples.qdoc +++ b/src/bluetooth/doc/src/examples.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/bluetooth/osx/corebluetoothwrapper_p.h b/src/bluetooth/osx/corebluetoothwrapper_p.h index 60d9b454..d0b6f23c 100644 --- a/src/bluetooth/osx/corebluetoothwrapper_p.h +++ b/src/bluetooth/osx/corebluetoothwrapper_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 6e927590..e539788d 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index ff08c14a..b1908a48 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtchanneldelegate.mm b/src/bluetooth/osx/osxbtchanneldelegate.mm index b532188f..2214168b 100644 --- a/src/bluetooth/osx/osxbtchanneldelegate.mm +++ b/src/bluetooth/osx/osxbtchanneldelegate.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtchanneldelegate_p.h b/src/bluetooth/osx/osxbtchanneldelegate_p.h index 2c7d8231..edcf6950 100644 --- a/src/bluetooth/osx/osxbtchanneldelegate_p.h +++ b/src/bluetooth/osx/osxbtchanneldelegate_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtconnectionmonitor.mm b/src/bluetooth/osx/osxbtconnectionmonitor.mm index b6f3f4e7..8228d135 100644 --- a/src/bluetooth/osx/osxbtconnectionmonitor.mm +++ b/src/bluetooth/osx/osxbtconnectionmonitor.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtconnectionmonitor_p.h b/src/bluetooth/osx/osxbtconnectionmonitor_p.h index bf0b45e8..4ad28885 100644 --- a/src/bluetooth/osx/osxbtconnectionmonitor_p.h +++ b/src/bluetooth/osx/osxbtconnectionmonitor_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtdeviceinquiry.mm b/src/bluetooth/osx/osxbtdeviceinquiry.mm index 4f67b726..6fb89e20 100644 --- a/src/bluetooth/osx/osxbtdeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtdeviceinquiry.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtdeviceinquiry_p.h b/src/bluetooth/osx/osxbtdeviceinquiry_p.h index 3c4f83fd..4397b45d 100644 --- a/src/bluetooth/osx/osxbtdeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtdeviceinquiry_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtdevicepair.mm b/src/bluetooth/osx/osxbtdevicepair.mm index 3dfc4d33..41c20b8b 100644 --- a/src/bluetooth/osx/osxbtdevicepair.mm +++ b/src/bluetooth/osx/osxbtdevicepair.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtdevicepair_p.h b/src/bluetooth/osx/osxbtdevicepair_p.h index 334f0896..a2aa2de0 100644 --- a/src/bluetooth/osx/osxbtdevicepair_p.h +++ b/src/bluetooth/osx/osxbtdevicepair_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtl2capchannel.mm b/src/bluetooth/osx/osxbtl2capchannel.mm index c62efc50..93e15012 100644 --- a/src/bluetooth/osx/osxbtl2capchannel.mm +++ b/src/bluetooth/osx/osxbtl2capchannel.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtl2capchannel_p.h b/src/bluetooth/osx/osxbtl2capchannel_p.h index 4888be56..9736bd1d 100644 --- a/src/bluetooth/osx/osxbtl2capchannel_p.h +++ b/src/bluetooth/osx/osxbtl2capchannel_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 6bbddcf9..4e9235af 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtledeviceinquiry_p.h b/src/bluetooth/osx/osxbtledeviceinquiry_p.h index c8b6133e..65005894 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtledeviceinquiry_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtobexsession.mm b/src/bluetooth/osx/osxbtobexsession.mm index 0bed6af2..f48da22d 100644 --- a/src/bluetooth/osx/osxbtobexsession.mm +++ b/src/bluetooth/osx/osxbtobexsession.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtobexsession_p.h b/src/bluetooth/osx/osxbtobexsession_p.h index 9449ebf0..ac2699cf 100644 --- a/src/bluetooth/osx/osxbtobexsession_p.h +++ b/src/bluetooth/osx/osxbtobexsession_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtrfcommchannel.mm b/src/bluetooth/osx/osxbtrfcommchannel.mm index df1fd433..a91f62dc 100644 --- a/src/bluetooth/osx/osxbtrfcommchannel.mm +++ b/src/bluetooth/osx/osxbtrfcommchannel.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtrfcommchannel_p.h b/src/bluetooth/osx/osxbtrfcommchannel_p.h index 21c1711c..80758ab0 100644 --- a/src/bluetooth/osx/osxbtrfcommchannel_p.h +++ b/src/bluetooth/osx/osxbtrfcommchannel_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtsdpinquiry.mm b/src/bluetooth/osx/osxbtsdpinquiry.mm index b460f929..004d9e61 100644 --- a/src/bluetooth/osx/osxbtsdpinquiry.mm +++ b/src/bluetooth/osx/osxbtsdpinquiry.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtsdpinquiry_p.h b/src/bluetooth/osx/osxbtsdpinquiry_p.h index b96de620..20b6c66c 100644 --- a/src/bluetooth/osx/osxbtsdpinquiry_p.h +++ b/src/bluetooth/osx/osxbtsdpinquiry_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtservicerecord.mm b/src/bluetooth/osx/osxbtservicerecord.mm index a0930ae9..cd80ee63 100644 --- a/src/bluetooth/osx/osxbtservicerecord.mm +++ b/src/bluetooth/osx/osxbtservicerecord.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtservicerecord_p.h b/src/bluetooth/osx/osxbtservicerecord_p.h index 03ac8e42..fa84147b 100644 --- a/src/bluetooth/osx/osxbtservicerecord_p.h +++ b/src/bluetooth/osx/osxbtservicerecord_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtsocketlistener.mm b/src/bluetooth/osx/osxbtsocketlistener.mm index ab7affbe..e3124dd1 100644 --- a/src/bluetooth/osx/osxbtsocketlistener.mm +++ b/src/bluetooth/osx/osxbtsocketlistener.mm @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/osx/osxbtsocketlistener_p.h b/src/bluetooth/osx/osxbtsocketlistener_p.h index 0f82ba37..e4fd8882 100644 --- a/src/bluetooth/osx/osxbtsocketlistener_p.h +++ b/src/bluetooth/osx/osxbtsocketlistener_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/osx/osxbtutility.mm b/src/bluetooth/osx/osxbtutility.mm index ae4bae77..a5d3d936 100644 --- a/src/bluetooth/osx/osxbtutility.mm +++ b/src/bluetooth/osx/osxbtutility.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/osx/osxbtutility_p.h b/src/bluetooth/osx/osxbtutility_p.h index 6d5fbce7..18d8732a 100644 --- a/src/bluetooth/osx/osxbtutility_p.h +++ b/src/bluetooth/osx/osxbtutility_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetooth.cpp b/src/bluetooth/qbluetooth.cpp index ea3900e1..cea63a34 100644 --- a/src/bluetooth/qbluetooth.cpp +++ b/src/bluetooth/qbluetooth.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetooth.h b/src/bluetooth/qbluetooth.h index ebe546f8..f448af02 100644 --- a/src/bluetooth/qbluetooth.h +++ b/src/bluetooth/qbluetooth.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothaddress.cpp b/src/bluetooth/qbluetoothaddress.cpp index 481bcc0d..8e3c29c6 100644 --- a/src/bluetooth/qbluetoothaddress.cpp +++ b/src/bluetooth/qbluetoothaddress.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothaddress.h b/src/bluetooth/qbluetoothaddress.h index 3fa491a2..32356d3b 100644 --- a/src/bluetooth/qbluetoothaddress.h +++ b/src/bluetooth/qbluetoothaddress.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothaddress_p.h b/src/bluetooth/qbluetoothaddress_p.h index be641dca..7a2fbdcf 100644 --- a/src/bluetooth/qbluetoothaddress_p.h +++ b/src/bluetooth/qbluetoothaddress_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp index 3f25d8d5..073146bc 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.h b/src/bluetooth/qbluetoothdevicediscoveryagent.h index f516bcec..700d8af7 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp index d2fba203..9d3387ec 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp index 2f90fd30..4d296d20 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm index f1e7945c..1bce6400 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm index 2c4a7acd..b6e32231 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp index bacfeee1..97d405a4 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h index 1e269e1f..5ef6772e 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp index 2e4ad274..8996d71b 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdeviceinfo.cpp b/src/bluetooth/qbluetoothdeviceinfo.cpp index a831ee3e..37ba4e11 100644 --- a/src/bluetooth/qbluetoothdeviceinfo.cpp +++ b/src/bluetooth/qbluetoothdeviceinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdeviceinfo.h b/src/bluetooth/qbluetoothdeviceinfo.h index c9822193..b64a9727 100644 --- a/src/bluetooth/qbluetoothdeviceinfo.h +++ b/src/bluetooth/qbluetoothdeviceinfo.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothdeviceinfo_p.h b/src/bluetooth/qbluetoothdeviceinfo_p.h index d2a2d6ad..99ff9bb4 100644 --- a/src/bluetooth/qbluetoothdeviceinfo_p.h +++ b/src/bluetooth/qbluetoothdeviceinfo_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothglobal.h b/src/bluetooth/qbluetoothglobal.h index 9c64e24e..830b23a5 100644 --- a/src/bluetooth/qbluetoothglobal.h +++ b/src/bluetooth/qbluetoothglobal.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothhostinfo.cpp b/src/bluetooth/qbluetoothhostinfo.cpp index cbabcb5e..1304f18a 100644 --- a/src/bluetooth/qbluetoothhostinfo.cpp +++ b/src/bluetooth/qbluetoothhostinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothhostinfo.h b/src/bluetooth/qbluetoothhostinfo.h index abc70e7e..8b0085b0 100644 --- a/src/bluetooth/qbluetoothhostinfo.h +++ b/src/bluetooth/qbluetoothhostinfo.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothhostinfo_p.h b/src/bluetooth/qbluetoothhostinfo_p.h index 7eb46bd6..38f8df27 100644 --- a/src/bluetooth/qbluetoothhostinfo_p.h +++ b/src/bluetooth/qbluetoothhostinfo_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice.cpp b/src/bluetooth/qbluetoothlocaldevice.cpp index 87e1e521..0eb97647 100644 --- a/src/bluetooth/qbluetoothlocaldevice.cpp +++ b/src/bluetooth/qbluetoothlocaldevice.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice.h b/src/bluetooth/qbluetoothlocaldevice.h index 4c1e9016..90c113d7 100644 --- a/src/bluetooth/qbluetoothlocaldevice.h +++ b/src/bluetooth/qbluetoothlocaldevice.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice_android.cpp b/src/bluetooth/qbluetoothlocaldevice_android.cpp index 11515743..133b76b9 100644 --- a/src/bluetooth/qbluetoothlocaldevice_android.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_android.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp index 0df7cc5d..cae21e1b 100644 --- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice_osx.mm b/src/bluetooth/qbluetoothlocaldevice_osx.mm index 32562e94..71b7b81a 100644 --- a/src/bluetooth/qbluetoothlocaldevice_osx.mm +++ b/src/bluetooth/qbluetoothlocaldevice_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothlocaldevice_p.cpp b/src/bluetooth/qbluetoothlocaldevice_p.cpp index dbfb8724..2785e84c 100644 --- a/src/bluetooth/qbluetoothlocaldevice_p.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice_p.h b/src/bluetooth/qbluetoothlocaldevice_p.h index 8cd7505c..c47ceb9e 100644 --- a/src/bluetooth/qbluetoothlocaldevice_p.h +++ b/src/bluetooth/qbluetoothlocaldevice_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothlocaldevice_qnx.cpp b/src/bluetooth/qbluetoothlocaldevice_qnx.cpp index c2a099f4..c36fb89a 100644 --- a/src/bluetooth/qbluetoothlocaldevice_qnx.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver.cpp b/src/bluetooth/qbluetoothserver.cpp index 1c4676e0..01f6fc37 100644 --- a/src/bluetooth/qbluetoothserver.cpp +++ b/src/bluetooth/qbluetoothserver.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver.h b/src/bluetooth/qbluetoothserver.h index 2eadd1d4..22932a94 100644 --- a/src/bluetooth/qbluetoothserver.h +++ b/src/bluetooth/qbluetoothserver.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_android.cpp b/src/bluetooth/qbluetoothserver_android.cpp index 3660cff8..8a23c4bf 100644 --- a/src/bluetooth/qbluetoothserver_android.cpp +++ b/src/bluetooth/qbluetoothserver_android.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_bluez.cpp b/src/bluetooth/qbluetoothserver_bluez.cpp index 88eab65c..2c3bcc8f 100644 --- a/src/bluetooth/qbluetoothserver_bluez.cpp +++ b/src/bluetooth/qbluetoothserver_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_osx.mm b/src/bluetooth/qbluetoothserver_osx.mm index 46e8f750..6b82dd04 100644 --- a/src/bluetooth/qbluetoothserver_osx.mm +++ b/src/bluetooth/qbluetoothserver_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothserver_osx_p.h b/src/bluetooth/qbluetoothserver_osx_p.h index d501743c..6aed892c 100644 --- a/src/bluetooth/qbluetoothserver_osx_p.h +++ b/src/bluetooth/qbluetoothserver_osx_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_p.cpp b/src/bluetooth/qbluetoothserver_p.cpp index 310b6f68..86b520d6 100644 --- a/src/bluetooth/qbluetoothserver_p.cpp +++ b/src/bluetooth/qbluetoothserver_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_p.h b/src/bluetooth/qbluetoothserver_p.h index ee65994b..090d8860 100644 --- a/src/bluetooth/qbluetoothserver_p.h +++ b/src/bluetooth/qbluetoothserver_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserver_qnx.cpp b/src/bluetooth/qbluetoothserver_qnx.cpp index bb2346cd..d23ea55a 100644 --- a/src/bluetooth/qbluetoothserver_qnx.cpp +++ b/src/bluetooth/qbluetoothserver_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 - 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index 7274780a..a285a557 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h index d9f005cd..2203721f 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp index 92a67caa..47f3bd0b 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index 90baf1f8..86d35428 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm index caa3942c..faceabac 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp index 695912f1..738fe739 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.h b/src/bluetooth/qbluetoothservicediscoveryagent_p.h index 3b9c0a42..9f2c501a 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp index 4b7108be..32d6d2c2 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo.cpp b/src/bluetooth/qbluetoothserviceinfo.cpp index f0926d9c..87670d3a 100644 --- a/src/bluetooth/qbluetoothserviceinfo.cpp +++ b/src/bluetooth/qbluetoothserviceinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo.h b/src/bluetooth/qbluetoothserviceinfo.h index 1ec1d7d9..b52eaf79 100644 --- a/src/bluetooth/qbluetoothserviceinfo.h +++ b/src/bluetooth/qbluetoothserviceinfo.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo_android.cpp b/src/bluetooth/qbluetoothserviceinfo_android.cpp index 64603235..714b671c 100644 --- a/src/bluetooth/qbluetoothserviceinfo_android.cpp +++ b/src/bluetooth/qbluetoothserviceinfo_android.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp index 59a9abca..e3fa81d1 100644 --- a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp +++ b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo_osx.mm b/src/bluetooth/qbluetoothserviceinfo_osx.mm index abe3fc75..743fb377 100644 --- a/src/bluetooth/qbluetoothserviceinfo_osx.mm +++ b/src/bluetooth/qbluetoothserviceinfo_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothserviceinfo_p.cpp b/src/bluetooth/qbluetoothserviceinfo_p.cpp index ba6a9526..8942149a 100644 --- a/src/bluetooth/qbluetoothserviceinfo_p.cpp +++ b/src/bluetooth/qbluetoothserviceinfo_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo_p.h b/src/bluetooth/qbluetoothserviceinfo_p.h index ea6a122a..c109496a 100644 --- a/src/bluetooth/qbluetoothserviceinfo_p.h +++ b/src/bluetooth/qbluetoothserviceinfo_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothserviceinfo_qnx.cpp b/src/bluetooth/qbluetoothserviceinfo_qnx.cpp index 387f4751..6d5f678e 100644 --- a/src/bluetooth/qbluetoothserviceinfo_qnx.cpp +++ b/src/bluetooth/qbluetoothserviceinfo_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index dbbf05e9..e82e866a 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index e68c2bc3..6caca2a0 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index c3380836..76cbccdb 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Lauri Laanmets (Proekspert AS) -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 9eedc492..47f5629e 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 2bdd1291..2472cbee 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothsocket_osx_p.h b/src/bluetooth/qbluetoothsocket_osx_p.h index 31389ec0..8507620a 100644 --- a/src/bluetooth/qbluetoothsocket_osx_p.h +++ b/src/bluetooth/qbluetoothsocket_osx_p.h @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index 85b730dd..e18c985b 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 014934f1..40bc678f 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothsocket_qnx.cpp b/src/bluetooth/qbluetoothsocket_qnx.cpp index 0d698ee5..125a5595 100644 --- a/src/bluetooth/qbluetoothsocket_qnx.cpp +++ b/src/bluetooth/qbluetoothsocket_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransfermanager.cpp b/src/bluetooth/qbluetoothtransfermanager.cpp index ea2406f1..4c40fe72 100644 --- a/src/bluetooth/qbluetoothtransfermanager.cpp +++ b/src/bluetooth/qbluetoothtransfermanager.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransfermanager.h b/src/bluetooth/qbluetoothtransfermanager.h index f252f975..6d6b0318 100644 --- a/src/bluetooth/qbluetoothtransfermanager.h +++ b/src/bluetooth/qbluetoothtransfermanager.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply.cpp b/src/bluetooth/qbluetoothtransferreply.cpp index a40e7191..e0d30a60 100644 --- a/src/bluetooth/qbluetoothtransferreply.cpp +++ b/src/bluetooth/qbluetoothtransferreply.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply.h b/src/bluetooth/qbluetoothtransferreply.h index 37ca8fe5..081b7002 100644 --- a/src/bluetooth/qbluetoothtransferreply.h +++ b/src/bluetooth/qbluetoothtransferreply.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_bluez.cpp b/src/bluetooth/qbluetoothtransferreply_bluez.cpp index 43a83d71..9a9ad38f 100644 --- a/src/bluetooth/qbluetoothtransferreply_bluez.cpp +++ b/src/bluetooth/qbluetoothtransferreply_bluez.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_bluez_p.h b/src/bluetooth/qbluetoothtransferreply_bluez_p.h index 0a9f9bca..2fd7633e 100644 --- a/src/bluetooth/qbluetoothtransferreply_bluez_p.h +++ b/src/bluetooth/qbluetoothtransferreply_bluez_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_osx.mm b/src/bluetooth/qbluetoothtransferreply_osx.mm index 37d73a56..2b5389fb 100644 --- a/src/bluetooth/qbluetoothtransferreply_osx.mm +++ b/src/bluetooth/qbluetoothtransferreply_osx.mm @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_osx_p.h b/src/bluetooth/qbluetoothtransferreply_osx_p.h index cc973bfa..74c1630e 100644 --- a/src/bluetooth/qbluetoothtransferreply_osx_p.h +++ b/src/bluetooth/qbluetoothtransferreply_osx_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_p.h b/src/bluetooth/qbluetoothtransferreply_p.h index 8c6c4968..d3fbf4f1 100644 --- a/src/bluetooth/qbluetoothtransferreply_p.h +++ b/src/bluetooth/qbluetoothtransferreply_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_qnx.cpp b/src/bluetooth/qbluetoothtransferreply_qnx.cpp index d0e763cd..5b40073c 100644 --- a/src/bluetooth/qbluetoothtransferreply_qnx.cpp +++ b/src/bluetooth/qbluetoothtransferreply_qnx.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 Research In Motion -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferreply_qnx_p.h b/src/bluetooth/qbluetoothtransferreply_qnx_p.h index d6b4d64b..138672c5 100644 --- a/src/bluetooth/qbluetoothtransferreply_qnx_p.h +++ b/src/bluetooth/qbluetoothtransferreply_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferrequest.cpp b/src/bluetooth/qbluetoothtransferrequest.cpp index 6d750f25..999d81b5 100644 --- a/src/bluetooth/qbluetoothtransferrequest.cpp +++ b/src/bluetooth/qbluetoothtransferrequest.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferrequest.h b/src/bluetooth/qbluetoothtransferrequest.h index 981e99a8..c68ae1c9 100644 --- a/src/bluetooth/qbluetoothtransferrequest.h +++ b/src/bluetooth/qbluetoothtransferrequest.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothtransferrequest_p.h b/src/bluetooth/qbluetoothtransferrequest_p.h index ff146ec7..3b68165e 100644 --- a/src/bluetooth/qbluetoothtransferrequest_p.h +++ b/src/bluetooth/qbluetoothtransferrequest_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index ef5328bd..2fc2f161 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 94e14d0e..c4e7fb81 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp index f764eace..efd54cfb 100644 --- a/src/bluetooth/qlowenergycharacteristic.cpp +++ b/src/bluetooth/qlowenergycharacteristic.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index 256aea68..4d552369 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -1,8 +1,8 @@ /*************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited all rights reserved -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 906a6af1..79359345 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h index 94ed6651..b125fc09 100644 --- a/src/bluetooth/qlowenergycontroller.h +++ b/src/bluetooth/qlowenergycontroller.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index e1b668ca..65b3964e 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index ae354bc7..2d4fa7be 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 5b4b24aa..6be8dd67 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index c7db0668..d9457217 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index f3a12473..79f463ef 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 6234b57f..408cc72a 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp index e18a4f6b..df044573 100644 --- a/src/bluetooth/qlowenergydescriptor.cpp +++ b/src/bluetooth/qlowenergydescriptor.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index eb0ae54f..8692a542 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -1,8 +1,8 @@ /*************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index c33de8d5..839d6690 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 2c86d380..3d9247a6 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index c6284bbd..436cc086 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 Javier S. Pedro -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 3b4ea64e..6f112017 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index 4a98d589..cc9b452f 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qnx/ppshelpers.cpp b/src/bluetooth/qnx/ppshelpers.cpp index eaf9c374..215839cc 100644 --- a/src/bluetooth/qnx/ppshelpers.cpp +++ b/src/bluetooth/qnx/ppshelpers.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qnx/ppshelpers_p.h b/src/bluetooth/qnx/ppshelpers_p.h index e771fd8e..0a3a1033 100644 --- a/src/bluetooth/qnx/ppshelpers_p.h +++ b/src/bluetooth/qnx/ppshelpers_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/bluetooth/qprivatelinearbuffer_p.h b/src/bluetooth/qprivatelinearbuffer_p.h index b13e68d3..78fcb669 100644 --- a/src/bluetooth/qprivatelinearbuffer_p.h +++ b/src/bluetooth/qprivatelinearbuffer_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp index dd889d30..38b464d7 100644 --- a/src/imports/bluetooth/plugin.cpp +++ b/src/imports/bluetooth/plugin.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp index 01a53bfa..65941fec 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h index 1834ce36..82a2129b 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel_p.h @@ -1,8 +1,8 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp index 59ee2510..84506ce9 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothservice_p.h b/src/imports/bluetooth/qdeclarativebluetoothservice_p.h index 0e04b790..9cb62de9 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothservice_p.h +++ b/src/imports/bluetooth/qdeclarativebluetoothservice_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp index 96be47fb..9072f136 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h b/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h index 35a8c504..4ad69f9e 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h +++ b/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp index d9a8bc07..14f3b280 100644 --- a/src/imports/nfc/plugin.cpp +++ b/src/imports/nfc/plugin.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendeffilter.cpp b/src/imports/nfc/qdeclarativendeffilter.cpp index 7c6d725e..a3fb1581 100644 --- a/src/imports/nfc/qdeclarativendeffilter.cpp +++ b/src/imports/nfc/qdeclarativendeffilter.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendeffilter_p.h b/src/imports/nfc/qdeclarativendeffilter_p.h index e5b2fced..0d2df237 100644 --- a/src/imports/nfc/qdeclarativendeffilter_p.h +++ b/src/imports/nfc/qdeclarativendeffilter_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendefmimerecord.cpp b/src/imports/nfc/qdeclarativendefmimerecord.cpp index 65915275..51035460 100644 --- a/src/imports/nfc/qdeclarativendefmimerecord.cpp +++ b/src/imports/nfc/qdeclarativendefmimerecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendefmimerecord_p.h b/src/imports/nfc/qdeclarativendefmimerecord_p.h index 8438a1f6..61459362 100644 --- a/src/imports/nfc/qdeclarativendefmimerecord_p.h +++ b/src/imports/nfc/qdeclarativendefmimerecord_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendeftextrecord.cpp b/src/imports/nfc/qdeclarativendeftextrecord.cpp index 8e5507a2..e8d9e32f 100644 --- a/src/imports/nfc/qdeclarativendeftextrecord.cpp +++ b/src/imports/nfc/qdeclarativendeftextrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendeftextrecord_p.h b/src/imports/nfc/qdeclarativendeftextrecord_p.h index ca11c017..8a65a951 100644 --- a/src/imports/nfc/qdeclarativendeftextrecord_p.h +++ b/src/imports/nfc/qdeclarativendeftextrecord_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendefurirecord.cpp b/src/imports/nfc/qdeclarativendefurirecord.cpp index ec0f4bb8..356c3300 100644 --- a/src/imports/nfc/qdeclarativendefurirecord.cpp +++ b/src/imports/nfc/qdeclarativendefurirecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativendefurirecord_p.h b/src/imports/nfc/qdeclarativendefurirecord_p.h index 02abe36e..fe29697a 100644 --- a/src/imports/nfc/qdeclarativendefurirecord_p.h +++ b/src/imports/nfc/qdeclarativendefurirecord_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index 58ed0e50..3e45047b 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativenearfield_p.h b/src/imports/nfc/qdeclarativenearfield_p.h index eb29509a..69cd08d4 100644 --- a/src/imports/nfc/qdeclarativenearfield_p.h +++ b/src/imports/nfc/qdeclarativenearfield_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativenearfieldsocket.cpp b/src/imports/nfc/qdeclarativenearfieldsocket.cpp index 77b12fb5..82e998ab 100644 --- a/src/imports/nfc/qdeclarativenearfieldsocket.cpp +++ b/src/imports/nfc/qdeclarativenearfieldsocket.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/imports/nfc/qdeclarativenearfieldsocket_p.h b/src/imports/nfc/qdeclarativenearfieldsocket_p.h index e6664d8e..8fbd0b15 100644 --- a/src/imports/nfc/qdeclarativenearfieldsocket_p.h +++ b/src/imports/nfc/qdeclarativenearfieldsocket_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/doc/snippets/doc_src_qtnfc.cpp b/src/nfc/doc/snippets/doc_src_qtnfc.cpp index 62aa65e2..f4d7f91a 100644 --- a/src/nfc/doc/snippets/doc_src_qtnfc.cpp +++ b/src/nfc/doc/snippets/doc_src_qtnfc.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/snippets/doc_src_qtnfc.qml b/src/nfc/doc/snippets/doc_src_qtnfc.qml index 427c24c6..65efee56 100644 --- a/src/nfc/doc/snippets/doc_src_qtnfc.qml +++ b/src/nfc/doc/snippets/doc_src_qtnfc.qml @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -18,8 +18,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/snippets/foorecord.cpp b/src/nfc/doc/snippets/foorecord.cpp index 2c4daeb1..14a83af3 100644 --- a/src/nfc/doc/snippets/foorecord.cpp +++ b/src/nfc/doc/snippets/foorecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/snippets/foorecord.h b/src/nfc/doc/snippets/foorecord.h index 59d13df9..e8c130e4 100644 --- a/src/nfc/doc/snippets/foorecord.h +++ b/src/nfc/doc/snippets/foorecord.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/snippets/main.cpp b/src/nfc/doc/snippets/main.cpp index 5c08502c..09d07b02 100644 --- a/src/nfc/doc/snippets/main.cpp +++ b/src/nfc/doc/snippets/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/snippets/nfc.cpp b/src/nfc/doc/snippets/nfc.cpp index 347b7a6f..eb7ef989 100644 --- a/src/nfc/doc/snippets/nfc.cpp +++ b/src/nfc/doc/snippets/nfc.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -17,8 +17,8 @@ ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** diff --git a/src/nfc/doc/src/examples.qdoc b/src/nfc/doc/src/examples.qdoc index 9bdbd880..7216c03c 100644 --- a/src/nfc/doc/src/examples.qdoc +++ b/src/nfc/doc/src/examples.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/nfc/doc/src/nfc-cpp.qdoc b/src/nfc/doc/src/nfc-cpp.qdoc index cbb07e0c..f007dcf3 100644 --- a/src/nfc/doc/src/nfc-cpp.qdoc +++ b/src/nfc/doc/src/nfc-cpp.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/nfc/doc/src/nfc-index.qdoc b/src/nfc/doc/src/nfc-index.qdoc index cc665e2c..47c158d9 100644 --- a/src/nfc/doc/src/nfc-index.qdoc +++ b/src/nfc/doc/src/nfc-index.qdoc @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -11,15 +11,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/nfc/doc/src/nfc-overview.qdoc b/src/nfc/doc/src/nfc-overview.qdoc index f068201c..ac511471 100644 --- a/src/nfc/doc/src/nfc-overview.qdoc +++ b/src/nfc/doc/src/nfc-overview.qdoc @@ -1,8 +1,8 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -11,15 +11,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/nfc/doc/src/nfc-qml.qdoc b/src/nfc/doc/src/nfc-qml.qdoc index 42e57159..3f96b39a 100644 --- a/src/nfc/doc/src/nfc-qml.qdoc +++ b/src/nfc/doc/src/nfc-qml.qdoc @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** @@ -10,15 +10,15 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 Free Documentation License Usage ** Alternatively, this file may be used under the terms of the GNU Free ** Documentation License version 1.3 as published by the Free Software ** Foundation and appearing in the file included in the packaging of -** this file. Please review the following information to ensure +** this file. Please review the following information to ensure ** the GNU Free Documentation License version 1.3 requirements ** will be met: http://www.gnu.org/copyleft/fdl.html. ** $QT_END_LICENSE$ diff --git a/src/nfc/neard/adapter.cpp b/src/nfc/neard/adapter.cpp index 4663db42..d626678a 100644 --- a/src/nfc/neard/adapter.cpp +++ b/src/nfc/neard/adapter.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/adapter_p.h b/src/nfc/neard/adapter_p.h index 4e0d2771..76817705 100644 --- a/src/nfc/neard/adapter_p.h +++ b/src/nfc/neard/adapter_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Adapter.xml -p adapter_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/neard/agent.cpp b/src/nfc/neard/agent.cpp index f969d8d3..faa48043 100644 --- a/src/nfc/neard/agent.cpp +++ b/src/nfc/neard/agent.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Agent.xml -p agent_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/agent_p.h b/src/nfc/neard/agent_p.h index 9f5199aa..7e40ffaf 100644 --- a/src/nfc/neard/agent_p.h +++ b/src/nfc/neard/agent_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Agent.xml -p agent_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/neard/dbusobjectmanager.cpp b/src/nfc/neard/dbusobjectmanager.cpp index 4f17db05..7b3f8356 100644 --- a/src/nfc/neard/dbusobjectmanager.cpp +++ b/src/nfc/neard/dbusobjectmanager.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v dbus-object-manager.xml -p dbusobjectmanager -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/dbusobjectmanager_p.h b/src/nfc/neard/dbusobjectmanager_p.h index b61a438f..64d11449 100644 --- a/src/nfc/neard/dbusobjectmanager_p.h +++ b/src/nfc/neard/dbusobjectmanager_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v -i neard_helper_p.h org.freedesktop.dbus.objectmanager.xml -p dbusobjectmanager_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/neard/dbusproperties.cpp b/src/nfc/neard/dbusproperties.cpp index 4ec3226b..554b83d6 100644 --- a/src/nfc/neard/dbusproperties.cpp +++ b/src/nfc/neard/dbusproperties.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v dbus-properties.xml -p dbusproperties -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/dbusproperties_p.h b/src/nfc/neard/dbusproperties_p.h index dbc13fa5..ebca6278 100644 --- a/src/nfc/neard/dbusproperties_p.h +++ b/src/nfc/neard/dbusproperties_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.freedesktop.dbus.properties.xml -p dbusproperties_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/neard/manager.cpp b/src/nfc/neard/manager.cpp index 176e09e4..e1d72c6e 100644 --- a/src/nfc/neard/manager.cpp +++ b/src/nfc/neard/manager.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/manager_p.h b/src/nfc/neard/manager_p.h index 313f47f4..921c177b 100644 --- a/src/nfc/neard/manager_p.h +++ b/src/nfc/neard/manager_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Manager.xml -p manager_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/neard/neard_helper.cpp b/src/nfc/neard/neard_helper.cpp index a04e97bc..9e197d75 100644 --- a/src/nfc/neard/neard_helper.cpp +++ b/src/nfc/neard/neard_helper.cpp @@ -1,41 +1,33 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2014 BasysKom GmbH. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/neard/neard_helper_p.h b/src/nfc/neard/neard_helper_p.h index 0c8c1d21..274c5142 100644 --- a/src/nfc/neard/neard_helper_p.h +++ b/src/nfc/neard/neard_helper_p.h @@ -1,41 +1,33 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2014 BasysKom GmbH. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/neard/tag.cpp b/src/nfc/neard/tag.cpp index 7e34e110..918f7f2d 100644 --- a/src/nfc/neard/tag.cpp +++ b/src/nfc/neard/tag.cpp @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments diff --git a/src/nfc/neard/tag_p.h b/src/nfc/neard/tag_p.h index 07cce10d..c9a3aad3 100644 --- a/src/nfc/neard/tag_p.h +++ b/src/nfc/neard/tag_p.h @@ -2,7 +2,7 @@ * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -v org.neard.Tag.xml -p tag_p -v * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. diff --git a/src/nfc/qllcpserver.cpp b/src/nfc/qllcpserver.cpp index c29295a5..4ee26eaf 100644 --- a/src/nfc/qllcpserver.cpp +++ b/src/nfc/qllcpserver.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_p.cpp b/src/nfc/qllcpserver_p.cpp index f7eca859..517dabea 100644 --- a/src/nfc/qllcpserver_p.cpp +++ b/src/nfc/qllcpserver_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_p.h b/src/nfc/qllcpserver_p.h index f7be4e35..83e7aa33 100644 --- a/src/nfc/qllcpserver_p.h +++ b/src/nfc/qllcpserver_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_p_p.h b/src/nfc/qllcpserver_p_p.h index fb95bea5..f101683c 100644 --- a/src/nfc/qllcpserver_p_p.h +++ b/src/nfc/qllcpserver_p_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_qnx_p.cpp b/src/nfc/qllcpserver_qnx_p.cpp index 9351d505..41168798 100644 --- a/src/nfc/qllcpserver_qnx_p.cpp +++ b/src/nfc/qllcpserver_qnx_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_qnx_p.h b/src/nfc/qllcpserver_qnx_p.h index 005d23d3..16e33784 100644 --- a/src/nfc/qllcpserver_qnx_p.h +++ b/src/nfc/qllcpserver_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_simulator_p.cpp b/src/nfc/qllcpserver_simulator_p.cpp index 53b92689..dea275e7 100644 --- a/src/nfc/qllcpserver_simulator_p.cpp +++ b/src/nfc/qllcpserver_simulator_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpserver_simulator_p.h b/src/nfc/qllcpserver_simulator_p.h index 6381d403..938789dd 100644 --- a/src/nfc/qllcpserver_simulator_p.h +++ b/src/nfc/qllcpserver_simulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket.cpp b/src/nfc/qllcpsocket.cpp index 1e701e67..ae23f89c 100644 --- a/src/nfc/qllcpsocket.cpp +++ b/src/nfc/qllcpsocket.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_p.cpp b/src/nfc/qllcpsocket_p.cpp index 700b97f0..83a789df 100644 --- a/src/nfc/qllcpsocket_p.cpp +++ b/src/nfc/qllcpsocket_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_p.h b/src/nfc/qllcpsocket_p.h index 4b74e203..db49b4c0 100644 --- a/src/nfc/qllcpsocket_p.h +++ b/src/nfc/qllcpsocket_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_p_p.h b/src/nfc/qllcpsocket_p_p.h index 7d10278d..93c6a679 100644 --- a/src/nfc/qllcpsocket_p_p.h +++ b/src/nfc/qllcpsocket_p_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_qnx_p.cpp b/src/nfc/qllcpsocket_qnx_p.cpp index c35f570c..2351a524 100644 --- a/src/nfc/qllcpsocket_qnx_p.cpp +++ b/src/nfc/qllcpsocket_qnx_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_qnx_p.h b/src/nfc/qllcpsocket_qnx_p.h index de552eb3..5e3b2c06 100644 --- a/src/nfc/qllcpsocket_qnx_p.h +++ b/src/nfc/qllcpsocket_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_simulator_p.cpp b/src/nfc/qllcpsocket_simulator_p.cpp index d418d654..f6f40ef7 100644 --- a/src/nfc/qllcpsocket_simulator_p.cpp +++ b/src/nfc/qllcpsocket_simulator_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qllcpsocket_simulator_p.h b/src/nfc/qllcpsocket_simulator_p.h index 76af2f01..74e55199 100644 --- a/src/nfc/qllcpsocket_simulator_p.h +++ b/src/nfc/qllcpsocket_simulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndeffilter.cpp b/src/nfc/qndeffilter.cpp index 07408729..916fa25a 100644 --- a/src/nfc/qndeffilter.cpp +++ b/src/nfc/qndeffilter.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndeffilter.h b/src/nfc/qndeffilter.h index 053dfe21..56721bf1 100644 --- a/src/nfc/qndeffilter.h +++ b/src/nfc/qndeffilter.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefmessage.cpp b/src/nfc/qndefmessage.cpp index 9d5da089..356d35f5 100644 --- a/src/nfc/qndefmessage.cpp +++ b/src/nfc/qndefmessage.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefmessage.h b/src/nfc/qndefmessage.h index 1aca198c..1ecb04a0 100644 --- a/src/nfc/qndefmessage.h +++ b/src/nfc/qndefmessage.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfcsmartposterrecord.cpp b/src/nfc/qndefnfcsmartposterrecord.cpp index 9c6d756b..9bec5b7a 100644 --- a/src/nfc/qndefnfcsmartposterrecord.cpp +++ b/src/nfc/qndefnfcsmartposterrecord.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2011 - 2012 Research In Motion - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfcsmartposterrecord.h b/src/nfc/qndefnfcsmartposterrecord.h index 0b2d3b7e..d02cdabb 100644 --- a/src/nfc/qndefnfcsmartposterrecord.h +++ b/src/nfc/qndefnfcsmartposterrecord.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2011 - 2012 Research In Motion - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfcsmartposterrecord_p.h b/src/nfc/qndefnfcsmartposterrecord_p.h index 093a4253..a70d96cd 100644 --- a/src/nfc/qndefnfcsmartposterrecord_p.h +++ b/src/nfc/qndefnfcsmartposterrecord_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2011 - 2012 Research In Motion - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfctextrecord.cpp b/src/nfc/qndefnfctextrecord.cpp index c06208a1..b54fd794 100644 --- a/src/nfc/qndefnfctextrecord.cpp +++ b/src/nfc/qndefnfctextrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfctextrecord.h b/src/nfc/qndefnfctextrecord.h index 05a85949..e2f06917 100644 --- a/src/nfc/qndefnfctextrecord.h +++ b/src/nfc/qndefnfctextrecord.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfcurirecord.cpp b/src/nfc/qndefnfcurirecord.cpp index dabd2dae..d38e72d9 100644 --- a/src/nfc/qndefnfcurirecord.cpp +++ b/src/nfc/qndefnfcurirecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefnfcurirecord.h b/src/nfc/qndefnfcurirecord.h index 38686544..49f9e0bf 100644 --- a/src/nfc/qndefnfcurirecord.h +++ b/src/nfc/qndefnfcurirecord.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefrecord.cpp b/src/nfc/qndefrecord.cpp index 8961e9d7..167b7617 100644 --- a/src/nfc/qndefrecord.cpp +++ b/src/nfc/qndefrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefrecord.h b/src/nfc/qndefrecord.h index 8c61d8c2..84303267 100644 --- a/src/nfc/qndefrecord.h +++ b/src/nfc/qndefrecord.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qndefrecord_p.h b/src/nfc/qndefrecord_p.h index 04e9c72c..40311ee0 100644 --- a/src/nfc/qndefrecord_p.h +++ b/src/nfc/qndefrecord_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 7aaf0878..dce1a9f3 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h index 7fad3b4d..8dab134f 100644 --- a/src/nfc/qnearfieldmanager.h +++ b/src/nfc/qnearfieldmanager.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_emulator.cpp b/src/nfc/qnearfieldmanager_emulator.cpp index c532fea1..f1e33649 100644 --- a/src/nfc/qnearfieldmanager_emulator.cpp +++ b/src/nfc/qnearfieldmanager_emulator.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_emulator_p.h b/src/nfc/qnearfieldmanager_emulator_p.h index b69bf8a9..0fd980f9 100644 --- a/src/nfc/qnearfieldmanager_emulator_p.h +++ b/src/nfc/qnearfieldmanager_emulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index 65cf0ee3..389d701e 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -2,40 +2,32 @@ ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. ** Copyright (C) 2014 BasysKom GmbH. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index 8df4149b..856851d4 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -2,40 +2,32 @@ ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. ** Copyright (C) 2014 BasysKom GmbH. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h index 97b2899c..e8e4788c 100644 --- a/src/nfc/qnearfieldmanager_p.h +++ b/src/nfc/qnearfieldmanager_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_qnx.cpp b/src/nfc/qnearfieldmanager_qnx.cpp index 6e3b0eb9..7ed79f84 100644 --- a/src/nfc/qnearfieldmanager_qnx.cpp +++ b/src/nfc/qnearfieldmanager_qnx.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_qnx_p.h b/src/nfc/qnearfieldmanager_qnx_p.h index 5d78ece6..6f00041a 100644 --- a/src/nfc/qnearfieldmanager_qnx_p.h +++ b/src/nfc/qnearfieldmanager_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_simulator.cpp b/src/nfc/qnearfieldmanager_simulator.cpp index 63574de8..a304e6d3 100644 --- a/src/nfc/qnearfieldmanager_simulator.cpp +++ b/src/nfc/qnearfieldmanager_simulator.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanager_simulator_p.h b/src/nfc/qnearfieldmanager_simulator_p.h index 63ef977d..dca19982 100644 --- a/src/nfc/qnearfieldmanager_simulator_p.h +++ b/src/nfc/qnearfieldmanager_simulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanagerimpl_p.cpp b/src/nfc/qnearfieldmanagerimpl_p.cpp index 915f4372..58135179 100644 --- a/src/nfc/qnearfieldmanagerimpl_p.cpp +++ b/src/nfc/qnearfieldmanagerimpl_p.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanagerimpl_p.h b/src/nfc/qnearfieldmanagerimpl_p.h index 13fbd4ff..4009ed5d 100644 --- a/src/nfc/qnearfieldmanagerimpl_p.h +++ b/src/nfc/qnearfieldmanagerimpl_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanagervirtualbase.cpp b/src/nfc/qnearfieldmanagervirtualbase.cpp index 5bd0dfa7..cf25ed2b 100644 --- a/src/nfc/qnearfieldmanagervirtualbase.cpp +++ b/src/nfc/qnearfieldmanagervirtualbase.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldmanagervirtualbase_p.h b/src/nfc/qnearfieldmanagervirtualbase_p.h index 52bb19f0..5af376f7 100644 --- a/src/nfc/qnearfieldmanagervirtualbase_p.h +++ b/src/nfc/qnearfieldmanagervirtualbase_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanager.cpp b/src/nfc/qnearfieldsharemanager.cpp index a5303e4e..e9b70739 100644 --- a/src/nfc/qnearfieldsharemanager.cpp +++ b/src/nfc/qnearfieldsharemanager.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanager.h b/src/nfc/qnearfieldsharemanager.h index 550858f1..330cc621 100644 --- a/src/nfc/qnearfieldsharemanager.h +++ b/src/nfc/qnearfieldsharemanager.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanager_p.h b/src/nfc/qnearfieldsharemanager_p.h index f9f5c90b..034e9381 100644 --- a/src/nfc/qnearfieldsharemanager_p.h +++ b/src/nfc/qnearfieldsharemanager_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanager_qnx_p.cpp b/src/nfc/qnearfieldsharemanager_qnx_p.cpp index 04e6a1a7..dd2814d6 100644 --- a/src/nfc/qnearfieldsharemanager_qnx_p.cpp +++ b/src/nfc/qnearfieldsharemanager_qnx_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanager_qnx_p.h b/src/nfc/qnearfieldsharemanager_qnx_p.h index 9478bbdb..c5cea224 100644 --- a/src/nfc/qnearfieldsharemanager_qnx_p.h +++ b/src/nfc/qnearfieldsharemanager_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanagerimpl_p.cpp b/src/nfc/qnearfieldsharemanagerimpl_p.cpp index 2cf8ead5..e99611f2 100644 --- a/src/nfc/qnearfieldsharemanagerimpl_p.cpp +++ b/src/nfc/qnearfieldsharemanagerimpl_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharemanagerimpl_p.h b/src/nfc/qnearfieldsharemanagerimpl_p.h index dd350834..46ee2014 100644 --- a/src/nfc/qnearfieldsharemanagerimpl_p.h +++ b/src/nfc/qnearfieldsharemanagerimpl_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetarget.cpp b/src/nfc/qnearfieldsharetarget.cpp index 9f58b6ef..86c6318e 100644 --- a/src/nfc/qnearfieldsharetarget.cpp +++ b/src/nfc/qnearfieldsharetarget.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetarget.h b/src/nfc/qnearfieldsharetarget.h index 41d6880d..596230d1 100644 --- a/src/nfc/qnearfieldsharetarget.h +++ b/src/nfc/qnearfieldsharetarget.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetarget_p.h b/src/nfc/qnearfieldsharetarget_p.h index aa28ee2b..ab0cf8a2 100644 --- a/src/nfc/qnearfieldsharetarget_p.h +++ b/src/nfc/qnearfieldsharetarget_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetarget_qnx_p.cpp b/src/nfc/qnearfieldsharetarget_qnx_p.cpp index a68f7a4f..6dfea8d2 100644 --- a/src/nfc/qnearfieldsharetarget_qnx_p.cpp +++ b/src/nfc/qnearfieldsharetarget_qnx_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetarget_qnx_p.h b/src/nfc/qnearfieldsharetarget_qnx_p.h index 3afd6adb..626d2cc1 100644 --- a/src/nfc/qnearfieldsharetarget_qnx_p.h +++ b/src/nfc/qnearfieldsharetarget_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetargetimpl_p.cpp b/src/nfc/qnearfieldsharetargetimpl_p.cpp index f346f70e..6dbe12a0 100644 --- a/src/nfc/qnearfieldsharetargetimpl_p.cpp +++ b/src/nfc/qnearfieldsharetargetimpl_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldsharetargetimpl_p.h b/src/nfc/qnearfieldsharetargetimpl_p.h index 5eddf0eb..74552a3e 100644 --- a/src/nfc/qnearfieldsharetargetimpl_p.h +++ b/src/nfc/qnearfieldsharetargetimpl_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype1.cpp b/src/nfc/qnearfieldtagtype1.cpp index ce1af1c7..cbd1c1a6 100644 --- a/src/nfc/qnearfieldtagtype1.cpp +++ b/src/nfc/qnearfieldtagtype1.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype1_p.h b/src/nfc/qnearfieldtagtype1_p.h index 0825fc86..efc757a0 100644 --- a/src/nfc/qnearfieldtagtype1_p.h +++ b/src/nfc/qnearfieldtagtype1_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype2.cpp b/src/nfc/qnearfieldtagtype2.cpp index d323ace6..243d03e9 100644 --- a/src/nfc/qnearfieldtagtype2.cpp +++ b/src/nfc/qnearfieldtagtype2.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype2_p.h b/src/nfc/qnearfieldtagtype2_p.h index de02b75b..8ce5849c 100644 --- a/src/nfc/qnearfieldtagtype2_p.h +++ b/src/nfc/qnearfieldtagtype2_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype3.cpp b/src/nfc/qnearfieldtagtype3.cpp index df48823e..fa8fb21a 100644 --- a/src/nfc/qnearfieldtagtype3.cpp +++ b/src/nfc/qnearfieldtagtype3.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype3_p.h b/src/nfc/qnearfieldtagtype3_p.h index df2eb079..40d83db1 100644 --- a/src/nfc/qnearfieldtagtype3_p.h +++ b/src/nfc/qnearfieldtagtype3_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype4.cpp b/src/nfc/qnearfieldtagtype4.cpp index 2b111216..32c884bf 100644 --- a/src/nfc/qnearfieldtagtype4.cpp +++ b/src/nfc/qnearfieldtagtype4.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtagtype4_p.h b/src/nfc/qnearfieldtagtype4_p.h index 22b79056..b0d7d8a5 100644 --- a/src/nfc/qnearfieldtagtype4_p.h +++ b/src/nfc/qnearfieldtagtype4_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp index 6374c8fb..0d57e5f3 100644 --- a/src/nfc/qnearfieldtarget.cpp +++ b/src/nfc/qnearfieldtarget.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget.h b/src/nfc/qnearfieldtarget.h index f3c1292b..10c89a87 100644 --- a/src/nfc/qnearfieldtarget.h +++ b/src/nfc/qnearfieldtarget.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget_emulator.cpp b/src/nfc/qnearfieldtarget_emulator.cpp index a483fe4b..619028ef 100644 --- a/src/nfc/qnearfieldtarget_emulator.cpp +++ b/src/nfc/qnearfieldtarget_emulator.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget_emulator_p.h b/src/nfc/qnearfieldtarget_emulator_p.h index aba30b60..075972fe 100644 --- a/src/nfc/qnearfieldtarget_emulator_p.h +++ b/src/nfc/qnearfieldtarget_emulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 26a699a2..ff7c3f1d 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -2,40 +2,32 @@ ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. ** Copyright (C) 2014 BasysKom GmbH. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/qnearfieldtarget_p.h b/src/nfc/qnearfieldtarget_p.h index 48b4a943..021f6fe8 100644 --- a/src/nfc/qnearfieldtarget_p.h +++ b/src/nfc/qnearfieldtarget_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnearfieldtarget_qnx_p.h b/src/nfc/qnearfieldtarget_qnx_p.h index 239153be..eb785d81 100644 --- a/src/nfc/qnearfieldtarget_qnx_p.h +++ b/src/nfc/qnearfieldtarget_qnx_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnfc.cpp b/src/nfc/qnfc.cpp index 30c363c4..4862461c 100644 --- a/src/nfc/qnfc.cpp +++ b/src/nfc/qnfc.cpp @@ -1,40 +1,32 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 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 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/src/nfc/qnfcglobal.h b/src/nfc/qnfcglobal.h index 4b975c36..26916a94 100644 --- a/src/nfc/qnfcglobal.h +++ b/src/nfc/qnfcglobal.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfceventfilter.cpp b/src/nfc/qnx/qnxnfceventfilter.cpp index 25af8f64..f3d3749a 100644 --- a/src/nfc/qnx/qnxnfceventfilter.cpp +++ b/src/nfc/qnx/qnxnfceventfilter.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfceventfilter_p.h b/src/nfc/qnx/qnxnfceventfilter_p.h index 4349ea71..c8a7a9ea 100644 --- a/src/nfc/qnx/qnxnfceventfilter_p.h +++ b/src/nfc/qnx/qnxnfceventfilter_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfcmanager.cpp b/src/nfc/qnx/qnxnfcmanager.cpp index de0d65dd..3db11158 100644 --- a/src/nfc/qnx/qnxnfcmanager.cpp +++ b/src/nfc/qnx/qnxnfcmanager.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfcmanager_p.h b/src/nfc/qnx/qnxnfcmanager_p.h index 4253ba1a..17425198 100644 --- a/src/nfc/qnx/qnxnfcmanager_p.h +++ b/src/nfc/qnx/qnxnfcmanager_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2012 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfcsharemanager_p.cpp b/src/nfc/qnx/qnxnfcsharemanager_p.cpp index 9ceed65e..ea6aeb13 100644 --- a/src/nfc/qnx/qnxnfcsharemanager_p.cpp +++ b/src/nfc/qnx/qnxnfcsharemanager_p.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qnx/qnxnfcsharemanager_p.h b/src/nfc/qnx/qnxnfcsharemanager_p.h index 7b70eca6..d6774c41 100644 --- a/src/nfc/qnx/qnxnfcsharemanager_p.h +++ b/src/nfc/qnx/qnxnfcsharemanager_p.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. - ** Contact: http://www.qt-project.org/legal + ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and - ** conditions see http://qt.digia.com/licensing. For further information - ** use the contact form at http://qt.digia.com/contact-us. + ** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** - ** In addition, as a special exception, Digia gives you certain additional - ** rights. These rights are described in the Digia Qt LGPL Exception + ** As a special exception, The Qt Company gives you certain additional + ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qqmlndefrecord.cpp b/src/nfc/qqmlndefrecord.cpp index 2db40a4f..280d03a2 100644 --- a/src/nfc/qqmlndefrecord.cpp +++ b/src/nfc/qqmlndefrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qqmlndefrecord.h b/src/nfc/qqmlndefrecord.h index 7c282e77..71cd5513 100644 --- a/src/nfc/qqmlndefrecord.h +++ b/src/nfc/qqmlndefrecord.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qtlv.cpp b/src/nfc/qtlv.cpp index 14624e5b..b935e4fe 100644 --- a/src/nfc/qtlv.cpp +++ b/src/nfc/qtlv.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/qtlv_p.h b/src/nfc/qtlv_p.h index 082c4e77..14a6dd03 100644 --- a/src/nfc/qtlv_p.h +++ b/src/nfc/qtlv_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/targetemulator.cpp b/src/nfc/targetemulator.cpp index 61370bf1..1fb72b4b 100644 --- a/src/nfc/targetemulator.cpp +++ b/src/nfc/targetemulator.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/nfc/targetemulator_p.h b/src/nfc/targetemulator_p.h index cfeb5413..30ec37ae 100644 --- a/src/nfc/targetemulator_p.h +++ b/src/nfc/targetemulator_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/src/tools/sdpscanner/main.cpp b/src/tools/sdpscanner/main.cpp index 5f2fd976..35c08e0c 100644 --- a/src/tools/sdpscanner/main.cpp +++ b/src/tools/sdpscanner/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp b/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp index 171726b8..c153f7d4 100644 --- a/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp +++ b/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp index 89c2805c..f4ddd8aa 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp +++ b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp index 18698afd..faa0ed39 100644 --- a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp +++ b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp b/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp index fea6bad3..6b86ee10 100644 --- a/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp +++ b/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp index b2e43068..c3456524 100644 --- a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp +++ b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp index fca02b28..ef460289 100644 --- a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp +++ b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp index b0c97d07..280dd893 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp +++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp index 011b0e5f..83cd0b3d 100644 --- a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp +++ b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp index d7a35b1b..eafa3e80 100644 --- a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp +++ b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp index b3271a5d..932d5d1a 100644 --- a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp +++ b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp b/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp index a06e6ab3..e675f0dd 100644 --- a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp +++ b/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp index 6743d38c..3be51834 100644 --- a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp +++ b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp index 8b720f62..ffed9f6f 100644 --- a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp +++ b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited all rights reserved -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 8f5db8ab..33417a7f 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp index a0960c57..0034c221 100644 --- a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp +++ b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp @@ -1,8 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited all rights reserved -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -11,9 +11,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -24,8 +24,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qndefmessage/tst_qndefmessage.cpp b/tests/auto/qndefmessage/tst_qndefmessage.cpp index c697a5e5..4c260922 100644 --- a/tests/auto/qndefmessage/tst_qndefmessage.cpp +++ b/tests/auto/qndefmessage/tst_qndefmessage.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp b/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp index f5b51710..c5945ca9 100644 --- a/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp +++ b/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Research In Motion -** Contact: http://www.qt-project.org/legal +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qndefrecord/tst_qndefrecord.cpp b/tests/auto/qndefrecord/tst_qndefrecord.cpp index 5e776423..88473667 100644 --- a/tests/auto/qndefrecord/tst_qndefrecord.cpp +++ b/tests/auto/qndefrecord/tst_qndefrecord.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp index 8f3009ad..d043cbf8 100644 --- a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp +++ b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp index a36fdffb..12969bc1 100644 --- a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp +++ b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp index 510be44f..1871c205 100644 --- a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp +++ b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/bttestui/Button.qml b/tests/bttestui/Button.qml index 03903fd0..e3b0106d 100644 --- a/tests/bttestui/Button.qml +++ b/tests/bttestui/Button.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/bttestui/btlocaldevice.cpp b/tests/bttestui/btlocaldevice.cpp index fcc0494a..fbb1e59d 100644 --- a/tests/bttestui/btlocaldevice.cpp +++ b/tests/bttestui/btlocaldevice.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/bttestui/btlocaldevice.h b/tests/bttestui/btlocaldevice.h index 5112d142..f3f519ca 100644 --- a/tests/bttestui/btlocaldevice.h +++ b/tests/bttestui/btlocaldevice.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/bttestui/main.cpp b/tests/bttestui/main.cpp index 6543bd7b..a5d8a3bf 100644 --- a/tests/bttestui/main.cpp +++ b/tests/bttestui/main.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ diff --git a/tests/bttestui/main.qml b/tests/bttestui/main.qml index caae54fa..ddf55d02 100644 --- a/tests/bttestui/main.qml +++ b/tests/bttestui/main.qml @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** 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 @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ -- cgit v1.2.3 From aa7ffcce0d24321b96504bc15e80898712617e1b Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 11 Feb 2015 18:56:45 +0100 Subject: bic: Add 5.{2,3,4}.0 bic data for QtBluetooth and QtNfc Change-Id: I0b98c18e0943b250debcf6e5461ddb19fba024ab Reviewed-by: Liang Qi Reviewed-by: Alex Blasche --- .../bic/data/QtBluetooth.5.2.0.linux-gcc-amd64.txt | 3931 +++++++++++++++++++ .../bic/data/QtBluetooth.5.3.0.linux-gcc-amd64.txt | 3942 +++++++++++++++++++ .../bic/data/QtBluetooth.5.4.0.linux-gcc-amd64.txt | 4046 ++++++++++++++++++++ .../auto/bic/data/QtNfc.5.2.0.linux-gcc-amd64.txt | 3743 ++++++++++++++++++ .../auto/bic/data/QtNfc.5.3.0.linux-gcc-amd64.txt | 3814 ++++++++++++++++++ .../auto/bic/data/QtNfc.5.4.0.linux-gcc-amd64.txt | 3847 +++++++++++++++++++ tests/global/.gitignore | 2 + tests/global/global.cfg | 6 + 8 files changed, 23331 insertions(+) create mode 100644 tests/auto/bic/data/QtBluetooth.5.2.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtBluetooth.5.3.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtBluetooth.5.4.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtNfc.5.2.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtNfc.5.3.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtNfc.5.4.0.linux-gcc-amd64.txt create mode 100644 tests/global/.gitignore create mode 100644 tests/global/global.cfg diff --git a/tests/auto/bic/data/QtBluetooth.5.2.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.2.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..be0a7dc0 --- /dev/null +++ b/tests/auto/bic/data/QtBluetooth.5.2.0.linux-gcc-amd64.txt @@ -0,0 +1,3931 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fd1f95e4060) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fd1f95e40c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fd1f9625c60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fd1f9625cc0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fd1f95b1548) 0 empty + std::input_iterator_tag (0x0x7fd1f9625d20) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fd1f95b15b0) 0 empty + std::forward_iterator_tag (0x0x7fd1f95b1618) 0 empty + std::input_iterator_tag (0x0x7fd1f9625d80) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fd1f95b1680) 0 empty + std::bidirectional_iterator_tag (0x0x7fd1f95b16e8) 0 empty + std::forward_iterator_tag (0x0x7fd1f95b1750) 0 empty + std::input_iterator_tag (0x0x7fd1f9625de0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7fd1f9658960) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fd1f9658ba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fd1f9658c60) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fd1f9658cc0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fd1f9658d80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fd1f9658de0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fd1f97402a0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fd1f9740300) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fd1f9740360) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fd1f95b1a90) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7fd1f97403c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7fd1f95b1a90) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fd1f95b1af8) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7fd1f9740420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fd1f95b1af8) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fd1f9740480) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7fd1f85387e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7fd1f8538840) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fd1f81da548) 0 + QBasicAtomicInteger (0x0x7fd1f823a4e0) 0 + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fd1f823a6c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fd1f823a720) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7fd1f7f81180) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fd1f7fced80) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fd1f7fcee40) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fd1f7fcef60) 0 empty + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fd1f8094e40) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fd1f7e2ed80) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fd1f80aad68) 0 + QGenericArgument (0x0x7fd1f7e2ede0) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fd1f7e2ef60) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fd1f7ea10c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fd1f7ea1300) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fd1f7ea1360) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fd1f7ea1420) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fd1f7ea1480) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fd1f7ea17e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fd1f7ea1840) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fd1f7ea19c0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fd1f7ea1d80) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fd1f7ea1de0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fd1f79838a0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7fd1f7983900) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fd1f79839c0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fd1f7983a20) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fd1f7983a80) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fd1f7983ae0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fd1f7983c00) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fd1f7983c60) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fd1f775e3c0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fd1f775e4e0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fd1f775e5a0) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fd1f775e540) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fd1f775e720) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fd1f775e900) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fd1f775ea80) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fd1f775eae0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fd1f775eb40) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fd1f775eba0) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7fd1f77343a8) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7fd1f7376000) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7fd1f77343a8) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fd1f7376060) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fd1f73760c0) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fd1f7376120) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fd1f775ef60) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fd1f73762a0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fd1f7376960) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7fd1f72da820 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7fd1f72dae38 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7fd1f6fee270 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7fd1f6fee340 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fd1f71b4d20) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fd1f70b3060) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fd1f70b3000) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fd1f70b3420) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fd1f6e1e240) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fd1f6feea28) 0 + std::iterator (0x0x7fd1f6e1e300) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fd1f6feea90) 0 + std::_Bit_iterator_base (0x0x7fd1f6feeaf8) 0 + std::iterator (0x0x7fd1f6e1e360) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fd1f6feeb60) 0 + std::_Bit_iterator_base (0x0x7fd1f6feebc8) 0 + std::iterator (0x0x7fd1f6e1e3c0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fd1f6e1e780) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fd1f6e1eba0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fd1f6e1ec60) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fd1f6e1ed20) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fd1f6cef180) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fd1f6cef4e0) 0 + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fd1f6cef900) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fd1f6cefae0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fd1f6cefba0) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fd1f6b09e40) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fd1f677a000) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fd1f677a180) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fd1f677a120) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fd1f677a480) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fd1f677a540) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fd1f676e3a8) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7fd1f677a4e0) 0 + primary-for QAbstractAnimation (0x0x7fd1f676e3a8) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fd1f677a600) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fd1f676e410) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7fd1f677a5a0) 0 + primary-for QAnimationDriver (0x0x7fd1f676e410) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fd1f677a6c0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fd1f676e478) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7fd1f676e4e0) 0 + primary-for QAnimationGroup (0x0x7fd1f676e478) + QObject (0x0x7fd1f677a660) 0 + primary-for QAbstractAnimation (0x0x7fd1f676e4e0) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fd1f677a780) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fd1f676e548) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7fd1f676e5b0) 0 + primary-for QParallelAnimationGroup (0x0x7fd1f676e548) + QAbstractAnimation (0x0x7fd1f676e618) 0 + primary-for QAnimationGroup (0x0x7fd1f676e5b0) + QObject (0x0x7fd1f677a720) 0 + primary-for QAbstractAnimation (0x0x7fd1f676e618) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fd1f677a840) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fd1f676e680) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7fd1f676e6e8) 0 + primary-for QPauseAnimation (0x0x7fd1f676e680) + QObject (0x0x7fd1f677a7e0) 0 + primary-for QAbstractAnimation (0x0x7fd1f676e6e8) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fd1f677aa20) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fd1f677aba0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fd1f677ac60) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fd1f6659000) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7fd1f677af60) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fd1f6659060) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fd1f66594e0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fd1f676ef08) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7fd1f6659480) 0 + primary-for QIODevice (0x0x7fd1f676ef08) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fd1f6659600) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fd1f66596c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fd1f66597e0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fd1f6659780) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fd1f63e4000) 0 + QList (0x0x7fd1f6659960) 0 + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fd1f6659c00) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fd1f6659cc0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fd1f6659c60) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fd1f6659d20) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fd1f6659ba0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fd1f64e7000) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fd1f64e70c0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fd1f64e7060) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fd1f64e7180) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fd1f64e7120) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fd1f64e7cc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fd1f63e4958) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7fd1f63e49c0) 0 + primary-for QVariantAnimation (0x0x7fd1f63e4958) + QObject (0x0x7fd1f64e7c60) 0 + primary-for QAbstractAnimation (0x0x7fd1f63e49c0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fd1f64e7d80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fd1f63e4a90) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7fd1f63e4af8) 0 + primary-for QPropertyAnimation (0x0x7fd1f63e4a90) + QAbstractAnimation (0x0x7fd1f63e4b60) 0 + primary-for QVariantAnimation (0x0x7fd1f63e4af8) + QObject (0x0x7fd1f64e7d20) 0 + primary-for QAbstractAnimation (0x0x7fd1f63e4b60) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fd1f64e7e40) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fd1f63e4bc8) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7fd1f63e4c30) 0 + primary-for QSequentialAnimationGroup (0x0x7fd1f63e4bc8) + QAbstractAnimation (0x0x7fd1f63e4c98) 0 + primary-for QAnimationGroup (0x0x7fd1f63e4c30) + QObject (0x0x7fd1f64e7de0) 0 + primary-for QAbstractAnimation (0x0x7fd1f63e4c98) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fd1f64e7f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fd1f64e7ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fd1f61b5060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fd1f61b50c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fd1f61b5120) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fd1f61b53c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fd1f61b5540) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fd1f61b59c0) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fd1f5f65180) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fd1f5f65240) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fd1f5f65300) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fd1f5f65420) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fd1f5f654e0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fd1f5ffa000) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7fd1f5ffa068) 0 + primary-for QBuffer (0x0x7fd1f5ffa000) + QObject (0x0x7fd1f5f65480) 0 + primary-for QIODevice (0x0x7fd1f5ffa068) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fd1f5f65540) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fd1f5f657e0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fd1f5f65840) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fd1f5f65900) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fd1f5f65ba0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fd1f5f65de0) 0 + +Class QDebug::Stream + size=72 align=8 + base size=72 base align=8 +QDebug::Stream (0x0x7fd1f5daa480) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fd1f5daa420) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fd1f5daa540) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fd1f5daa600) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fd1f5daa6c0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fd1f5ffa3a8) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7fd1f5ffa410) 0 + primary-for QFileDevice (0x0x7fd1f5ffa3a8) + QObject (0x0x7fd1f5daa660) 0 + primary-for QIODevice (0x0x7fd1f5ffa410) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fd1f5daa840) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fd1f5ffa548) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7fd1f5ffa5b0) 0 + primary-for QFile (0x0x7fd1f5ffa548) + QIODevice (0x0x7fd1f5ffa618) 0 + primary-for QFileDevice (0x0x7fd1f5ffa5b0) + QObject (0x0x7fd1f5daa7e0) 0 + primary-for QIODevice (0x0x7fd1f5ffa618) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fd1f5daa960) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fd1f5daaba0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fd1f5daae40) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fd1f5b63060) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fd1f5ffaa28) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7fd1f5b63000) 0 + primary-for QFileSelector (0x0x7fd1f5ffaa28) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fd1f5b63120) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fd1f5ffaa90) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7fd1f5b630c0) 0 + primary-for QFileSystemWatcher (0x0x7fd1f5ffaa90) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fd1f5b63180) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fd1f5b632a0) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fd1f5b63300) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fd1f5b63480) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fd1f5ffaaf8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7fd1f5ffab60) 0 + primary-for QProcess (0x0x7fd1f5ffaaf8) + QObject (0x0x7fd1f5b63420) 0 + primary-for QIODevice (0x0x7fd1f5ffab60) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fd1f5b634e0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fd1f5b63660) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fd1f5ffabc8) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7fd1f5ffac30) 0 + primary-for QSaveFile (0x0x7fd1f5ffabc8) + QIODevice (0x0x7fd1f5ffac98) 0 + primary-for QFileDevice (0x0x7fd1f5ffac30) + QObject (0x0x7fd1f5b63600) 0 + primary-for QIODevice (0x0x7fd1f5ffac98) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fd1f5b63720) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fd1f5ffad00) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7fd1f5b636c0) 0 + primary-for QSettings (0x0x7fd1f5ffad00) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fd1f5b63780) 0 empty + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fd1f5b638a0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fd1f5b639c0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fd1f5ffae38) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7fd1f5ffaea0) 0 + primary-for QTemporaryFile (0x0x7fd1f5ffae38) + QFileDevice (0x0x7fd1f5ffaf08) 0 + primary-for QFile (0x0x7fd1f5ffaea0) + QIODevice (0x0x7fd1f5ffaf70) 0 + primary-for QFileDevice (0x0x7fd1f5ffaf08) + QObject (0x0x7fd1f5b63960) 0 + primary-for QIODevice (0x0x7fd1f5ffaf70) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fd1f5b63ae0) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fd1f5b63ea0) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fd1f5d24000) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fd1f5d240c0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fd1f5d241e0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fd1f5ca61a0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7fd1f5d24180) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca61a0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fd1f5d244e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fd1f5ca62d8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7fd1f5ca6340) 0 + primary-for QAbstractTableModel (0x0x7fd1f5ca62d8) + QObject (0x0x7fd1f5d24480) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca6340) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fd1f5d245a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fd1f5ca63a8) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7fd1f5ca6410) 0 + primary-for QAbstractListModel (0x0x7fd1f5ca63a8) + QObject (0x0x7fd1f5d24540) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca6410) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fd1f5d24660) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fd1f5ca6478) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7fd1f5ca64e0) 0 + primary-for QAbstractProxyModel (0x0x7fd1f5ca6478) + QObject (0x0x7fd1f5d24600) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca64e0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fd1f5d24720) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fd1f5ca6548) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7fd1f5ca65b0) 0 + primary-for QIdentityProxyModel (0x0x7fd1f5ca6548) + QAbstractItemModel (0x0x7fd1f5ca6618) 0 + primary-for QAbstractProxyModel (0x0x7fd1f5ca65b0) + QObject (0x0x7fd1f5d246c0) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca6618) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fd1f5d24780) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fd1f5d248a0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fd1f5ca6680) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7fd1f5d24840) 0 + primary-for QItemSelectionModel (0x0x7fd1f5ca6680) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fd1f5ca67b8) 0 + QList (0x0x7fd1f5d24a80) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fd1f5d24b40) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fd1f5ca6820) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7fd1f5ca6888) 0 + primary-for QSortFilterProxyModel (0x0x7fd1f5ca6820) + QAbstractItemModel (0x0x7fd1f5ca68f0) 0 + primary-for QAbstractProxyModel (0x0x7fd1f5ca6888) + QObject (0x0x7fd1f5d24ae0) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca68f0) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fd1f5d24c00) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fd1f5ca6958) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7fd1f5ca69c0) 0 + primary-for QStringListModel (0x0x7fd1f5ca6958) + QAbstractItemModel (0x0x7fd1f5ca6a28) 0 + primary-for QAbstractListModel (0x0x7fd1f5ca69c0) + QObject (0x0x7fd1f5d24ba0) 0 + primary-for QAbstractItemModel (0x0x7fd1f5ca6a28) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fd1f5d24c60) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fd1f5d24d20) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fd1f5d24e40) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fd1f5d24ea0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fd1f5d24de0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fd1f5d24f00) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fd1f5d24f60) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fd1f57a1060) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fd1f57a10c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fd1f57a1000) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fd1f57a11e0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fd1f5ca6a90) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7fd1f57a1180) 0 + primary-for QEventLoop (0x0x7fd1f5ca6a90) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fd1f57a1300) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fd1f57a13c0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fd1f57a1420) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fd1f5ca6bc8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7fd1f57a1360) 0 + primary-for QAbstractEventDispatcher (0x0x7fd1f5ca6bc8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fd1f57a1480) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fd1f57a14e0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fd1f57a15a0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fd1f5ca6c30) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7fd1f57a1600) 0 + primary-for QTimerEvent (0x0x7fd1f5ca6c30) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fd1f5ca6c98) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7fd1f57a1660) 0 + primary-for QChildEvent (0x0x7fd1f5ca6c98) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fd1f5ca6d00) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7fd1f57a16c0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fd1f5ca6d00) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fd1f5ca6d68) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7fd1f57a1720) 0 + primary-for QDeferredDeleteEvent (0x0x7fd1f5ca6d68) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fd1f57a17e0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fd1f5ca6dd0) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7fd1f57a1780) 0 + primary-for QCoreApplication (0x0x7fd1f5ca6dd0) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7fd1f57a1840) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fd1f57a18a0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fd1f57a1960) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fd1f57a1a20) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fd1f57a1a80) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fd1f57a1ba0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fd1f5ca6f08) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7fd1f57a1b40) 0 + primary-for QMimeData (0x0x7fd1f5ca6f08) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fd1f57a1c60) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fd1f5ca6f70) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7fd1f57a1c00) 0 + primary-for QObjectCleanupHandler (0x0x7fd1f5ca6f70) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fd1f57a1ea0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fd1f5954000) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7fd1f57a1e40) 0 + primary-for QSharedMemory (0x0x7fd1f5954000) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fd1f57a1f60) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fd1f5954068) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7fd1f57a1f00) 0 + primary-for QSignalMapper (0x0x7fd1f5954068) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fd1f557a060) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fd1f59540d0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7fd1f557a000) 0 + primary-for QSocketNotifier (0x0x7fd1f59540d0) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fd1f557a0c0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fd1f557a1e0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fd1f5954138) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7fd1f557a180) 0 + primary-for QTimer (0x0x7fd1f5954138) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fd1f557a300) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fd1f59541a0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7fd1f557a2a0) 0 + primary-for QTranslator (0x0x7fd1f59541a0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fd1f557a360) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fd1f557a480) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fd1f557a4e0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fd1f557a600) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fd1f5954208) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7fd1f557a5a0) 0 + primary-for QLibrary (0x0x7fd1f5954208) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fd1f557a720) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fd1f557a840) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fd1f5954340) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7fd1f557a7e0) 0 + primary-for QPluginLoader (0x0x7fd1f5954340) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fd1f557a8a0) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fd1f557a9c0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fd1f59543a8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7fd1f557a960) 0 + primary-for QAbstractState (0x0x7fd1f59543a8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fd1f557aa80) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fd1f5954410) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7fd1f557aa20) 0 + primary-for QAbstractTransition (0x0x7fd1f5954410) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fd1f557ab40) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fd1f5954478) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7fd1f59544e0) 0 + primary-for QEventTransition (0x0x7fd1f5954478) + QObject (0x0x7fd1f557aae0) 0 + primary-for QAbstractTransition (0x0x7fd1f59544e0) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fd1f557ac00) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fd1f5954548) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7fd1f59545b0) 0 + primary-for QFinalState (0x0x7fd1f5954548) + QObject (0x0x7fd1f557aba0) 0 + primary-for QAbstractState (0x0x7fd1f59545b0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fd1f557acc0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fd1f5954618) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7fd1f5954680) 0 + primary-for QHistoryState (0x0x7fd1f5954618) + QObject (0x0x7fd1f557ac60) 0 + primary-for QAbstractState (0x0x7fd1f5954680) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fd1f557ad80) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fd1f59546e8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7fd1f5954750) 0 + primary-for QSignalTransition (0x0x7fd1f59546e8) + QObject (0x0x7fd1f557ad20) 0 + primary-for QAbstractTransition (0x0x7fd1f5954750) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fd1f557ae40) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fd1f59547b8) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7fd1f5954820) 0 + primary-for QState (0x0x7fd1f59547b8) + QObject (0x0x7fd1f557ade0) 0 + primary-for QAbstractState (0x0x7fd1f5954820) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fd1f557af60) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fd1f59549c0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7fd1f56c9000) 0 + primary-for QStateMachine::SignalEvent (0x0x7fd1f59549c0) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fd1f5954a28) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7fd1f56c9060) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fd1f5954a28) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fd1f5954888) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7fd1f59548f0) 0 + primary-for QStateMachine (0x0x7fd1f5954888) + QAbstractState (0x0x7fd1f5954958) 0 + primary-for QState (0x0x7fd1f59548f0) + QObject (0x0x7fd1f557af00) 0 + primary-for QAbstractState (0x0x7fd1f5954958) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fd1f5954a90) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7fd1f56c90c0) 0 nearly-empty + primary-for QException (0x0x7fd1f5954a90) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fd1f5954af8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7fd1f5954b60) 0 nearly-empty + primary-for QUnhandledException (0x0x7fd1f5954af8) + std::exception (0x0x7fd1f56c9120) 0 nearly-empty + primary-for QException (0x0x7fd1f5954b60) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fd1f56c9180) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fd1f56c9240) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fd1f56c92a0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fd1f56c9300) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fd1f5954d00) 0 + QBasicMutex (0x0x7fd1f56c9420) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fd1f56c9480) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fd1f56c94e0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fd1f56c9540) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fd1f56c96c0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fd1f56c9780) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fd1f56c9ae0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fd1f5372618) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7fd1f56c9a80) 0 + primary-for QFutureWatcherBase (0x0x7fd1f5372618) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fd1f56c9c00) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fd1f56c9c60) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fd1f56c9d20) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fd1f56c9de0) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fd1f56c9ea0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fd1f53729c0) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7fd1f56c9e40) 0 + primary-for QThread (0x0x7fd1f53729c0) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fd1f56c9f60) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fd1f5372a28) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7fd1f56c9f00) 0 + primary-for QThreadPool (0x0x7fd1f5372a28) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fd1f5481000) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fd1f54810c0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fd1f54bd7e0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fd1f54bd840) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fd1f54bd960) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fd1f54bd900) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fd1f54bdae0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fd1f54bdba0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fd1f54bdcc0) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fd1f54bdde0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fd1f54bde40) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fd1f54bdea0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fd1f54bdf00) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fd1f51ed000) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fd1f51ed0c0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fd1f51ed180) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7fd1f51ed240) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fd1f51ed5a0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fd1f51ed660) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fd1f51ed720) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fd1f51ed7e0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fd1f51ed8a0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fd1f51ed960) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fd1f51eda20) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fd1f51edcc0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fd1f51edde0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fd1f511f000) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fd1f511fa20) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fd1f511fba0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fd1f5086bc8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7fd1f511fb40) 0 + primary-for QTimeLine (0x0x7fd1f5086bc8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fd1f511fc60) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fd1f511fc00) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fd1f511fde0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fd1f511fe40) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fd1f5086d00) 0 + QVector (0x0x7fd1f4e3f000) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fd1f4e3f060) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fd1f4e3f120) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fd1f4e3f1e0) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fd1f4e3f2a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fd1f4e3f300) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fd1f4e3f420) 0 + +Class QBluetoothAddress + size=8 align=8 + base size=8 base align=8 +QBluetoothAddress (0x0x7fd1f4e3f600) 0 + +Class QBluetoothDeviceInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothDeviceInfo (0x0x7fd1f4e3f780) 0 + +Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7fd1f4e3f840) 0 empty + +Vtable for QBluetoothDeviceDiscoveryAgent +QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI30QBluetoothDeviceDiscoveryAgent) +16 (int (*)(...))QBluetoothDeviceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +48 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothDeviceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothDeviceDiscoveryAgent (0x0x7fd1f5086e38) 0 + vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16u) + QObject (0x0x7fd1f4e3f7e0) 0 + primary-for QBluetoothDeviceDiscoveryAgent (0x0x7fd1f5086e38) + +Class QBluetoothHostInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothHostInfo (0x0x7fd1f4e3f8a0) 0 + +Class QBluetoothLocalDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothLocalDevice::QPrivateSignal (0x0x7fd1f4e3f960) 0 empty + +Vtable for QBluetoothLocalDevice +QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QBluetoothLocalDevice) +16 (int (*)(...))QBluetoothLocalDevice::metaObject +24 (int (*)(...))QBluetoothLocalDevice::qt_metacast +32 (int (*)(...))QBluetoothLocalDevice::qt_metacall +40 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +48 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothLocalDevice + size=24 align=8 + base size=24 base align=8 +QBluetoothLocalDevice (0x0x7fd1f5086ea0) 0 + vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16u) + QObject (0x0x7fd1f4e3f900) 0 + primary-for QBluetoothLocalDevice (0x0x7fd1f5086ea0) + +Class quint128 + size=16 align=1 + base size=16 base align=1 +quint128 (0x0x7fd1f4e3fd20) 0 + +Class QBluetoothUuid + size=16 align=4 + base size=16 base align=4 +QBluetoothUuid (0x0x7fd1f5086f08) 0 + QUuid (0x0x7fd1f4e3fd80) 0 + +Class QBluetoothServiceInfo::Sequence + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Sequence (0x0x7fd1f5086f70) 0 + QList (0x0x7fd1f4e3ff60) 0 + +Class QBluetoothServiceInfo::Alternative + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Alternative (0x0x7fd1f4b5e000) 0 + QList (0x0x7fd1f4b5f000) 0 + +Class QBluetoothServiceInfo + size=16 align=8 + base size=16 base align=8 +QBluetoothServiceInfo (0x0x7fd1f4e3ff00) 0 + +Class QAbstractSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractSocket::QPrivateSignal (0x0x7fd1f4b5f5a0) 0 empty + +Vtable for QAbstractSocket +QAbstractSocket::_ZTV15QAbstractSocket: 41u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAbstractSocket) +16 (int (*)(...))QAbstractSocket::metaObject +24 (int (*)(...))QAbstractSocket::qt_metacast +32 (int (*)(...))QAbstractSocket::qt_metacall +40 (int (*)(...))QAbstractSocket::~QAbstractSocket +48 (int (*)(...))QAbstractSocket::~QAbstractSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QAbstractSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QAbstractSocket::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QAbstractSocket::bytesAvailable +184 (int (*)(...))QAbstractSocket::bytesToWrite +192 (int (*)(...))QAbstractSocket::canReadLine +200 (int (*)(...))QAbstractSocket::waitForReadyRead +208 (int (*)(...))QAbstractSocket::waitForBytesWritten +216 (int (*)(...))QAbstractSocket::readData +224 (int (*)(...))QAbstractSocket::readLineData +232 (int (*)(...))QAbstractSocket::writeData +240 (int (*)(...))QAbstractSocket::resume +248 (int (*)(...))QAbstractSocket::connectToHost +256 (int (*)(...))QAbstractSocket::connectToHost +264 (int (*)(...))QAbstractSocket::disconnectFromHost +272 (int (*)(...))QAbstractSocket::setReadBufferSize +280 (int (*)(...))QAbstractSocket::socketDescriptor +288 (int (*)(...))QAbstractSocket::setSocketDescriptor +296 (int (*)(...))QAbstractSocket::setSocketOption +304 (int (*)(...))QAbstractSocket::socketOption +312 (int (*)(...))QAbstractSocket::waitForConnected +320 (int (*)(...))QAbstractSocket::waitForDisconnected + +Class QAbstractSocket + size=16 align=8 + base size=16 base align=8 +QAbstractSocket (0x0x7fd1f4b5e270) 0 + vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16u) + QIODevice (0x0x7fd1f4b5e2d8) 0 + primary-for QAbstractSocket (0x0x7fd1f4b5e270) + QObject (0x0x7fd1f4b5f540) 0 + primary-for QIODevice (0x0x7fd1f4b5e2d8) + +Class QBluetoothSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothSocket::QPrivateSignal (0x0x7fd1f4b5fa20) 0 empty + +Vtable for QBluetoothSocket +QBluetoothSocket::_ZTV16QBluetoothSocket: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothSocket) +16 (int (*)(...))QBluetoothSocket::metaObject +24 (int (*)(...))QBluetoothSocket::qt_metacast +32 (int (*)(...))QBluetoothSocket::qt_metacall +40 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +48 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QBluetoothSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QBluetoothSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QBluetoothSocket::bytesAvailable +184 (int (*)(...))QBluetoothSocket::bytesToWrite +192 (int (*)(...))QBluetoothSocket::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBluetoothSocket::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBluetoothSocket::writeData + +Class QBluetoothSocket + size=24 align=8 + base size=24 base align=8 +QBluetoothSocket (0x0x7fd1f4b5e4e0) 0 + vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16u) + QIODevice (0x0x7fd1f4b5e548) 0 + primary-for QBluetoothSocket (0x0x7fd1f4b5e4e0) + QObject (0x0x7fd1f4b5f9c0) 0 + primary-for QIODevice (0x0x7fd1f4b5e548) + +Class QBluetoothServer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServer::QPrivateSignal (0x0x7fd1f4b5fae0) 0 empty + +Vtable for QBluetoothServer +QBluetoothServer::_ZTV16QBluetoothServer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothServer) +16 (int (*)(...))QBluetoothServer::metaObject +24 (int (*)(...))QBluetoothServer::qt_metacast +32 (int (*)(...))QBluetoothServer::qt_metacall +40 (int (*)(...))QBluetoothServer::~QBluetoothServer +48 (int (*)(...))QBluetoothServer::~QBluetoothServer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServer + size=24 align=8 + base size=24 base align=8 +QBluetoothServer (0x0x7fd1f4b5e5b0) 0 + vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16u) + QObject (0x0x7fd1f4b5fa80) 0 + primary-for QBluetoothServer (0x0x7fd1f4b5e5b0) + +Class QBluetoothServiceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7fd1f4b5fba0) 0 empty + +Vtable for QBluetoothServiceDiscoveryAgent +QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI31QBluetoothServiceDiscoveryAgent) +16 (int (*)(...))QBluetoothServiceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +48 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServiceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothServiceDiscoveryAgent (0x0x7fd1f4b5e618) 0 + vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16u) + QObject (0x0x7fd1f4b5fb40) 0 + primary-for QBluetoothServiceDiscoveryAgent (0x0x7fd1f4b5e618) + +Class QBluetoothTransferManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferManager::QPrivateSignal (0x0x7fd1f4b5fc60) 0 empty + +Vtable for QBluetoothTransferManager +QBluetoothTransferManager::_ZTV25QBluetoothTransferManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QBluetoothTransferManager) +16 (int (*)(...))QBluetoothTransferManager::metaObject +24 (int (*)(...))QBluetoothTransferManager::qt_metacast +32 (int (*)(...))QBluetoothTransferManager::qt_metacall +40 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +48 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothTransferManager + size=16 align=8 + base size=16 base align=8 +QBluetoothTransferManager (0x0x7fd1f4b5e680) 0 + vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16u) + QObject (0x0x7fd1f4b5fc00) 0 + primary-for QBluetoothTransferManager (0x0x7fd1f4b5e680) + +Class QBluetoothTransferRequest + size=8 align=8 + base size=8 base align=8 +QBluetoothTransferRequest (0x0x7fd1f4b5fcc0) 0 + +Class QBluetoothTransferReply::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferReply::QPrivateSignal (0x0x7fd1f4b5fd80) 0 empty + +Vtable for QBluetoothTransferReply +QBluetoothTransferReply::_ZTV23QBluetoothTransferReply: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QBluetoothTransferReply) +16 (int (*)(...))QBluetoothTransferReply::metaObject +24 (int (*)(...))QBluetoothTransferReply::qt_metacast +32 (int (*)(...))QBluetoothTransferReply::qt_metacall +40 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +48 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual + +Class QBluetoothTransferReply + size=24 align=8 + base size=24 base align=8 +QBluetoothTransferReply (0x0x7fd1f4b5e6e8) 0 + vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16u) + QObject (0x0x7fd1f4b5fd20) 0 + primary-for QBluetoothTransferReply (0x0x7fd1f4b5e6e8) + diff --git a/tests/auto/bic/data/QtBluetooth.5.3.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.3.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..66fbef0c --- /dev/null +++ b/tests/auto/bic/data/QtBluetooth.5.3.0.linux-gcc-amd64.txt @@ -0,0 +1,3942 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7ffecb16ef00) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7ffecb16ef60) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7ffeca113b40) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7ffeca113ba0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7ffeca09c5b0) 0 empty + std::input_iterator_tag (0x0x7ffeca113c00) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7ffeca09c618) 0 empty + std::forward_iterator_tag (0x0x7ffeca09c680) 0 empty + std::input_iterator_tag (0x0x7ffeca113c60) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7ffeca09c6e8) 0 empty + std::bidirectional_iterator_tag (0x0x7ffeca09c750) 0 empty + std::forward_iterator_tag (0x0x7ffeca09c7b8) 0 empty + std::input_iterator_tag (0x0x7ffeca113cc0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7ffeca16d840) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7ffeca16da80) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7ffeca16db40) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7ffeca16dba0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7ffeca16dc60) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7ffeca16dcc0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7ffeca22e180) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7ffeca22e1e0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7ffeca22e240) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7ffeca09caf8) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7ffeca22e2a0) 0 nearly-empty + primary-for std::bad_exception (0x0x7ffeca09caf8) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7ffeca09cb60) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7ffeca22e300) 0 nearly-empty + primary-for std::bad_alloc (0x0x7ffeca09cb60) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7ffeca22e360) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7ffec90386c0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7ffec9038720) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7ffec9038900) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7ffec8d9d060) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7ffec8d9d0c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7ffec8d9d120) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7ffec8d9d180) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7ffec8d9d2a0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7ffec8bc5138) 0 + QAtomicInteger (0x0x7ffec8bc51a0) 0 + QBasicAtomicInteger (0x0x7ffec8d9dd80) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7ffec887aea0) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7ffec8a24de0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7ffec89872d8) 0 + QGenericArgument (0x0x7ffec8a24e40) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7ffec8688000) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7ffec8688120) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7ffec8688360) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7ffec86883c0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7ffec86884e0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7ffec8688540) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7ffec86888a0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7ffec8688900) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7ffec8688a80) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7ffec8688ea0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7ffec8688f00) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7ffec85869c0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7ffec8586a20) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7ffec8586ae0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7ffec8586b40) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7ffec8586ba0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7ffec8586c00) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7ffec8586d20) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7ffec8586d80) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7ffec828d4e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7ffec828d660) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7ffec828d720) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7ffec828d6c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7ffec828d8a0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7ffec828db40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7ffec828dd20) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7ffec828dd80) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7ffec828dde0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7ffec828de40) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7ffec841bbc8) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7ffec7f4e2a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7ffec841bbc8) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7ffec7f4e300) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7ffec7f4e360) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7ffec7f4e3c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7ffec7f4e240) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7ffec7f4e540) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7ffec7f4ec00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7ffec7bab6e8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7ffec7bab7b8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7ffec7baba90 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7ffec7babb60 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7ffec7c36000) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7ffec7c36300) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7ffec7c362a0) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7ffec7c366c0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7ffec7a28420) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7ffec7bab9c0) 0 + std::iterator (0x0x7ffec7a284e0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7ffec7babc98) 0 + std::_Bit_iterator_base (0x0x7ffec7babd00) 0 + std::iterator (0x0x7ffec7a28540) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7ffec7babd68) 0 + std::_Bit_iterator_base (0x0x7ffec76ea000) 0 + std::iterator (0x0x7ffec7a285a0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7ffec7a28960) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7ffec7a28d80) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7ffec7a28e40) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7ffec7a28f00) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7ffec7504360) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7ffec75046c0) 0 + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7ffec7504ae0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7ffec7504cc0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7ffec7504d80) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7ffec7377060) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7ffec73771e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7ffec7377360) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7ffec7377300) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7ffec7377660) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7ffec73776c0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7ffec7377780) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7ffec75fbb60) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7ffec7377720) 0 + primary-for QAbstractAnimation (0x0x7ffec75fbb60) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7ffec7377840) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7ffec75fbbc8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7ffec73777e0) 0 + primary-for QAnimationDriver (0x0x7ffec75fbbc8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7ffec7377900) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7ffec75fbc30) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7ffec75fbc98) 0 + primary-for QAnimationGroup (0x0x7ffec75fbc30) + QObject (0x0x7ffec73778a0) 0 + primary-for QAbstractAnimation (0x0x7ffec75fbc98) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7ffec73779c0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7ffec75fbd00) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7ffec75fbd68) 0 + primary-for QParallelAnimationGroup (0x0x7ffec75fbd00) + QAbstractAnimation (0x0x7ffec75fbdd0) 0 + primary-for QAnimationGroup (0x0x7ffec75fbd68) + QObject (0x0x7ffec7377960) 0 + primary-for QAbstractAnimation (0x0x7ffec75fbdd0) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7ffec7377a80) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7ffec75fbe38) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7ffec75fbea0) 0 + primary-for QPauseAnimation (0x0x7ffec75fbe38) + QObject (0x0x7ffec7377a20) 0 + primary-for QAbstractAnimation (0x0x7ffec75fbea0) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7ffec7377c60) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7ffec7377e40) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7ffec7377f00) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7ffec71a72a0) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7ffec71a7240) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7ffec71a7300) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7ffec71a77e0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7ffec71077b8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7ffec71a7780) 0 + primary-for QIODevice (0x0x7ffec71077b8) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7ffec71a7900) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7ffec71a79c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7ffec71a7b40) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7ffec71a7ae0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7ffec7107958) 0 + QList (0x0x7ffec71a7cc0) 0 + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7ffec6c83000) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7ffec6c830c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7ffec6c83060) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7ffec6c83120) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7ffec71a7f60) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7ffec6c833c0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7ffec6c83480) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7ffec6c83420) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7ffec6c83540) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7ffec6c834e0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7ffec6d96120) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7ffec6d78340) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7ffec6d783a8) 0 + primary-for QVariantAnimation (0x0x7ffec6d78340) + QObject (0x0x7ffec6d960c0) 0 + primary-for QAbstractAnimation (0x0x7ffec6d783a8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7ffec6d961e0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7ffec6d78478) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7ffec6d784e0) 0 + primary-for QPropertyAnimation (0x0x7ffec6d78478) + QAbstractAnimation (0x0x7ffec6d78548) 0 + primary-for QVariantAnimation (0x0x7ffec6d784e0) + QObject (0x0x7ffec6d96180) 0 + primary-for QAbstractAnimation (0x0x7ffec6d78548) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7ffec6d962a0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7ffec6d785b0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7ffec6d78618) 0 + primary-for QSequentialAnimationGroup (0x0x7ffec6d785b0) + QAbstractAnimation (0x0x7ffec6d78680) 0 + primary-for QAnimationGroup (0x0x7ffec6d78618) + QObject (0x0x7ffec6d96240) 0 + primary-for QAbstractAnimation (0x0x7ffec6d78680) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7ffec6d96360) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7ffec6d96300) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7ffec6d96480) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7ffec6d964e0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7ffec6d96540) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7ffec6d967e0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7ffec6d96960) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7ffec6d96de0) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7ffec6b515a0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7ffec6b516c0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7ffec6b517e0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7ffec6b51960) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7ffec6b51a20) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7ffec6d78c98) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7ffec6d78d00) 0 + primary-for QBuffer (0x0x7ffec6d78c98) + QObject (0x0x7ffec6b519c0) 0 + primary-for QIODevice (0x0x7ffec6d78d00) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7ffec6b51a80) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7ffec6b51d80) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7ffec6b51de0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7ffec6b51ea0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7ffec6924180) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7ffec69243c0) 0 + +Class QDebug::Stream + size=72 align=8 + base size=72 base align=8 +QDebug::Stream (0x0x7ffec6924a20) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7ffec69249c0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7ffec6924b40) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7ffec6924c00) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7ffec6924cc0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7ffec6d78a90) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7ffec6d789c0) 0 + primary-for QFileDevice (0x0x7ffec6d78a90) + QObject (0x0x7ffec6924c60) 0 + primary-for QIODevice (0x0x7ffec6d789c0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7ffec6924e40) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7ffec66a80d0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7ffec66a8138) 0 + primary-for QFile (0x0x7ffec66a80d0) + QIODevice (0x0x7ffec66a81a0) 0 + primary-for QFileDevice (0x0x7ffec66a8138) + QObject (0x0x7ffec6924de0) 0 + primary-for QIODevice (0x0x7ffec66a81a0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7ffec6924f60) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7ffec66f4240) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7ffec66f4540) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7ffec66f4720) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7ffec66a8680) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7ffec66f46c0) 0 + primary-for QFileSelector (0x0x7ffec66a8680) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7ffec66f47e0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7ffec66a86e8) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7ffec66f4780) 0 + primary-for QFileSystemWatcher (0x0x7ffec66a86e8) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7ffec66f4840) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7ffec66f4960) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7ffec66f49c0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7ffec66f4ba0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7ffec66a87b8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7ffec66a8820) 0 + primary-for QProcess (0x0x7ffec66a87b8) + QObject (0x0x7ffec66f4b40) 0 + primary-for QIODevice (0x0x7ffec66a8820) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7ffec66f4c00) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7ffec66f4d80) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7ffec66a8888) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7ffec66a88f0) 0 + primary-for QSaveFile (0x0x7ffec66a8888) + QIODevice (0x0x7ffec66a8958) 0 + primary-for QFileDevice (0x0x7ffec66a88f0) + QObject (0x0x7ffec66f4d20) 0 + primary-for QIODevice (0x0x7ffec66a8958) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7ffec66f4e40) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7ffec66a89c0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7ffec66f4de0) 0 + primary-for QSettings (0x0x7ffec66a89c0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7ffec66f4ea0) 0 empty + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7ffec6476000) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7ffec6476120) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7ffec66a8af8) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7ffec66a8b60) 0 + primary-for QTemporaryFile (0x0x7ffec66a8af8) + QFileDevice (0x0x7ffec66a8bc8) 0 + primary-for QFile (0x0x7ffec66a8b60) + QIODevice (0x0x7ffec66a8c30) 0 + primary-for QFileDevice (0x0x7ffec66a8bc8) + QObject (0x0x7ffec64760c0) 0 + primary-for QIODevice (0x0x7ffec66a8c30) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7ffec6476240) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7ffec6476660) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7ffec64767e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7ffec6476900) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7ffec6476a80) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7ffec658a068) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7ffec6476a20) 0 + primary-for QAbstractItemModel (0x0x7ffec658a068) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7ffec6476d80) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7ffec658a1a0) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7ffec658a208) 0 + primary-for QAbstractTableModel (0x0x7ffec658a1a0) + QObject (0x0x7ffec6476d20) 0 + primary-for QAbstractItemModel (0x0x7ffec658a208) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7ffec6476e40) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7ffec658a270) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7ffec658a2d8) 0 + primary-for QAbstractListModel (0x0x7ffec658a270) + QObject (0x0x7ffec6476de0) 0 + primary-for QAbstractItemModel (0x0x7ffec658a2d8) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7ffec6476f00) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7ffec658a340) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7ffec658a3a8) 0 + primary-for QAbstractProxyModel (0x0x7ffec658a340) + QObject (0x0x7ffec6476ea0) 0 + primary-for QAbstractItemModel (0x0x7ffec658a3a8) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7ffec626d000) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7ffec658a410) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7ffec658a478) 0 + primary-for QIdentityProxyModel (0x0x7ffec658a410) + QAbstractItemModel (0x0x7ffec658a4e0) 0 + primary-for QAbstractProxyModel (0x0x7ffec658a478) + QObject (0x0x7ffec6476f60) 0 + primary-for QAbstractItemModel (0x0x7ffec658a4e0) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7ffec626d060) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7ffec626d1e0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7ffec658a5b0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7ffec626d180) 0 + primary-for QItemSelectionModel (0x0x7ffec658a5b0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7ffec658a6e8) 0 + QList (0x0x7ffec626d3c0) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7ffec626d480) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7ffec658a750) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7ffec658a7b8) 0 + primary-for QSortFilterProxyModel (0x0x7ffec658a750) + QAbstractItemModel (0x0x7ffec658a820) 0 + primary-for QAbstractProxyModel (0x0x7ffec658a7b8) + QObject (0x0x7ffec626d420) 0 + primary-for QAbstractItemModel (0x0x7ffec658a820) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7ffec626d540) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7ffec658a888) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7ffec658a8f0) 0 + primary-for QStringListModel (0x0x7ffec658a888) + QAbstractItemModel (0x0x7ffec658a958) 0 + primary-for QAbstractListModel (0x0x7ffec658a8f0) + QObject (0x0x7ffec626d4e0) 0 + primary-for QAbstractItemModel (0x0x7ffec658a958) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7ffec626d5a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7ffec626d660) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7ffec626d780) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7ffec626d7e0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7ffec626d720) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7ffec626d840) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7ffec626d8a0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7ffec626d960) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7ffec626d9c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7ffec626d900) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7ffec626dae0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7ffec658a9c0) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7ffec626da80) 0 + primary-for QEventLoop (0x0x7ffec658a9c0) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7ffec626dc00) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7ffec626dcc0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7ffec626dd20) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7ffec658aaf8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7ffec626dc60) 0 + primary-for QAbstractEventDispatcher (0x0x7ffec658aaf8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7ffec626dd80) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7ffec626dde0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7ffec626df00) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7ffec658abc8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7ffec626df60) 0 + primary-for QTimerEvent (0x0x7ffec658abc8) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7ffec658ac30) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7ffec609c000) 0 + primary-for QChildEvent (0x0x7ffec658ac30) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7ffec658ac98) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7ffec609c060) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7ffec658ac98) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7ffec658ad00) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7ffec609c0c0) 0 + primary-for QDeferredDeleteEvent (0x0x7ffec658ad00) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7ffec609c180) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7ffec658ad68) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7ffec609c120) 0 + primary-for QCoreApplication (0x0x7ffec658ad68) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7ffec609c1e0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7ffec609c240) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7ffec609c360) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7ffec609c480) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7ffec609c4e0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7ffec609c660) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7ffec616c000) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7ffec609c600) 0 + primary-for QMimeData (0x0x7ffec616c000) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7ffec609c720) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7ffec616c068) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7ffec609c6c0) 0 + primary-for QObjectCleanupHandler (0x0x7ffec616c068) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7ffec609c960) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7ffec616c0d0) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7ffec609c900) 0 + primary-for QSharedMemory (0x0x7ffec616c0d0) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7ffec609ca20) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7ffec616c138) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7ffec609c9c0) 0 + primary-for QSignalMapper (0x0x7ffec616c138) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7ffec609cae0) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7ffec616c1a0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7ffec609ca80) 0 + primary-for QSocketNotifier (0x0x7ffec616c1a0) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7ffec609cb40) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7ffec609cc60) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7ffec616c208) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7ffec609cc00) 0 + primary-for QTimer (0x0x7ffec616c208) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7ffec609cd80) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7ffec616c270) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7ffec609cd20) 0 + primary-for QTranslator (0x0x7ffec616c270) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7ffec609cde0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7ffec609cf60) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7ffec6233000) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7ffec6233120) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7ffec616c340) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7ffec62330c0) 0 + primary-for QLibrary (0x0x7ffec616c340) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7ffec6233240) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7ffec62333c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7ffec616c4e0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7ffec6233360) 0 + primary-for QPluginLoader (0x0x7ffec616c4e0) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7ffec6233420) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7ffec62335a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7ffec616c5b0) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7ffec6233540) 0 + primary-for QAbstractState (0x0x7ffec616c5b0) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7ffec6233660) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7ffec616c618) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7ffec6233600) 0 + primary-for QAbstractTransition (0x0x7ffec616c618) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7ffec6233720) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7ffec616c680) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7ffec616c6e8) 0 + primary-for QEventTransition (0x0x7ffec616c680) + QObject (0x0x7ffec62336c0) 0 + primary-for QAbstractTransition (0x0x7ffec616c6e8) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7ffec62337e0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7ffec616c750) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7ffec616c7b8) 0 + primary-for QFinalState (0x0x7ffec616c750) + QObject (0x0x7ffec6233780) 0 + primary-for QAbstractState (0x0x7ffec616c7b8) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7ffec62338a0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7ffec616c820) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7ffec616c888) 0 + primary-for QHistoryState (0x0x7ffec616c820) + QObject (0x0x7ffec6233840) 0 + primary-for QAbstractState (0x0x7ffec616c888) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7ffec6233960) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7ffec616c8f0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7ffec616c958) 0 + primary-for QSignalTransition (0x0x7ffec616c8f0) + QObject (0x0x7ffec6233900) 0 + primary-for QAbstractTransition (0x0x7ffec616c958) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7ffec6233a20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7ffec616c9c0) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7ffec616ca28) 0 + primary-for QState (0x0x7ffec616c9c0) + QObject (0x0x7ffec62339c0) 0 + primary-for QAbstractState (0x0x7ffec616ca28) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7ffec6233b40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7ffec616cbc8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7ffec6233ba0) 0 + primary-for QStateMachine::SignalEvent (0x0x7ffec616cbc8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7ffec616cc30) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7ffec6233c00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7ffec616cc30) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7ffec616ca90) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7ffec616caf8) 0 + primary-for QStateMachine (0x0x7ffec616ca90) + QAbstractState (0x0x7ffec616cb60) 0 + primary-for QState (0x0x7ffec616caf8) + QObject (0x0x7ffec6233ae0) 0 + primary-for QAbstractState (0x0x7ffec616cb60) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7ffec616cc98) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7ffec6233c60) 0 nearly-empty + primary-for QException (0x0x7ffec616cc98) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7ffec616cd00) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7ffec616cd68) 0 nearly-empty + primary-for QUnhandledException (0x0x7ffec616cd00) + std::exception (0x0x7ffec6233cc0) 0 nearly-empty + primary-for QException (0x0x7ffec616cd68) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7ffec6233d20) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7ffec6233de0) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7ffec6233e40) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7ffec6233ea0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7ffec616cf08) 0 + QBasicMutex (0x0x7ffec5f6f000) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7ffec5f6f060) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7ffec5f6f0c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7ffec5f6f120) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7ffec5f6f2a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7ffec5f6f360) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7ffec5f6f6c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7ffec5fb3820) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7ffec5f6f660) 0 + primary-for QFutureWatcherBase (0x0x7ffec5fb3820) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7ffec5f6f7e0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7ffec5f6f840) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7ffec5f6f8a0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7ffec5f6f900) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7ffec5f6f9c0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7ffec5fb3bc8) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7ffec5f6f960) 0 + primary-for QThread (0x0x7ffec5fb3bc8) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7ffec5f6fa80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7ffec5fb3c30) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7ffec5f6fa20) 0 + primary-for QThreadPool (0x0x7ffec5fb3c30) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7ffec5f6fae0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7ffec5f6fba0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7ffec5d2b180) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7ffec5d2b1e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7ffec5d2b360) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7ffec5d2b300) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7ffec5d2b4e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7ffec5d2b5a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7ffec5d2b780) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7ffec5d2b900) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7ffec5d2b960) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7ffec5d2b9c0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7ffec5d2ba20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7ffec5d2bb40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7ffec5d2bc60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7ffec5d2bd80) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7ffec5d2bea0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7ffec5add240) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7ffec5add360) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7ffec5add480) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7ffec5add540) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7ffec5add660) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7ffec5add780) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7ffec5add8a0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7ffec5add9c0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7ffec5addcc0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7ffec5adde40) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7ffec59c20c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7ffec59c2ae0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7ffec59c2c60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7ffec5a14548) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7ffec59c2c00) 0 + primary-for QTimeLine (0x0x7ffec5a14548) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7ffec59c2d20) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7ffec59c2cc0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7ffec59c2f60) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7ffec56bc000) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7ffec5a147b8) 0 + QVector (0x0x7ffec56bc1e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7ffec56bc240) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7ffec56bc360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7ffec56bc480) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7ffec56bc5a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7ffec56bc600) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7ffec56bc720) 0 + +Class QBluetoothAddress + size=8 align=8 + base size=8 base align=8 +QBluetoothAddress (0x0x7ffec56bc900) 0 + +Class QBluetoothDeviceInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothDeviceInfo (0x0x7ffec56bca80) 0 + +Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7ffec56bcb40) 0 empty + +Vtable for QBluetoothDeviceDiscoveryAgent +QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI30QBluetoothDeviceDiscoveryAgent) +16 (int (*)(...))QBluetoothDeviceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +48 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothDeviceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothDeviceDiscoveryAgent (0x0x7ffec5a14a28) 0 + vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16u) + QObject (0x0x7ffec56bcae0) 0 + primary-for QBluetoothDeviceDiscoveryAgent (0x0x7ffec5a14a28) + +Class QBluetoothHostInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothHostInfo (0x0x7ffec56bcba0) 0 + +Class QBluetoothLocalDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothLocalDevice::QPrivateSignal (0x0x7ffec56bcc60) 0 empty + +Vtable for QBluetoothLocalDevice +QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QBluetoothLocalDevice) +16 (int (*)(...))QBluetoothLocalDevice::metaObject +24 (int (*)(...))QBluetoothLocalDevice::qt_metacast +32 (int (*)(...))QBluetoothLocalDevice::qt_metacall +40 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +48 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothLocalDevice + size=24 align=8 + base size=24 base align=8 +QBluetoothLocalDevice (0x0x7ffec5a14a90) 0 + vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16u) + QObject (0x0x7ffec56bcc00) 0 + primary-for QBluetoothLocalDevice (0x0x7ffec5a14a90) + +Class quint128 + size=16 align=1 + base size=16 base align=1 +quint128 (0x0x7ffec5800060) 0 + +Class QBluetoothUuid + size=16 align=4 + base size=16 base align=4 +QBluetoothUuid (0x0x7ffec5a14af8) 0 + QUuid (0x0x7ffec58000c0) 0 + +Class QBluetoothServiceInfo::Sequence + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Sequence (0x0x7ffec5a14b60) 0 + QList (0x0x7ffec58002a0) 0 + +Class QBluetoothServiceInfo::Alternative + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Alternative (0x0x7ffec5a14bc8) 0 + QList (0x0x7ffec5800300) 0 + +Class QBluetoothServiceInfo + size=16 align=8 + base size=16 base align=8 +QBluetoothServiceInfo (0x0x7ffec5800240) 0 + +Class QAbstractSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractSocket::QPrivateSignal (0x0x7ffec58007e0) 0 empty + +Vtable for QAbstractSocket +QAbstractSocket::_ZTV15QAbstractSocket: 41u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAbstractSocket) +16 (int (*)(...))QAbstractSocket::metaObject +24 (int (*)(...))QAbstractSocket::qt_metacast +32 (int (*)(...))QAbstractSocket::qt_metacall +40 (int (*)(...))QAbstractSocket::~QAbstractSocket +48 (int (*)(...))QAbstractSocket::~QAbstractSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QAbstractSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QAbstractSocket::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QAbstractSocket::bytesAvailable +184 (int (*)(...))QAbstractSocket::bytesToWrite +192 (int (*)(...))QAbstractSocket::canReadLine +200 (int (*)(...))QAbstractSocket::waitForReadyRead +208 (int (*)(...))QAbstractSocket::waitForBytesWritten +216 (int (*)(...))QAbstractSocket::readData +224 (int (*)(...))QAbstractSocket::readLineData +232 (int (*)(...))QAbstractSocket::writeData +240 (int (*)(...))QAbstractSocket::resume +248 (int (*)(...))QAbstractSocket::connectToHost +256 (int (*)(...))QAbstractSocket::connectToHost +264 (int (*)(...))QAbstractSocket::disconnectFromHost +272 (int (*)(...))QAbstractSocket::setReadBufferSize +280 (int (*)(...))QAbstractSocket::socketDescriptor +288 (int (*)(...))QAbstractSocket::setSocketDescriptor +296 (int (*)(...))QAbstractSocket::setSocketOption +304 (int (*)(...))QAbstractSocket::socketOption +312 (int (*)(...))QAbstractSocket::waitForConnected +320 (int (*)(...))QAbstractSocket::waitForDisconnected + +Class QAbstractSocket + size=16 align=8 + base size=16 base align=8 +QAbstractSocket (0x0x7ffec5a14e38) 0 + vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16u) + QIODevice (0x0x7ffec5a14ea0) 0 + primary-for QAbstractSocket (0x0x7ffec5a14e38) + QObject (0x0x7ffec5800780) 0 + primary-for QIODevice (0x0x7ffec5a14ea0) + +Class QBluetoothSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothSocket::QPrivateSignal (0x0x7ffec5800c60) 0 empty + +Vtable for QBluetoothSocket +QBluetoothSocket::_ZTV16QBluetoothSocket: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothSocket) +16 (int (*)(...))QBluetoothSocket::metaObject +24 (int (*)(...))QBluetoothSocket::qt_metacast +32 (int (*)(...))QBluetoothSocket::qt_metacall +40 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +48 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QBluetoothSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QBluetoothSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QBluetoothSocket::bytesAvailable +184 (int (*)(...))QBluetoothSocket::bytesToWrite +192 (int (*)(...))QBluetoothSocket::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBluetoothSocket::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBluetoothSocket::writeData + +Class QBluetoothSocket + size=24 align=8 + base size=24 base align=8 +QBluetoothSocket (0x0x7ffec54830d0) 0 + vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16u) + QIODevice (0x0x7ffec5483138) 0 + primary-for QBluetoothSocket (0x0x7ffec54830d0) + QObject (0x0x7ffec5800c00) 0 + primary-for QIODevice (0x0x7ffec5483138) + +Class QBluetoothServer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServer::QPrivateSignal (0x0x7ffec5800d20) 0 empty + +Vtable for QBluetoothServer +QBluetoothServer::_ZTV16QBluetoothServer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothServer) +16 (int (*)(...))QBluetoothServer::metaObject +24 (int (*)(...))QBluetoothServer::qt_metacast +32 (int (*)(...))QBluetoothServer::qt_metacall +40 (int (*)(...))QBluetoothServer::~QBluetoothServer +48 (int (*)(...))QBluetoothServer::~QBluetoothServer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServer + size=24 align=8 + base size=24 base align=8 +QBluetoothServer (0x0x7ffec54831a0) 0 + vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16u) + QObject (0x0x7ffec5800cc0) 0 + primary-for QBluetoothServer (0x0x7ffec54831a0) + +Class QBluetoothServiceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7ffec5800de0) 0 empty + +Vtable for QBluetoothServiceDiscoveryAgent +QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI31QBluetoothServiceDiscoveryAgent) +16 (int (*)(...))QBluetoothServiceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +48 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServiceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothServiceDiscoveryAgent (0x0x7ffec5483208) 0 + vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16u) + QObject (0x0x7ffec5800d80) 0 + primary-for QBluetoothServiceDiscoveryAgent (0x0x7ffec5483208) + +Class QBluetoothTransferManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferManager::QPrivateSignal (0x0x7ffec5800ea0) 0 empty + +Vtable for QBluetoothTransferManager +QBluetoothTransferManager::_ZTV25QBluetoothTransferManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QBluetoothTransferManager) +16 (int (*)(...))QBluetoothTransferManager::metaObject +24 (int (*)(...))QBluetoothTransferManager::qt_metacast +32 (int (*)(...))QBluetoothTransferManager::qt_metacall +40 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +48 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothTransferManager + size=16 align=8 + base size=16 base align=8 +QBluetoothTransferManager (0x0x7ffec5483270) 0 + vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16u) + QObject (0x0x7ffec5800e40) 0 + primary-for QBluetoothTransferManager (0x0x7ffec5483270) + +Class QBluetoothTransferRequest + size=8 align=8 + base size=8 base align=8 +QBluetoothTransferRequest (0x0x7ffec5800f00) 0 + +Class QBluetoothTransferReply::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferReply::QPrivateSignal (0x0x7ffec5504000) 0 empty + +Vtable for QBluetoothTransferReply +QBluetoothTransferReply::_ZTV23QBluetoothTransferReply: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QBluetoothTransferReply) +16 (int (*)(...))QBluetoothTransferReply::metaObject +24 (int (*)(...))QBluetoothTransferReply::qt_metacast +32 (int (*)(...))QBluetoothTransferReply::qt_metacall +40 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +48 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual + +Class QBluetoothTransferReply + size=24 align=8 + base size=24 base align=8 +QBluetoothTransferReply (0x0x7ffec54832d8) 0 + vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16u) + QObject (0x0x7ffec5800f60) 0 + primary-for QBluetoothTransferReply (0x0x7ffec54832d8) + diff --git a/tests/auto/bic/data/QtBluetooth.5.4.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.4.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..dfdde04f --- /dev/null +++ b/tests/auto/bic/data/QtBluetooth.5.4.0.linux-gcc-amd64.txt @@ -0,0 +1,4046 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fa3dc6f8060) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fa3dc6f80c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fa3dc737c60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fa3dc737cc0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fa3dc6b66e8) 0 empty + std::input_iterator_tag (0x0x7fa3dc737d20) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fa3dc6b6750) 0 empty + std::forward_iterator_tag (0x0x7fa3dc6b67b8) 0 empty + std::input_iterator_tag (0x0x7fa3dc737d80) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fa3dc6b6820) 0 empty + std::bidirectional_iterator_tag (0x0x7fa3dc6b6888) 0 empty + std::forward_iterator_tag (0x0x7fa3dc6b68f0) 0 empty + std::input_iterator_tag (0x0x7fa3dc737de0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7fa3dc76c960) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fa3dc76cba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fa3dc76cc60) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fa3dc76ccc0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fa3dc76cd80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fa3dc76cde0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fa3db4562a0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fa3db456300) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fa3db456360) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fa3dc6b6c30) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7fa3db4563c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7fa3dc6b6c30) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fa3dc6b6c98) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7fa3db456420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fa3dc6b6c98) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fa3db456480) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7fa3db64a7e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7fa3db64a840) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7fa3db64aa20) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fa3db3b9300) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fa3db3b9360) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fa3db3b93c0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fa3db3b9420) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fa3db3b9540) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fa3db05b410) 0 + QAtomicInteger (0x0x7fa3db05b478) 0 + QBasicAtomicInteger (0x0x7fa3db200060) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fa3dafd5180) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fa3daca10c0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fa3daf795b0) 0 + QGenericArgument (0x0x7fa3daca1120) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fa3daca12a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fa3daca13c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fa3daca1600) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fa3daca1660) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fa3daca1780) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fa3daca17e0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fa3daca1ae0) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fa3daca1e40) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fa3daca1ea0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fa3daad5960) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7fa3daad59c0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fa3daad5a80) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fa3daad5ae0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fa3daad5b40) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fa3daad5ba0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fa3daad5cc0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fa3daad5d20) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fa3dabde4e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fa3dabde540) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fa3dabde6c0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fa3dabde7e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fa3dabde960) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fa3dabdea20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fa3dabde9c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fa3dabdeba0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fa3dabdee40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fa3da508060) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fa3da5080c0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fa3da508120) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fa3da508180) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7fa3da905f08) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7fa3da5085a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7fa3da905f08) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fa3da508600) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fa3da508660) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fa3da5086c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fa3da508540) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fa3da508840) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fa3da508f00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7fa3da1d0af8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7fa3da1d0bc8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7fa3da1d0ea0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7fa3da1d0f70 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fa3da1d2300) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fa3da1d2660) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fa3da1d2600) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fa3da1d2b40) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fa3d9c578a0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fa3d9f0b3a8) 0 + std::iterator (0x0x7fa3d9c57960) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fa3d9f0b410) 0 + std::_Bit_iterator_base (0x0x7fa3d9f0b478) 0 + std::iterator (0x0x7fa3d9c579c0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fa3d9f0b4e0) 0 + std::_Bit_iterator_base (0x0x7fa3d9f0b548) 0 + std::iterator (0x0x7fa3d9c57a20) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fa3d9c57de0) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fa3d9e3e240) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fa3d9e3e300) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fa3d9e3e3c0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fa3d9e3e7e0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fa3d9e3eb40) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fa3d9e3ec60) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fa3d9c37480) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fa3d9c37660) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fa3d9c37720) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fa3d99fca80) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fa3d99fcc00) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fa3d99fcde0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fa3d99fcd80) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fa3d96d9120) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fa3d96d9180) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fa3d96d9240) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fa3d9657340) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7fa3d96d91e0) 0 + primary-for QAbstractAnimation (0x0x7fa3d9657340) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fa3d96d9300) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fa3d96573a8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7fa3d96d92a0) 0 + primary-for QAnimationDriver (0x0x7fa3d96573a8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fa3d96d93c0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fa3d9657410) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7fa3d9657478) 0 + primary-for QAnimationGroup (0x0x7fa3d9657410) + QObject (0x0x7fa3d96d9360) 0 + primary-for QAbstractAnimation (0x0x7fa3d9657478) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fa3d96d9480) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fa3d96574e0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7fa3d9657548) 0 + primary-for QParallelAnimationGroup (0x0x7fa3d96574e0) + QAbstractAnimation (0x0x7fa3d96575b0) 0 + primary-for QAnimationGroup (0x0x7fa3d9657548) + QObject (0x0x7fa3d96d9420) 0 + primary-for QAbstractAnimation (0x0x7fa3d96575b0) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fa3d96d9540) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fa3d9657618) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7fa3d9657680) 0 + primary-for QPauseAnimation (0x0x7fa3d9657618) + QObject (0x0x7fa3d96d94e0) 0 + primary-for QAbstractAnimation (0x0x7fa3d9657680) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fa3d96d9720) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fa3d96d9900) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fa3d96d99c0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fa3d96d9d20) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7fa3d96d9cc0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fa3d96d9d80) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fa3d9562300) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fa3d9657ea0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7fa3d95622a0) 0 + primary-for QIODevice (0x0x7fa3d9657ea0) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fa3d9562420) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fa3d95624e0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fa3d9562660) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fa3d9562600) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fa3d92bf068) 0 + QList (0x0x7fa3d92bf0d0) 0 + QListSpecialMethods (0x0x7fa3d9562840) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fa3d9562b40) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fa3d9562c00) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fa3d9562ba0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fa3d9562c60) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fa3d9562ae0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fa3d9562f60) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fa3d93e8060) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fa3d93e8000) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fa3d93e8120) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fa3d93e80c0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fa3d93e8cc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fa3d92bfb60) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7fa3d92bfbc8) 0 + primary-for QVariantAnimation (0x0x7fa3d92bfb60) + QObject (0x0x7fa3d93e8c60) 0 + primary-for QAbstractAnimation (0x0x7fa3d92bfbc8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fa3d93e8d80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fa3d92bfc98) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7fa3d92bfd00) 0 + primary-for QPropertyAnimation (0x0x7fa3d92bfc98) + QAbstractAnimation (0x0x7fa3d92bfd68) 0 + primary-for QVariantAnimation (0x0x7fa3d92bfd00) + QObject (0x0x7fa3d93e8d20) 0 + primary-for QAbstractAnimation (0x0x7fa3d92bfd68) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fa3d93e8e40) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fa3d92bfdd0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7fa3d92bfe38) 0 + primary-for QSequentialAnimationGroup (0x0x7fa3d92bfdd0) + QAbstractAnimation (0x0x7fa3d92bfea0) 0 + primary-for QAnimationGroup (0x0x7fa3d92bfe38) + QObject (0x0x7fa3d93e8de0) 0 + primary-for QAbstractAnimation (0x0x7fa3d92bfea0) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fa3d93e8f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fa3d93e8ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fa3d90b3060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fa3d90b30c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fa3d90b3120) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fa3d90b3300) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fa3d90b3a80) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fa3d90b3ba0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fa3d90b3cc0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fa3d90b3e40) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fa3d90b3f00) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fa3d923a068) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7fa3d923a0d0) 0 + primary-for QBuffer (0x0x7fa3d923a068) + QObject (0x0x7fa3d90b3ea0) 0 + primary-for QIODevice (0x0x7fa3d923a0d0) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fa3d90b3f60) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fa3d8eba2a0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fa3d8eba300) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fa3d8eba3c0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fa3d8eba660) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fa3d8eba8a0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fa3d8ebaf00) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fa3d8ebaea0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fa3d8c7d060) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fa3d8c7d120) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fa3d8c7d1e0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fa3d923a548) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7fa3d923a5b0) 0 + primary-for QFileDevice (0x0x7fa3d923a548) + QObject (0x0x7fa3d8c7d180) 0 + primary-for QIODevice (0x0x7fa3d923a5b0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fa3d8c7d360) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fa3d923a6e8) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7fa3d923a750) 0 + primary-for QFile (0x0x7fa3d923a6e8) + QIODevice (0x0x7fa3d923a7b8) 0 + primary-for QFileDevice (0x0x7fa3d923a750) + QObject (0x0x7fa3d8c7d300) 0 + primary-for QIODevice (0x0x7fa3d923a7b8) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fa3d8c7d480) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fa3d8c7d720) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fa3d8c7da20) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fa3d8c7dc00) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fa3d923ac98) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7fa3d8c7dba0) 0 + primary-for QFileSelector (0x0x7fa3d923ac98) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fa3d8c7dcc0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fa3d923ad00) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7fa3d8c7dc60) 0 + primary-for QFileSystemWatcher (0x0x7fa3d923ad00) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fa3d8c7dd20) 0 + +Class QLoggingCategory::AtomicBools + size=3 align=1 + base size=3 base align=1 +QLoggingCategory::AtomicBools (0x0x7fa3d8c7dea0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fa3d8c7de40) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fa3d8e08060) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fa3d8e08240) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fa3d923af08) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7fa3d923af70) 0 + primary-for QProcess (0x0x7fa3d923af08) + QObject (0x0x7fa3d8e081e0) 0 + primary-for QIODevice (0x0x7fa3d923af70) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fa3d8e082a0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fa3d8e08420) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fa3d923a410) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7fa3d8a69000) 0 + primary-for QSaveFile (0x0x7fa3d923a410) + QIODevice (0x0x7fa3d8a69068) 0 + primary-for QFileDevice (0x0x7fa3d8a69000) + QObject (0x0x7fa3d8e083c0) 0 + primary-for QIODevice (0x0x7fa3d8a69068) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fa3d8e084e0) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fa3d8a690d0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7fa3d8e08480) 0 + primary-for QSettings (0x0x7fa3d8a690d0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fa3d8e08540) 0 empty + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fa3d8e08660) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fa3d8e08900) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fa3d8e08a20) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fa3d8a69270) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7fa3d8a692d8) 0 + primary-for QTemporaryFile (0x0x7fa3d8a69270) + QFileDevice (0x0x7fa3d8a69340) 0 + primary-for QFile (0x0x7fa3d8a692d8) + QIODevice (0x0x7fa3d8a693a8) 0 + primary-for QFileDevice (0x0x7fa3d8a69340) + QObject (0x0x7fa3d8e089c0) 0 + primary-for QIODevice (0x0x7fa3d8a693a8) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fa3d8e08b40) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fa3d8baf060) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fa3d8baf1e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fa3d8baf300) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fa3d8baf480) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fa3d8a69888) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7fa3d8baf420) 0 + primary-for QAbstractItemModel (0x0x7fa3d8a69888) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fa3d8baf7e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fa3d8a69a28) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7fa3d8a69a90) 0 + primary-for QAbstractTableModel (0x0x7fa3d8a69a28) + QObject (0x0x7fa3d8baf780) 0 + primary-for QAbstractItemModel (0x0x7fa3d8a69a90) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fa3d8baf8a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fa3d8a69af8) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7fa3d8a69b60) 0 + primary-for QAbstractListModel (0x0x7fa3d8a69af8) + QObject (0x0x7fa3d8baf840) 0 + primary-for QAbstractItemModel (0x0x7fa3d8a69b60) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fa3d8baf960) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fa3d8a69bc8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7fa3d8a69c30) 0 + primary-for QAbstractProxyModel (0x0x7fa3d8a69bc8) + QObject (0x0x7fa3d8baf900) 0 + primary-for QAbstractItemModel (0x0x7fa3d8a69c30) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fa3d8bafa20) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fa3d8a69c98) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7fa3d8a69d00) 0 + primary-for QIdentityProxyModel (0x0x7fa3d8a69c98) + QAbstractItemModel (0x0x7fa3d8a69d68) 0 + primary-for QAbstractProxyModel (0x0x7fa3d8a69d00) + QObject (0x0x7fa3d8baf9c0) 0 + primary-for QAbstractItemModel (0x0x7fa3d8a69d68) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fa3d8bafa80) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fa3d8bafc00) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fa3d8a69e38) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7fa3d8bafba0) 0 + primary-for QItemSelectionModel (0x0x7fa3d8a69e38) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fa3d8977000) 0 + QList (0x0x7fa3d8977068) 0 + QListSpecialMethods (0x0x7fa3d8bafe40) 0 empty + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fa3d8baff00) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fa3d89770d0) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7fa3d8977138) 0 + primary-for QSortFilterProxyModel (0x0x7fa3d89770d0) + QAbstractItemModel (0x0x7fa3d89771a0) 0 + primary-for QAbstractProxyModel (0x0x7fa3d8977138) + QObject (0x0x7fa3d8bafea0) 0 + primary-for QAbstractItemModel (0x0x7fa3d89771a0) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fa3d89a8000) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fa3d8977208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7fa3d8977270) 0 + primary-for QStringListModel (0x0x7fa3d8977208) + QAbstractItemModel (0x0x7fa3d89772d8) 0 + primary-for QAbstractListModel (0x0x7fa3d8977270) + QObject (0x0x7fa3d8baff60) 0 + primary-for QAbstractItemModel (0x0x7fa3d89772d8) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fa3d89a8060) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fa3d89a8120) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fa3d89a81e0) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fa3d89a8240) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fa3d89a8300) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fa3d89a8360) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fa3d89a82a0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fa3d89a83c0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fa3d89a8420) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fa3d89a84e0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fa3d89a8540) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fa3d89a8480) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fa3d89a8660) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fa3d8977340) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7fa3d89a8600) 0 + primary-for QEventLoop (0x0x7fa3d8977340) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fa3d89a8780) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fa3d89a8840) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fa3d89a88a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fa3d8977478) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7fa3d89a87e0) 0 + primary-for QAbstractEventDispatcher (0x0x7fa3d8977478) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fa3d89a8900) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fa3d89a8960) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fa3d89a8a80) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fa3d8977548) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7fa3d89a8ae0) 0 + primary-for QTimerEvent (0x0x7fa3d8977548) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fa3d89775b0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7fa3d89a8b40) 0 + primary-for QChildEvent (0x0x7fa3d89775b0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fa3d8977618) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7fa3d89a8ba0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fa3d8977618) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fa3d8977680) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7fa3d89a8c00) 0 + primary-for QDeferredDeleteEvent (0x0x7fa3d8977680) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fa3d89a8cc0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fa3d89776e8) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7fa3d89a8c60) 0 + primary-for QCoreApplication (0x0x7fa3d89776e8) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7fa3d89a8d20) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fa3d89a8d80) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fa3d89a8ea0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fa3d87f0000) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fa3d87f0060) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fa3d87f01e0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fa3d8977958) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7fa3d87f0180) 0 + primary-for QMimeData (0x0x7fa3d8977958) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fa3d87f02a0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fa3d89779c0) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7fa3d87f0240) 0 + primary-for QObjectCleanupHandler (0x0x7fa3d89779c0) + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fa3d87f03c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fa3d87f0540) 0 + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fa3d87f0c00) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fa3d8977d68) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7fa3d87f0ba0) 0 + primary-for QSharedMemory (0x0x7fa3d8977d68) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fa3d87f0cc0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fa3d8977dd0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7fa3d87f0c60) 0 + primary-for QSignalMapper (0x0x7fa3d8977dd0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fa3d87f0d80) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fa3d8977e38) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7fa3d87f0d20) 0 + primary-for QSocketNotifier (0x0x7fa3d8977e38) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fa3d87f0de0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fa3d87f0f00) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fa3d8977ea0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7fa3d87f0ea0) 0 + primary-for QTimer (0x0x7fa3d8977ea0) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fa3d85500c0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fa3d8977f70) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7fa3d8550060) 0 + primary-for QTranslator (0x0x7fa3d8977f70) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fa3d8550120) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fa3d85502a0) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fa3d8550300) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fa3d8550420) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fa3d8977c30) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7fa3d85503c0) 0 + primary-for QLibrary (0x0x7fa3d8977c30) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fa3d8550540) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fa3d85506c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fa3d85c5068) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7fa3d8550660) 0 + primary-for QPluginLoader (0x0x7fa3d85c5068) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fa3d8550720) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fa3d85508a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fa3d85c5138) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7fa3d8550840) 0 + primary-for QAbstractState (0x0x7fa3d85c5138) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fa3d8550960) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fa3d85c51a0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7fa3d8550900) 0 + primary-for QAbstractTransition (0x0x7fa3d85c51a0) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fa3d8550a20) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fa3d85c5208) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7fa3d85c5270) 0 + primary-for QEventTransition (0x0x7fa3d85c5208) + QObject (0x0x7fa3d85509c0) 0 + primary-for QAbstractTransition (0x0x7fa3d85c5270) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fa3d8550ae0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fa3d85c52d8) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7fa3d85c5340) 0 + primary-for QFinalState (0x0x7fa3d85c52d8) + QObject (0x0x7fa3d8550a80) 0 + primary-for QAbstractState (0x0x7fa3d85c5340) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fa3d8550ba0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fa3d85c53a8) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7fa3d85c5410) 0 + primary-for QHistoryState (0x0x7fa3d85c53a8) + QObject (0x0x7fa3d8550b40) 0 + primary-for QAbstractState (0x0x7fa3d85c5410) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fa3d8550c60) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fa3d85c5478) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7fa3d85c54e0) 0 + primary-for QSignalTransition (0x0x7fa3d85c5478) + QObject (0x0x7fa3d8550c00) 0 + primary-for QAbstractTransition (0x0x7fa3d85c54e0) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fa3d8550d20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fa3d85c5548) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7fa3d85c55b0) 0 + primary-for QState (0x0x7fa3d85c5548) + QObject (0x0x7fa3d8550cc0) 0 + primary-for QAbstractState (0x0x7fa3d85c55b0) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fa3d8550e40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fa3d85c5750) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7fa3d8550ea0) 0 + primary-for QStateMachine::SignalEvent (0x0x7fa3d85c5750) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fa3d85c57b8) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7fa3d8550f00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fa3d85c57b8) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fa3d85c5618) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7fa3d85c5680) 0 + primary-for QStateMachine (0x0x7fa3d85c5618) + QAbstractState (0x0x7fa3d85c56e8) 0 + primary-for QState (0x0x7fa3d85c5680) + QObject (0x0x7fa3d8550de0) 0 + primary-for QAbstractState (0x0x7fa3d85c56e8) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fa3d85c5820) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7fa3d8550f60) 0 nearly-empty + primary-for QException (0x0x7fa3d85c5820) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fa3d85c5888) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7fa3d85c58f0) 0 nearly-empty + primary-for QUnhandledException (0x0x7fa3d85c5888) + std::exception (0x0x7fa3d829a000) 0 nearly-empty + primary-for QException (0x0x7fa3d85c58f0) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fa3d829a060) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fa3d829a120) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fa3d829a180) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fa3d829a1e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fa3d85c5a90) 0 + QBasicMutex (0x0x7fa3d829a300) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fa3d829a360) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fa3d829a3c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fa3d829a420) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fa3d829a5a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fa3d829a660) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fa3d829a9c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fa3d83293a8) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7fa3d829a960) 0 + primary-for QFutureWatcherBase (0x0x7fa3d83293a8) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fa3d829aae0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fa3d829ab40) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fa3d829aba0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fa3d829ac00) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fa3d829acc0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fa3d8329750) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7fa3d829ac60) 0 + primary-for QThread (0x0x7fa3d8329750) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fa3d829ad80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fa3d83297b8) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7fa3d829ad20) 0 + primary-for QThreadPool (0x0x7fa3d83297b8) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fa3d829ade0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fa3d829aea0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fa3d8073480) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fa3d80734e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fa3d8073660) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fa3d8073600) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fa3d80737e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fa3d80738a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fa3d8073a80) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fa3d8073c00) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fa3d8073c60) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fa3d8073cc0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fa3d8073d20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fa3d8073e40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fa3d8073f60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fa3d81ea0c0) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7fa3d81ea1e0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fa3d81ea540) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fa3d81ea660) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fa3d81ea780) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fa3d81ea840) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fa3d81ea960) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fa3d81eaa80) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fa3d81eaba0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fa3d81eacc0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fa3d7cfc000) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fa3d7cfc180) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fa3d7cfc3c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fa3d7cfcde0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fa3d7cfcf60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fa3d7dbe0d0) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7fa3d7cfcf00) 0 + primary-for QTimeLine (0x0x7fa3d7dbe0d0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fa3d7ded060) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fa3d7ded000) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fa3d7ded2a0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fa3d7ded300) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fa3d7dbe340) 0 + QVector (0x0x7fa3d7ded4e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fa3d7ded540) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fa3d7ded660) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fa3d7ded780) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fa3d7ded8a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fa3d7ded900) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fa3d7deda20) 0 + +Class QBluetoothAddress + size=8 align=8 + base size=8 base align=8 +QBluetoothAddress (0x0x7fa3d7dedc00) 0 + +Class QBluetoothDeviceInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothDeviceInfo (0x0x7fa3d7dedd80) 0 + +Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7fa3d7dede40) 0 empty + +Vtable for QBluetoothDeviceDiscoveryAgent +QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI30QBluetoothDeviceDiscoveryAgent) +16 (int (*)(...))QBluetoothDeviceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothDeviceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +48 (int (*)(...))QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothDeviceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothDeviceDiscoveryAgent (0x0x7fa3d7dbe5b0) 0 + vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16u) + QObject (0x0x7fa3d7dedde0) 0 + primary-for QBluetoothDeviceDiscoveryAgent (0x0x7fa3d7dbe5b0) + +Class QBluetoothHostInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothHostInfo (0x0x7fa3d7dedea0) 0 + +Class QBluetoothLocalDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothLocalDevice::QPrivateSignal (0x0x7fa3d7dedf60) 0 empty + +Vtable for QBluetoothLocalDevice +QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QBluetoothLocalDevice) +16 (int (*)(...))QBluetoothLocalDevice::metaObject +24 (int (*)(...))QBluetoothLocalDevice::qt_metacast +32 (int (*)(...))QBluetoothLocalDevice::qt_metacall +40 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +48 (int (*)(...))QBluetoothLocalDevice::~QBluetoothLocalDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothLocalDevice + size=24 align=8 + base size=24 base align=8 +QBluetoothLocalDevice (0x0x7fa3d7dbe618) 0 + vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16u) + QObject (0x0x7fa3d7dedf00) 0 + primary-for QBluetoothLocalDevice (0x0x7fa3d7dbe618) + +Class quint128 + size=16 align=1 + base size=16 base align=1 +quint128 (0x0x7fa3d7adc360) 0 + +Class QBluetoothUuid + size=16 align=4 + base size=16 base align=4 +QBluetoothUuid (0x0x7fa3d7dbe680) 0 + QUuid (0x0x7fa3d7adc3c0) 0 + +Class QBluetoothServiceInfo::Sequence + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Sequence (0x0x7fa3d7dbe6e8) 0 + QList (0x0x7fa3d7dbe750) 0 + QListSpecialMethods (0x0x7fa3d7adc5a0) 0 empty + +Class QBluetoothServiceInfo::Alternative + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Alternative (0x0x7fa3d7dbe7b8) 0 + QList (0x0x7fa3d7dbe820) 0 + QListSpecialMethods (0x0x7fa3d7adc600) 0 empty + +Class QBluetoothServiceInfo + size=16 align=8 + base size=16 base align=8 +QBluetoothServiceInfo (0x0x7fa3d7adc540) 0 + +Class QAbstractSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractSocket::QPrivateSignal (0x0x7fa3d7adcae0) 0 empty + +Vtable for QAbstractSocket +QAbstractSocket::_ZTV15QAbstractSocket: 41u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAbstractSocket) +16 (int (*)(...))QAbstractSocket::metaObject +24 (int (*)(...))QAbstractSocket::qt_metacast +32 (int (*)(...))QAbstractSocket::qt_metacall +40 (int (*)(...))QAbstractSocket::~QAbstractSocket +48 (int (*)(...))QAbstractSocket::~QAbstractSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QAbstractSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QAbstractSocket::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QAbstractSocket::bytesAvailable +184 (int (*)(...))QAbstractSocket::bytesToWrite +192 (int (*)(...))QAbstractSocket::canReadLine +200 (int (*)(...))QAbstractSocket::waitForReadyRead +208 (int (*)(...))QAbstractSocket::waitForBytesWritten +216 (int (*)(...))QAbstractSocket::readData +224 (int (*)(...))QAbstractSocket::readLineData +232 (int (*)(...))QAbstractSocket::writeData +240 (int (*)(...))QAbstractSocket::resume +248 (int (*)(...))QAbstractSocket::connectToHost +256 (int (*)(...))QAbstractSocket::connectToHost +264 (int (*)(...))QAbstractSocket::disconnectFromHost +272 (int (*)(...))QAbstractSocket::setReadBufferSize +280 (int (*)(...))QAbstractSocket::socketDescriptor +288 (int (*)(...))QAbstractSocket::setSocketDescriptor +296 (int (*)(...))QAbstractSocket::setSocketOption +304 (int (*)(...))QAbstractSocket::socketOption +312 (int (*)(...))QAbstractSocket::waitForConnected +320 (int (*)(...))QAbstractSocket::waitForDisconnected + +Class QAbstractSocket + size=16 align=8 + base size=16 base align=8 +QAbstractSocket (0x0x7fa3d7dbea90) 0 + vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16u) + QIODevice (0x0x7fa3d7dbeaf8) 0 + primary-for QAbstractSocket (0x0x7fa3d7dbea90) + QObject (0x0x7fa3d7adca80) 0 + primary-for QIODevice (0x0x7fa3d7dbeaf8) + +Class QBluetoothSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothSocket::QPrivateSignal (0x0x7fa3d7adcf60) 0 empty + +Vtable for QBluetoothSocket +QBluetoothSocket::_ZTV16QBluetoothSocket: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothSocket) +16 (int (*)(...))QBluetoothSocket::metaObject +24 (int (*)(...))QBluetoothSocket::qt_metacast +32 (int (*)(...))QBluetoothSocket::qt_metacall +40 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +48 (int (*)(...))QBluetoothSocket::~QBluetoothSocket +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QBluetoothSocket::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QBluetoothSocket::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QBluetoothSocket::bytesAvailable +184 (int (*)(...))QBluetoothSocket::bytesToWrite +192 (int (*)(...))QBluetoothSocket::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBluetoothSocket::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBluetoothSocket::writeData + +Class QBluetoothSocket + size=24 align=8 + base size=24 base align=8 +QBluetoothSocket (0x0x7fa3d7dbed00) 0 + vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16u) + QIODevice (0x0x7fa3d7dbed68) 0 + primary-for QBluetoothSocket (0x0x7fa3d7dbed00) + QObject (0x0x7fa3d7adcf00) 0 + primary-for QIODevice (0x0x7fa3d7dbed68) + +Class QBluetoothServer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServer::QPrivateSignal (0x0x7fa3d7805060) 0 empty + +Vtable for QBluetoothServer +QBluetoothServer::_ZTV16QBluetoothServer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QBluetoothServer) +16 (int (*)(...))QBluetoothServer::metaObject +24 (int (*)(...))QBluetoothServer::qt_metacast +32 (int (*)(...))QBluetoothServer::qt_metacall +40 (int (*)(...))QBluetoothServer::~QBluetoothServer +48 (int (*)(...))QBluetoothServer::~QBluetoothServer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServer + size=24 align=8 + base size=24 base align=8 +QBluetoothServer (0x0x7fa3d7dbedd0) 0 + vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16u) + QObject (0x0x7fa3d7805000) 0 + primary-for QBluetoothServer (0x0x7fa3d7dbedd0) + +Class QBluetoothServiceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7fa3d7805120) 0 empty + +Vtable for QBluetoothServiceDiscoveryAgent +QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI31QBluetoothServiceDiscoveryAgent) +16 (int (*)(...))QBluetoothServiceDiscoveryAgent::metaObject +24 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacast +32 (int (*)(...))QBluetoothServiceDiscoveryAgent::qt_metacall +40 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +48 (int (*)(...))QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothServiceDiscoveryAgent + size=24 align=8 + base size=24 base align=8 +QBluetoothServiceDiscoveryAgent (0x0x7fa3d7dbee38) 0 + vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16u) + QObject (0x0x7fa3d78050c0) 0 + primary-for QBluetoothServiceDiscoveryAgent (0x0x7fa3d7dbee38) + +Class QBluetoothTransferManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferManager::QPrivateSignal (0x0x7fa3d78051e0) 0 empty + +Vtable for QBluetoothTransferManager +QBluetoothTransferManager::_ZTV25QBluetoothTransferManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QBluetoothTransferManager) +16 (int (*)(...))QBluetoothTransferManager::metaObject +24 (int (*)(...))QBluetoothTransferManager::qt_metacast +32 (int (*)(...))QBluetoothTransferManager::qt_metacall +40 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +48 (int (*)(...))QBluetoothTransferManager::~QBluetoothTransferManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QBluetoothTransferManager + size=16 align=8 + base size=16 base align=8 +QBluetoothTransferManager (0x0x7fa3d7dbeea0) 0 + vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16u) + QObject (0x0x7fa3d7805180) 0 + primary-for QBluetoothTransferManager (0x0x7fa3d7dbeea0) + +Class QBluetoothTransferRequest + size=8 align=8 + base size=8 base align=8 +QBluetoothTransferRequest (0x0x7fa3d7805240) 0 + +Class QBluetoothTransferReply::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferReply::QPrivateSignal (0x0x7fa3d7805300) 0 empty + +Vtable for QBluetoothTransferReply +QBluetoothTransferReply::_ZTV23QBluetoothTransferReply: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QBluetoothTransferReply) +16 (int (*)(...))QBluetoothTransferReply::metaObject +24 (int (*)(...))QBluetoothTransferReply::qt_metacast +32 (int (*)(...))QBluetoothTransferReply::qt_metacall +40 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +48 (int (*)(...))QBluetoothTransferReply::~QBluetoothTransferReply +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual + +Class QBluetoothTransferReply + size=24 align=8 + base size=24 base align=8 +QBluetoothTransferReply (0x0x7fa3d7dbef08) 0 + vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16u) + QObject (0x0x7fa3d78052a0) 0 + primary-for QBluetoothTransferReply (0x0x7fa3d7dbef08) + +Class QLowEnergyDescriptor + size=24 align=8 + base size=24 base align=8 +QLowEnergyDescriptor (0x0x7fa3d78054e0) 0 + +Class QLowEnergyCharacteristic + size=24 align=8 + base size=24 base align=8 +QLowEnergyCharacteristic (0x0x7fa3d78055a0) 0 + +Class QLowEnergyService::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyService::QPrivateSignal (0x0x7fa3d7805720) 0 empty + +Vtable for QLowEnergyService +QLowEnergyService::_ZTV17QLowEnergyService: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QLowEnergyService) +16 (int (*)(...))QLowEnergyService::metaObject +24 (int (*)(...))QLowEnergyService::qt_metacast +32 (int (*)(...))QLowEnergyService::qt_metacall +40 (int (*)(...))QLowEnergyService::~QLowEnergyService +48 (int (*)(...))QLowEnergyService::~QLowEnergyService +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLowEnergyService + size=32 align=8 + base size=32 base align=8 +QLowEnergyService (0x0x7fa3d7886068) 0 + vptr=((& QLowEnergyService::_ZTV17QLowEnergyService) + 16u) + QObject (0x0x7fa3d78056c0) 0 + primary-for QLowEnergyService (0x0x7fa3d7886068) + +Class QLowEnergyController::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyController::QPrivateSignal (0x0x7fa3d78057e0) 0 empty + +Vtable for QLowEnergyController +QLowEnergyController::_ZTV20QLowEnergyController: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QLowEnergyController) +16 (int (*)(...))QLowEnergyController::metaObject +24 (int (*)(...))QLowEnergyController::qt_metacast +32 (int (*)(...))QLowEnergyController::qt_metacall +40 (int (*)(...))QLowEnergyController::~QLowEnergyController +48 (int (*)(...))QLowEnergyController::~QLowEnergyController +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLowEnergyController + size=24 align=8 + base size=24 base align=8 +QLowEnergyController (0x0x7fa3d78860d0) 0 + vptr=((& QLowEnergyController::_ZTV20QLowEnergyController) + 16u) + QObject (0x0x7fa3d7805780) 0 + primary-for QLowEnergyController (0x0x7fa3d78860d0) + diff --git a/tests/auto/bic/data/QtNfc.5.2.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.2.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..6c1101a8 --- /dev/null +++ b/tests/auto/bic/data/QtNfc.5.2.0.linux-gcc-amd64.txt @@ -0,0 +1,3743 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f66e4f61060) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f66e4f610c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f66e4fa3c60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f66e4fa3cc0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f66e4f3b548) 0 empty + std::input_iterator_tag (0x0x7f66e4fa3d20) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f66e4f3b5b0) 0 empty + std::forward_iterator_tag (0x0x7f66e4f3b618) 0 empty + std::input_iterator_tag (0x0x7f66e4fa3d80) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f66e4f3b680) 0 empty + std::bidirectional_iterator_tag (0x0x7f66e4f3b6e8) 0 empty + std::forward_iterator_tag (0x0x7f66e4f3b750) 0 empty + std::input_iterator_tag (0x0x7f66e4fa3de0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f66e4fd6960) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f66e4fd6ba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f66e4fd6c60) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f66e4fd6cc0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f66e4fd6d80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f66e4fd6de0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f66e50bc2a0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f66e50bc300) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f66e50bc360) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f66e4f3ba90) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f66e50bc3c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f66e4f3ba90) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f66e4f3baf8) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f66e50bc420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f66e4f3baf8) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f66e50bc480) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f66e3eb27e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f66e3eb2840) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f66e3b52548) 0 + QBasicAtomicInteger (0x0x7f66e3bb64e0) 0 + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f66e3bb66c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f66e3bb6720) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7f66e38fd180) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f66e3948d80) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f66e3948e40) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f66e3948f60) 0 empty + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f66e3a11e40) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f66e37a8d80) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f66e3a25d68) 0 + QGenericArgument (0x0x7f66e37a8de0) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f66e37a8f60) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f66e381c0c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f66e381c300) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f66e381c360) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f66e381c420) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f66e381c480) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f66e381c7e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f66e381c840) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f66e381c9c0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f66e381cd80) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f66e381cde0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f66e33018a0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f66e3301900) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f66e33019c0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f66e3301a20) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f66e3301a80) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f66e3301ae0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f66e3301c00) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f66e3301c60) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f66e34d73c0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f66e34d74e0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f66e34d75a0) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f66e34d7540) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f66e34d7720) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f66e34d7900) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f66e34d7a80) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f66e34d7ae0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f66e34d7b40) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f66e34d7ba0) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7f66e30ad3a8) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7f66e2cf3000) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7f66e30ad3a8) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f66e2cf3060) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f66e2cf30c0) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f66e2cf3120) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f66e34d7f60) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f66e2cf32a0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f66e2cf3960) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f66e2c54820 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7f66e2c54e38 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f66e2968270 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7f66e2968340 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f66e2b2ed20) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f66e2a2c060) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f66e2a2c000) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f66e2a2c420) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f66e2799240) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f66e2968a28) 0 + std::iterator (0x0x7f66e2799300) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f66e2968a90) 0 + std::_Bit_iterator_base (0x0x7f66e2968af8) 0 + std::iterator (0x0x7f66e2799360) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f66e2968b60) 0 + std::_Bit_iterator_base (0x0x7f66e2968bc8) 0 + std::iterator (0x0x7f66e27993c0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f66e2799780) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f66e2799ba0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f66e2799c60) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f66e2799d20) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f66e266a180) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f66e266a4e0) 0 + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f66e266a900) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f66e266aae0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f66e266aba0) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f66e2484e40) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f66e20f3000) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f66e20f3180) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f66e20f3120) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f66e20f3480) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f66e20f3540) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f66e20e93a8) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f66e20f34e0) 0 + primary-for QAbstractAnimation (0x0x7f66e20e93a8) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f66e20f3600) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f66e20e9410) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f66e20f35a0) 0 + primary-for QAnimationDriver (0x0x7f66e20e9410) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f66e20f36c0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f66e20e9478) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f66e20e94e0) 0 + primary-for QAnimationGroup (0x0x7f66e20e9478) + QObject (0x0x7f66e20f3660) 0 + primary-for QAbstractAnimation (0x0x7f66e20e94e0) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f66e20f3780) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f66e20e9548) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f66e20e95b0) 0 + primary-for QParallelAnimationGroup (0x0x7f66e20e9548) + QAbstractAnimation (0x0x7f66e20e9618) 0 + primary-for QAnimationGroup (0x0x7f66e20e95b0) + QObject (0x0x7f66e20f3720) 0 + primary-for QAbstractAnimation (0x0x7f66e20e9618) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f66e20f3840) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f66e20e9680) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f66e20e96e8) 0 + primary-for QPauseAnimation (0x0x7f66e20e9680) + QObject (0x0x7f66e20f37e0) 0 + primary-for QAbstractAnimation (0x0x7f66e20e96e8) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f66e20f3a20) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f66e20f3ba0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f66e20f3c60) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f66e1fd3000) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7f66e20f3f60) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f66e1fd3060) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f66e1fd34e0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f66e20e9f08) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f66e1fd3480) 0 + primary-for QIODevice (0x0x7f66e20e9f08) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f66e1fd3600) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f66e1fd36c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f66e1fd37e0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f66e1fd3780) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f66e1d60000) 0 + QList (0x0x7f66e1fd3960) 0 + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f66e1fd3c00) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f66e1fd3cc0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f66e1fd3c60) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f66e1fd3d20) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f66e1fd3ba0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f66e1e62000) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f66e1e620c0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f66e1e62060) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f66e1e62180) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f66e1e62120) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f66e1e62cc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f66e1d60958) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f66e1d609c0) 0 + primary-for QVariantAnimation (0x0x7f66e1d60958) + QObject (0x0x7f66e1e62c60) 0 + primary-for QAbstractAnimation (0x0x7f66e1d609c0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f66e1e62d80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f66e1d60a90) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f66e1d60af8) 0 + primary-for QPropertyAnimation (0x0x7f66e1d60a90) + QAbstractAnimation (0x0x7f66e1d60b60) 0 + primary-for QVariantAnimation (0x0x7f66e1d60af8) + QObject (0x0x7f66e1e62d20) 0 + primary-for QAbstractAnimation (0x0x7f66e1d60b60) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f66e1e62e40) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f66e1d60bc8) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f66e1d60c30) 0 + primary-for QSequentialAnimationGroup (0x0x7f66e1d60bc8) + QAbstractAnimation (0x0x7f66e1d60c98) 0 + primary-for QAnimationGroup (0x0x7f66e1d60c30) + QObject (0x0x7f66e1e62de0) 0 + primary-for QAbstractAnimation (0x0x7f66e1d60c98) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f66e1e62f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f66e1e62ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f66e1b32060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f66e1b320c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f66e1b32120) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f66e1b323c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f66e1b32540) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f66e1b329c0) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f66e1ce0180) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f66e1ce0240) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f66e1ce0300) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f66e1ce0420) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f66e1ce04e0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f66e1975000) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f66e1975068) 0 + primary-for QBuffer (0x0x7f66e1975000) + QObject (0x0x7f66e1ce0480) 0 + primary-for QIODevice (0x0x7f66e1975068) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f66e1ce0540) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f66e1ce07e0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f66e1ce0840) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f66e1ce0900) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f66e1ce0ba0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f66e1ce0de0) 0 + +Class QDebug::Stream + size=72 align=8 + base size=72 base align=8 +QDebug::Stream (0x0x7f66e1723480) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f66e1723420) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f66e1723540) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f66e1723600) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f66e17236c0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f66e19753a8) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f66e1975410) 0 + primary-for QFileDevice (0x0x7f66e19753a8) + QObject (0x0x7f66e1723660) 0 + primary-for QIODevice (0x0x7f66e1975410) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f66e1723840) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f66e1975548) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f66e19755b0) 0 + primary-for QFile (0x0x7f66e1975548) + QIODevice (0x0x7f66e1975618) 0 + primary-for QFileDevice (0x0x7f66e19755b0) + QObject (0x0x7f66e17237e0) 0 + primary-for QIODevice (0x0x7f66e1975618) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f66e1723960) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f66e1723ba0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f66e1723e40) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f66e18e0060) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f66e1975a28) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f66e18e0000) 0 + primary-for QFileSelector (0x0x7f66e1975a28) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f66e18e0120) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f66e1975a90) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f66e18e00c0) 0 + primary-for QFileSystemWatcher (0x0x7f66e1975a90) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f66e18e0180) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f66e18e02a0) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f66e18e0300) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f66e18e0480) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f66e1975af8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f66e1975b60) 0 + primary-for QProcess (0x0x7f66e1975af8) + QObject (0x0x7f66e18e0420) 0 + primary-for QIODevice (0x0x7f66e1975b60) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f66e18e04e0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f66e18e0660) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f66e1975bc8) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f66e1975c30) 0 + primary-for QSaveFile (0x0x7f66e1975bc8) + QIODevice (0x0x7f66e1975c98) 0 + primary-for QFileDevice (0x0x7f66e1975c30) + QObject (0x0x7f66e18e0600) 0 + primary-for QIODevice (0x0x7f66e1975c98) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f66e18e0720) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f66e1975d00) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f66e18e06c0) 0 + primary-for QSettings (0x0x7f66e1975d00) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f66e18e0780) 0 empty + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f66e18e08a0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f66e18e09c0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f66e1975e38) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f66e1975ea0) 0 + primary-for QTemporaryFile (0x0x7f66e1975e38) + QFileDevice (0x0x7f66e1975f08) 0 + primary-for QFile (0x0x7f66e1975ea0) + QIODevice (0x0x7f66e1975f70) 0 + primary-for QFileDevice (0x0x7f66e1975f08) + QObject (0x0x7f66e18e0960) 0 + primary-for QIODevice (0x0x7f66e1975f70) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f66e18e0ae0) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f66e18e0ea0) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f66e169d000) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f66e169d0c0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f66e169d1e0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f66e161e1a0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f66e169d180) 0 + primary-for QAbstractItemModel (0x0x7f66e161e1a0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f66e169d4e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f66e161e2d8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f66e161e340) 0 + primary-for QAbstractTableModel (0x0x7f66e161e2d8) + QObject (0x0x7f66e169d480) 0 + primary-for QAbstractItemModel (0x0x7f66e161e340) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f66e169d5a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f66e161e3a8) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f66e161e410) 0 + primary-for QAbstractListModel (0x0x7f66e161e3a8) + QObject (0x0x7f66e169d540) 0 + primary-for QAbstractItemModel (0x0x7f66e161e410) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f66e169d660) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f66e161e478) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f66e161e4e0) 0 + primary-for QAbstractProxyModel (0x0x7f66e161e478) + QObject (0x0x7f66e169d600) 0 + primary-for QAbstractItemModel (0x0x7f66e161e4e0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f66e169d720) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f66e161e548) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f66e161e5b0) 0 + primary-for QIdentityProxyModel (0x0x7f66e161e548) + QAbstractItemModel (0x0x7f66e161e618) 0 + primary-for QAbstractProxyModel (0x0x7f66e161e5b0) + QObject (0x0x7f66e169d6c0) 0 + primary-for QAbstractItemModel (0x0x7f66e161e618) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f66e169d780) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f66e169d8a0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f66e161e680) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f66e169d840) 0 + primary-for QItemSelectionModel (0x0x7f66e161e680) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f66e161e7b8) 0 + QList (0x0x7f66e169da80) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f66e169db40) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f66e161e820) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f66e161e888) 0 + primary-for QSortFilterProxyModel (0x0x7f66e161e820) + QAbstractItemModel (0x0x7f66e161e8f0) 0 + primary-for QAbstractProxyModel (0x0x7f66e161e888) + QObject (0x0x7f66e169dae0) 0 + primary-for QAbstractItemModel (0x0x7f66e161e8f0) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f66e169dc00) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f66e161e958) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f66e161e9c0) 0 + primary-for QStringListModel (0x0x7f66e161e958) + QAbstractItemModel (0x0x7f66e161ea28) 0 + primary-for QAbstractListModel (0x0x7f66e161e9c0) + QObject (0x0x7f66e169dba0) 0 + primary-for QAbstractItemModel (0x0x7f66e161ea28) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f66e169dc60) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f66e169dd20) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f66e169de40) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f66e169dea0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f66e169dde0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f66e169df00) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f66e169df60) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f66e1119060) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f66e11190c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f66e1119000) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f66e11191e0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f66e161ea90) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f66e1119180) 0 + primary-for QEventLoop (0x0x7f66e161ea90) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f66e1119300) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f66e11193c0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f66e1119420) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f66e161ebc8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f66e1119360) 0 + primary-for QAbstractEventDispatcher (0x0x7f66e161ebc8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f66e1119480) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f66e11194e0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f66e11195a0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f66e161ec30) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f66e1119600) 0 + primary-for QTimerEvent (0x0x7f66e161ec30) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f66e161ec98) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f66e1119660) 0 + primary-for QChildEvent (0x0x7f66e161ec98) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f66e161ed00) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f66e11196c0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f66e161ed00) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f66e161ed68) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f66e1119720) 0 + primary-for QDeferredDeleteEvent (0x0x7f66e161ed68) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f66e11197e0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f66e161edd0) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f66e1119780) 0 + primary-for QCoreApplication (0x0x7f66e161edd0) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f66e1119840) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f66e11198a0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f66e1119960) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f66e1119a20) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f66e1119a80) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f66e1119ba0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f66e161ef08) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f66e1119b40) 0 + primary-for QMimeData (0x0x7f66e161ef08) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f66e1119c60) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f66e161ef70) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f66e1119c00) 0 + primary-for QObjectCleanupHandler (0x0x7f66e161ef70) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f66e1119ea0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f66e12cc000) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f66e1119e40) 0 + primary-for QSharedMemory (0x0x7f66e12cc000) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f66e1119f60) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f66e12cc068) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f66e1119f00) 0 + primary-for QSignalMapper (0x0x7f66e12cc068) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f66e0ef4060) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f66e12cc0d0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f66e0ef4000) 0 + primary-for QSocketNotifier (0x0x7f66e12cc0d0) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f66e0ef40c0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f66e0ef41e0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f66e12cc138) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f66e0ef4180) 0 + primary-for QTimer (0x0x7f66e12cc138) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f66e0ef4300) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f66e12cc1a0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f66e0ef42a0) 0 + primary-for QTranslator (0x0x7f66e12cc1a0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f66e0ef4360) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f66e0ef4480) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f66e0ef44e0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f66e0ef4600) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f66e12cc208) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f66e0ef45a0) 0 + primary-for QLibrary (0x0x7f66e12cc208) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f66e0ef4720) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f66e0ef4840) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f66e12cc340) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f66e0ef47e0) 0 + primary-for QPluginLoader (0x0x7f66e12cc340) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f66e0ef48a0) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f66e0ef49c0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f66e12cc3a8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f66e0ef4960) 0 + primary-for QAbstractState (0x0x7f66e12cc3a8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f66e0ef4a80) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f66e12cc410) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f66e0ef4a20) 0 + primary-for QAbstractTransition (0x0x7f66e12cc410) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f66e0ef4b40) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f66e12cc478) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f66e12cc4e0) 0 + primary-for QEventTransition (0x0x7f66e12cc478) + QObject (0x0x7f66e0ef4ae0) 0 + primary-for QAbstractTransition (0x0x7f66e12cc4e0) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f66e0ef4c00) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f66e12cc548) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f66e12cc5b0) 0 + primary-for QFinalState (0x0x7f66e12cc548) + QObject (0x0x7f66e0ef4ba0) 0 + primary-for QAbstractState (0x0x7f66e12cc5b0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f66e0ef4cc0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f66e12cc618) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f66e12cc680) 0 + primary-for QHistoryState (0x0x7f66e12cc618) + QObject (0x0x7f66e0ef4c60) 0 + primary-for QAbstractState (0x0x7f66e12cc680) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f66e0ef4d80) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f66e12cc6e8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f66e12cc750) 0 + primary-for QSignalTransition (0x0x7f66e12cc6e8) + QObject (0x0x7f66e0ef4d20) 0 + primary-for QAbstractTransition (0x0x7f66e12cc750) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f66e0ef4e40) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f66e12cc7b8) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f66e12cc820) 0 + primary-for QState (0x0x7f66e12cc7b8) + QObject (0x0x7f66e0ef4de0) 0 + primary-for QAbstractState (0x0x7f66e12cc820) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f66e0ef4f60) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f66e12cc9c0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f66e1041000) 0 + primary-for QStateMachine::SignalEvent (0x0x7f66e12cc9c0) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f66e12cca28) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f66e1041060) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f66e12cca28) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f66e12cc888) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f66e12cc8f0) 0 + primary-for QStateMachine (0x0x7f66e12cc888) + QAbstractState (0x0x7f66e12cc958) 0 + primary-for QState (0x0x7f66e12cc8f0) + QObject (0x0x7f66e0ef4f00) 0 + primary-for QAbstractState (0x0x7f66e12cc958) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f66e12cca90) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f66e10410c0) 0 nearly-empty + primary-for QException (0x0x7f66e12cca90) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f66e12ccaf8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f66e12ccb60) 0 nearly-empty + primary-for QUnhandledException (0x0x7f66e12ccaf8) + std::exception (0x0x7f66e1041120) 0 nearly-empty + primary-for QException (0x0x7f66e12ccb60) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f66e1041180) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f66e1041240) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f66e10412a0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f66e1041300) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f66e12ccd00) 0 + QBasicMutex (0x0x7f66e1041420) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f66e1041480) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f66e10414e0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f66e1041540) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f66e10416c0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f66e1041780) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f66e1041ae0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f66e0cea618) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f66e1041a80) 0 + primary-for QFutureWatcherBase (0x0x7f66e0cea618) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f66e1041c00) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f66e1041c60) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f66e1041d20) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f66e1041de0) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f66e1041ea0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f66e0cea9c0) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f66e1041e40) 0 + primary-for QThread (0x0x7f66e0cea9c0) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f66e1041f60) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f66e0ceaa28) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f66e1041f00) 0 + primary-for QThreadPool (0x0x7f66e0ceaa28) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f66e0dfa000) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f66e0dfa0c0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f66e0e377e0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f66e0e37840) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f66e0e37960) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f66e0e37900) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f66e0e37ae0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f66e0e37ba0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f66e0e37cc0) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f66e0e37de0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f66e0e37e40) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f66e0e37ea0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f66e0e37f00) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f66e0b68000) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f66e0b680c0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f66e0b68180) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7f66e0b68240) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f66e0b685a0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f66e0b68660) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f66e0b68720) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f66e0b687e0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f66e0b688a0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f66e0b68960) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f66e0b68a20) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f66e0b68cc0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f66e0b68de0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f66e0a99000) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f66e0a99a20) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f66e0a99ba0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f66e09ffbc8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f66e0a99b40) 0 + primary-for QTimeLine (0x0x7f66e09ffbc8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f66e0a99c60) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f66e0a99c00) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f66e0a99de0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f66e0a99e40) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f66e09ffd00) 0 + QVector (0x0x7f66e07b9000) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f66e07b9060) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f66e07b9120) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f66e07b91e0) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f66e07b92a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f66e07b9300) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f66e07b9420) 0 + +Class QNdefRecord + size=8 align=8 + base size=8 base align=8 +QNdefRecord (0x0x7f66e07b9540) 0 + +Class QNdefFilter::Record + size=24 align=8 + base size=24 base align=8 +QNdefFilter::Record (0x0x7f66e07b9660) 0 + +Class QNdefFilter + size=8 align=8 + base size=8 base align=8 +QNdefFilter (0x0x7f66e07b9600) 0 + +Class QNdefMessage + size=8 align=8 + base size=8 base align=8 +QNdefMessage (0x0x7f66e09ffd68) 0 + QList (0x0x7f66e07b97e0) 0 + +Class QNdefNfcTextRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcTextRecord (0x0x7f66e09ffdd0) 0 + QNdefRecord (0x0x7f66e07b9960) 0 + +Class QNdefNfcUriRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcUriRecord (0x0x7f66e09ffe38) 0 + QNdefRecord (0x0x7f66e07b99c0) 0 + +Class QNdefNfcIconRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcIconRecord (0x0x7f66e09ffea0) 0 + QNdefRecord (0x0x7f66e07b9a20) 0 + +Class QNdefNfcSmartPosterRecord + size=16 align=8 + base size=16 base align=8 +QNdefNfcSmartPosterRecord (0x0x7f66e09fff08) 0 + QNdefRecord (0x0x7f66e07b9a80) 0 + +Class QNearFieldTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldTarget::QPrivateSignal (0x0x7f66e07b9ba0) 0 empty + +Class QNearFieldTarget::RequestId + size=8 align=8 + base size=8 base align=8 +QNearFieldTarget::RequestId (0x0x7f66e07b9c00) 0 + +Vtable for QNearFieldTarget +QNearFieldTarget::_ZTV16QNearFieldTarget: 25u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QNearFieldTarget) +16 (int (*)(...))QNearFieldTarget::metaObject +24 (int (*)(...))QNearFieldTarget::qt_metacast +32 (int (*)(...))QNearFieldTarget::qt_metacall +40 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +48 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))QNearFieldTarget::url +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QNearFieldTarget::hasNdefMessage +152 (int (*)(...))QNearFieldTarget::readNdefMessages +160 (int (*)(...))QNearFieldTarget::writeNdefMessages +168 (int (*)(...))QNearFieldTarget::sendCommand +176 (int (*)(...))QNearFieldTarget::sendCommands +184 (int (*)(...))QNearFieldTarget::waitForRequestCompleted +192 (int (*)(...))QNearFieldTarget::handleResponse + +Class QNearFieldTarget + size=24 align=8 + base size=24 base align=8 +QNearFieldTarget (0x0x7f66e09fff70) 0 + vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16u) + QObject (0x0x7f66e07b9b40) 0 + primary-for QNearFieldTarget (0x0x7f66e09fff70) + +Class QNearFieldManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldManager::QPrivateSignal (0x0x7f66e051e060) 0 empty + +Vtable for QNearFieldManager +QNearFieldManager::_ZTV17QNearFieldManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QNearFieldManager) +16 (int (*)(...))QNearFieldManager::metaObject +24 (int (*)(...))QNearFieldManager::qt_metacast +32 (int (*)(...))QNearFieldManager::qt_metacall +40 (int (*)(...))QNearFieldManager::~QNearFieldManager +48 (int (*)(...))QNearFieldManager::~QNearFieldManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldManager + size=24 align=8 + base size=24 base align=8 +QNearFieldManager (0x0x7f66e04fb0d0) 0 + vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16u) + QObject (0x0x7f66e051e000) 0 + primary-for QNearFieldManager (0x0x7f66e04fb0d0) + +Class QQmlNdefRecord::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QQmlNdefRecord::QPrivateSignal (0x0x7f66e051e1e0) 0 empty + +Vtable for QQmlNdefRecord +QQmlNdefRecord::_ZTV14QQmlNdefRecord: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QQmlNdefRecord) +16 (int (*)(...))QQmlNdefRecord::metaObject +24 (int (*)(...))QQmlNdefRecord::qt_metacast +32 (int (*)(...))QQmlNdefRecord::qt_metacall +40 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +48 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QQmlNdefRecord + size=24 align=8 + base size=24 base align=8 +QQmlNdefRecord (0x0x7f66e04fb270) 0 + vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16u) + QObject (0x0x7f66e051e180) 0 + primary-for QQmlNdefRecord (0x0x7f66e04fb270) + diff --git a/tests/auto/bic/data/QtNfc.5.3.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.3.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..54223b9b --- /dev/null +++ b/tests/auto/bic/data/QtNfc.5.3.0.linux-gcc-amd64.txt @@ -0,0 +1,3814 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f0268081f00) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f0268081f60) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f026701ab40) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f026701aba0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f0266faf5b0) 0 empty + std::input_iterator_tag (0x0x7f026701ac00) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f0266faf618) 0 empty + std::forward_iterator_tag (0x0x7f0266faf680) 0 empty + std::input_iterator_tag (0x0x7f026701ac60) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f0266faf6e8) 0 empty + std::bidirectional_iterator_tag (0x0x7f0266faf750) 0 empty + std::forward_iterator_tag (0x0x7f0266faf7b8) 0 empty + std::input_iterator_tag (0x0x7f026701acc0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f0267072840) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f0267072a80) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f0267072b40) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f0267072ba0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f0267072c60) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f0267072cc0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f0267134180) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f02671341e0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f0267134240) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f0266fafaf8) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f02671342a0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f0266fafaf8) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f0266fafb60) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f0267134300) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f0266fafb60) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f0267134360) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f0265f3c6c0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f0265f3c720) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7f0265f3c900) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f0265ca2060) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f0265ca20c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f0265ca2120) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f0265ca2180) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f0265ca22a0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f0265ac9138) 0 + QAtomicInteger (0x0x7f0265ac91a0) 0 + QBasicAtomicInteger (0x0x7f0265ca2d80) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f026577eea0) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f0265929de0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f026588a2d8) 0 + QGenericArgument (0x0x7f0265929e40) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f026558e000) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f026558e120) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f026558e360) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f026558e3c0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f026558e4e0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f026558e540) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f026558e8a0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f026558e900) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f026558ea80) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f026558eea0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f026558ef00) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f026548b9c0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f026548ba20) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f026548bae0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f026548bb40) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f026548bba0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f026548bc00) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f026548bd20) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f026548bd80) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f02651934e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f0265193660) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f0265193720) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f02651936c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f02651938a0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f0265193b40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f0265193d20) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f0265193d80) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f0265193de0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f0265193e40) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7f026531ebc8) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7f0264e542a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7f026531ebc8) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f0264e54300) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f0264e54360) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f0264e543c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f0264e54240) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f0264e54540) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f0264e54c00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f0264ab26e8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7f0264ab27b8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f0264ab2a90 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7f0264ab2b60 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f0264b3c000) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f0264b3c300) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f0264b3c2a0) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f0264b3c6c0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f026492e420) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f0264ab29c0) 0 + std::iterator (0x0x7f026492e4e0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f0264ab2c98) 0 + std::_Bit_iterator_base (0x0x7f0264ab2d00) 0 + std::iterator (0x0x7f026492e540) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f0264ab2d68) 0 + std::_Bit_iterator_base (0x0x7f02645f2000) 0 + std::iterator (0x0x7f026492e5a0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f026492e960) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f026492ed80) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f026492ee40) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f026492ef00) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f026440c360) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f026440c6c0) 0 + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f026440cae0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f026440ccc0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f026440cd80) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f026427d060) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f026427d1e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f026427d360) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f026427d300) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f026427d660) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f026427d6c0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f026427d780) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f0264501b60) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f026427d720) 0 + primary-for QAbstractAnimation (0x0x7f0264501b60) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f026427d840) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f0264501bc8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f026427d7e0) 0 + primary-for QAnimationDriver (0x0x7f0264501bc8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f026427d900) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f0264501c30) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f0264501c98) 0 + primary-for QAnimationGroup (0x0x7f0264501c30) + QObject (0x0x7f026427d8a0) 0 + primary-for QAbstractAnimation (0x0x7f0264501c98) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f026427d9c0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f0264501d00) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f0264501d68) 0 + primary-for QParallelAnimationGroup (0x0x7f0264501d00) + QAbstractAnimation (0x0x7f0264501dd0) 0 + primary-for QAnimationGroup (0x0x7f0264501d68) + QObject (0x0x7f026427d960) 0 + primary-for QAbstractAnimation (0x0x7f0264501dd0) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f026427da80) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f0264501e38) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f0264501ea0) 0 + primary-for QPauseAnimation (0x0x7f0264501e38) + QObject (0x0x7f026427da20) 0 + primary-for QAbstractAnimation (0x0x7f0264501ea0) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f026427dc60) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f026427de40) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f026427df00) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f02640ad2a0) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7f02640ad240) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f02640ad300) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f02640ad7e0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f026400a7b8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f02640ad780) 0 + primary-for QIODevice (0x0x7f026400a7b8) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f02640ad900) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f02640ad9c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f02640adb40) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f02640adae0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f026400a958) 0 + QList (0x0x7f02640adcc0) 0 + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f0263b88000) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f0263b880c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f0263b88060) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f0263b88120) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f02640adf60) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f0263b883c0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f0263b88480) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f0263b88420) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f0263b88540) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f0263b884e0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f0263c9c120) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f0263c7c340) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f0263c7c3a8) 0 + primary-for QVariantAnimation (0x0x7f0263c7c340) + QObject (0x0x7f0263c9c0c0) 0 + primary-for QAbstractAnimation (0x0x7f0263c7c3a8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f0263c9c1e0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f0263c7c478) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f0263c7c4e0) 0 + primary-for QPropertyAnimation (0x0x7f0263c7c478) + QAbstractAnimation (0x0x7f0263c7c548) 0 + primary-for QVariantAnimation (0x0x7f0263c7c4e0) + QObject (0x0x7f0263c9c180) 0 + primary-for QAbstractAnimation (0x0x7f0263c7c548) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f0263c9c2a0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f0263c7c5b0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f0263c7c618) 0 + primary-for QSequentialAnimationGroup (0x0x7f0263c7c5b0) + QAbstractAnimation (0x0x7f0263c7c680) 0 + primary-for QAnimationGroup (0x0x7f0263c7c618) + QObject (0x0x7f0263c9c240) 0 + primary-for QAbstractAnimation (0x0x7f0263c7c680) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f0263c9c360) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f0263c9c300) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f0263c9c480) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f0263c9c4e0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f0263c9c540) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f0263c9c7e0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f0263c9c960) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f0263c9cde0) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f0263a575a0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f0263a576c0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f0263a577e0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f0263a57960) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f0263a57a20) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f0263c7cc98) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f0263c7cd00) 0 + primary-for QBuffer (0x0x7f0263c7cc98) + QObject (0x0x7f0263a579c0) 0 + primary-for QIODevice (0x0x7f0263c7cd00) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f0263a57a80) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f0263a57d80) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f0263a57de0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f0263a57ea0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f026382a180) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f026382a3c0) 0 + +Class QDebug::Stream + size=72 align=8 + base size=72 base align=8 +QDebug::Stream (0x0x7f026382aa20) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f026382a9c0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f026382ab40) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f026382ac00) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f026382acc0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f0263c7ca90) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f0263c7c9c0) 0 + primary-for QFileDevice (0x0x7f0263c7ca90) + QObject (0x0x7f026382ac60) 0 + primary-for QIODevice (0x0x7f0263c7c9c0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f026382ae40) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f02635ae0d0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f02635ae138) 0 + primary-for QFile (0x0x7f02635ae0d0) + QIODevice (0x0x7f02635ae1a0) 0 + primary-for QFileDevice (0x0x7f02635ae138) + QObject (0x0x7f026382ade0) 0 + primary-for QIODevice (0x0x7f02635ae1a0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f026382af60) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f02635fb240) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f02635fb540) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f02635fb720) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f02635ae680) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f02635fb6c0) 0 + primary-for QFileSelector (0x0x7f02635ae680) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f02635fb7e0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f02635ae6e8) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f02635fb780) 0 + primary-for QFileSystemWatcher (0x0x7f02635ae6e8) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f02635fb840) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f02635fb960) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f02635fb9c0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f02635fbba0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f02635ae7b8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f02635ae820) 0 + primary-for QProcess (0x0x7f02635ae7b8) + QObject (0x0x7f02635fbb40) 0 + primary-for QIODevice (0x0x7f02635ae820) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f02635fbc00) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f02635fbd80) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f02635ae888) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f02635ae8f0) 0 + primary-for QSaveFile (0x0x7f02635ae888) + QIODevice (0x0x7f02635ae958) 0 + primary-for QFileDevice (0x0x7f02635ae8f0) + QObject (0x0x7f02635fbd20) 0 + primary-for QIODevice (0x0x7f02635ae958) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f02635fbe40) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f02635ae9c0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f02635fbde0) 0 + primary-for QSettings (0x0x7f02635ae9c0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f02635fbea0) 0 empty + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f026337e000) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f026337e120) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f02635aeaf8) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f02635aeb60) 0 + primary-for QTemporaryFile (0x0x7f02635aeaf8) + QFileDevice (0x0x7f02635aebc8) 0 + primary-for QFile (0x0x7f02635aeb60) + QIODevice (0x0x7f02635aec30) 0 + primary-for QFileDevice (0x0x7f02635aebc8) + QObject (0x0x7f026337e0c0) 0 + primary-for QIODevice (0x0x7f02635aec30) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f026337e240) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f026337e660) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f026337e7e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f026337e900) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f026337ea80) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f026348f068) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f026337ea20) 0 + primary-for QAbstractItemModel (0x0x7f026348f068) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f026337ed80) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f026348f1a0) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f026348f208) 0 + primary-for QAbstractTableModel (0x0x7f026348f1a0) + QObject (0x0x7f026337ed20) 0 + primary-for QAbstractItemModel (0x0x7f026348f208) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f026337ee40) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f026348f270) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f026348f2d8) 0 + primary-for QAbstractListModel (0x0x7f026348f270) + QObject (0x0x7f026337ede0) 0 + primary-for QAbstractItemModel (0x0x7f026348f2d8) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f026337ef00) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f026348f340) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f026348f3a8) 0 + primary-for QAbstractProxyModel (0x0x7f026348f340) + QObject (0x0x7f026337eea0) 0 + primary-for QAbstractItemModel (0x0x7f026348f3a8) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f0263173000) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f026348f410) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f026348f478) 0 + primary-for QIdentityProxyModel (0x0x7f026348f410) + QAbstractItemModel (0x0x7f026348f4e0) 0 + primary-for QAbstractProxyModel (0x0x7f026348f478) + QObject (0x0x7f026337ef60) 0 + primary-for QAbstractItemModel (0x0x7f026348f4e0) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f0263173060) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f02631731e0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f026348f5b0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f0263173180) 0 + primary-for QItemSelectionModel (0x0x7f026348f5b0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f026348f6e8) 0 + QList (0x0x7f02631733c0) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f0263173480) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f026348f750) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f026348f7b8) 0 + primary-for QSortFilterProxyModel (0x0x7f026348f750) + QAbstractItemModel (0x0x7f026348f820) 0 + primary-for QAbstractProxyModel (0x0x7f026348f7b8) + QObject (0x0x7f0263173420) 0 + primary-for QAbstractItemModel (0x0x7f026348f820) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f0263173540) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f026348f888) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f026348f8f0) 0 + primary-for QStringListModel (0x0x7f026348f888) + QAbstractItemModel (0x0x7f026348f958) 0 + primary-for QAbstractListModel (0x0x7f026348f8f0) + QObject (0x0x7f02631734e0) 0 + primary-for QAbstractItemModel (0x0x7f026348f958) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f02631735a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f0263173660) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f0263173780) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f02631737e0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f0263173720) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f0263173840) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f02631738a0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f0263173960) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f02631739c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f0263173900) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f0263173ae0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f026348f9c0) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f0263173a80) 0 + primary-for QEventLoop (0x0x7f026348f9c0) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f0263173c00) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f0263173cc0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f0263173d20) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f026348faf8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f0263173c60) 0 + primary-for QAbstractEventDispatcher (0x0x7f026348faf8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f0263173d80) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f0263173de0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f0263173f00) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f026348fbc8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f0263173f60) 0 + primary-for QTimerEvent (0x0x7f026348fbc8) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f026348fc30) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f0262fa2000) 0 + primary-for QChildEvent (0x0x7f026348fc30) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f026348fc98) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f0262fa2060) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f026348fc98) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f026348fd00) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f0262fa20c0) 0 + primary-for QDeferredDeleteEvent (0x0x7f026348fd00) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f0262fa2180) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f026348fd68) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f0262fa2120) 0 + primary-for QCoreApplication (0x0x7f026348fd68) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f0262fa21e0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f0262fa2240) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f0262fa2360) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f0262fa2480) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f0262fa24e0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f0262fa2660) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f0263073000) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f0262fa2600) 0 + primary-for QMimeData (0x0x7f0263073000) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f0262fa2720) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f0263073068) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f0262fa26c0) 0 + primary-for QObjectCleanupHandler (0x0x7f0263073068) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f0262fa2960) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f02630730d0) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f0262fa2900) 0 + primary-for QSharedMemory (0x0x7f02630730d0) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f0262fa2a20) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f0263073138) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f0262fa29c0) 0 + primary-for QSignalMapper (0x0x7f0263073138) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f0262fa2ae0) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f02630731a0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f0262fa2a80) 0 + primary-for QSocketNotifier (0x0x7f02630731a0) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f0262fa2b40) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f0262fa2c60) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f0263073208) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f0262fa2c00) 0 + primary-for QTimer (0x0x7f0263073208) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f0262fa2d80) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f0263073270) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f0262fa2d20) 0 + primary-for QTranslator (0x0x7f0263073270) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f0262fa2de0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f0262fa2f60) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f0263137000) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f0263137120) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f0263073340) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f02631370c0) 0 + primary-for QLibrary (0x0x7f0263073340) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f0263137240) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f02631373c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f02630734e0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f0263137360) 0 + primary-for QPluginLoader (0x0x7f02630734e0) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f0263137420) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f02631375a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f02630735b0) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f0263137540) 0 + primary-for QAbstractState (0x0x7f02630735b0) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f0263137660) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f0263073618) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f0263137600) 0 + primary-for QAbstractTransition (0x0x7f0263073618) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f0263137720) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f0263073680) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f02630736e8) 0 + primary-for QEventTransition (0x0x7f0263073680) + QObject (0x0x7f02631376c0) 0 + primary-for QAbstractTransition (0x0x7f02630736e8) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f02631377e0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f0263073750) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f02630737b8) 0 + primary-for QFinalState (0x0x7f0263073750) + QObject (0x0x7f0263137780) 0 + primary-for QAbstractState (0x0x7f02630737b8) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f02631378a0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f0263073820) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f0263073888) 0 + primary-for QHistoryState (0x0x7f0263073820) + QObject (0x0x7f0263137840) 0 + primary-for QAbstractState (0x0x7f0263073888) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f0263137960) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f02630738f0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f0263073958) 0 + primary-for QSignalTransition (0x0x7f02630738f0) + QObject (0x0x7f0263137900) 0 + primary-for QAbstractTransition (0x0x7f0263073958) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f0263137a20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f02630739c0) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f0263073a28) 0 + primary-for QState (0x0x7f02630739c0) + QObject (0x0x7f02631379c0) 0 + primary-for QAbstractState (0x0x7f0263073a28) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f0263137b40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f0263073bc8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f0263137ba0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f0263073bc8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f0263073c30) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f0263137c00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f0263073c30) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f0263073a90) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f0263073af8) 0 + primary-for QStateMachine (0x0x7f0263073a90) + QAbstractState (0x0x7f0263073b60) 0 + primary-for QState (0x0x7f0263073af8) + QObject (0x0x7f0263137ae0) 0 + primary-for QAbstractState (0x0x7f0263073b60) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f0263073c98) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f0263137c60) 0 nearly-empty + primary-for QException (0x0x7f0263073c98) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f0263073d00) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f0263073d68) 0 nearly-empty + primary-for QUnhandledException (0x0x7f0263073d00) + std::exception (0x0x7f0263137cc0) 0 nearly-empty + primary-for QException (0x0x7f0263073d68) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f0263137d20) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f0263137de0) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f0263137e40) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f0263137ea0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f0263073f08) 0 + QBasicMutex (0x0x7f0262e75000) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f0262e75060) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f0262e750c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f0262e75120) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f0262e752a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f0262e75360) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f0262e756c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f0262eb9820) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f0262e75660) 0 + primary-for QFutureWatcherBase (0x0x7f0262eb9820) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f0262e757e0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f0262e75840) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f0262e758a0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f0262e75900) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f0262e759c0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f0262eb9bc8) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f0262e75960) 0 + primary-for QThread (0x0x7f0262eb9bc8) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f0262e75a80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f0262eb9c30) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f0262e75a20) 0 + primary-for QThreadPool (0x0x7f0262eb9c30) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f0262e75ae0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f0262e75ba0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f0262c31180) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f0262c311e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f0262c31360) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f0262c31300) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f0262c314e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f0262c315a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f0262c31780) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f0262c31900) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f0262c31960) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f0262c319c0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f0262c31a20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f0262c31b40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f0262c31c60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f0262c31d80) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7f0262c31ea0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f02629e4240) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f02629e4360) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f02629e4480) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f02629e4540) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f02629e4660) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f02629e4780) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f02629e48a0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f02629e49c0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f02629e4cc0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f02629e4e40) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f02628ca0c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f02628caae0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f02628cac60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f026291c548) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f02628cac00) 0 + primary-for QTimeLine (0x0x7f026291c548) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f02628cad20) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f02628cacc0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f02628caf60) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f02625c3000) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f026291c7b8) 0 + QVector (0x0x7f02625c31e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f02625c3240) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f02625c3360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f02625c3480) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f02625c35a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f02625c3600) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f02625c3720) 0 + +Class QNdefRecord + size=8 align=8 + base size=8 base align=8 +QNdefRecord (0x0x7f02625c3840) 0 + +Class QNdefFilter::Record + size=24 align=8 + base size=24 base align=8 +QNdefFilter::Record (0x0x7f02625c3960) 0 + +Class QNdefFilter + size=8 align=8 + base size=8 base align=8 +QNdefFilter (0x0x7f02625c3900) 0 + +Class QNdefMessage + size=8 align=8 + base size=8 base align=8 +QNdefMessage (0x0x7f026291c958) 0 + QList (0x0x7f02625c3ae0) 0 + +Class QNdefNfcTextRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcTextRecord (0x0x7f026291c9c0) 0 + QNdefRecord (0x0x7f02625c3c60) 0 + +Class QNdefNfcUriRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcUriRecord (0x0x7f026291ca28) 0 + QNdefRecord (0x0x7f02625c3cc0) 0 + +Class QNdefNfcIconRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcIconRecord (0x0x7f026291ca90) 0 + QNdefRecord (0x0x7f02625c3d20) 0 + +Class QNdefNfcSmartPosterRecord + size=16 align=8 + base size=16 base align=8 +QNdefNfcSmartPosterRecord (0x0x7f026291caf8) 0 + QNdefRecord (0x0x7f02625c3d80) 0 + +Class QNearFieldTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldTarget::QPrivateSignal (0x0x7f02625c3ea0) 0 empty + +Class QNearFieldTarget::RequestId + size=8 align=8 + base size=8 base align=8 +QNearFieldTarget::RequestId (0x0x7f02625c3f00) 0 + +Vtable for QNearFieldTarget +QNearFieldTarget::_ZTV16QNearFieldTarget: 25u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QNearFieldTarget) +16 (int (*)(...))QNearFieldTarget::metaObject +24 (int (*)(...))QNearFieldTarget::qt_metacast +32 (int (*)(...))QNearFieldTarget::qt_metacall +40 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +48 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))QNearFieldTarget::url +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QNearFieldTarget::hasNdefMessage +152 (int (*)(...))QNearFieldTarget::readNdefMessages +160 (int (*)(...))QNearFieldTarget::writeNdefMessages +168 (int (*)(...))QNearFieldTarget::sendCommand +176 (int (*)(...))QNearFieldTarget::sendCommands +184 (int (*)(...))QNearFieldTarget::waitForRequestCompleted +192 (int (*)(...))QNearFieldTarget::handleResponse + +Class QNearFieldTarget + size=24 align=8 + base size=24 base align=8 +QNearFieldTarget (0x0x7f026291cb60) 0 + vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16u) + QObject (0x0x7f02625c3e40) 0 + primary-for QNearFieldTarget (0x0x7f026291cb60) + +Class QNearFieldManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldManager::QPrivateSignal (0x0x7f0262742360) 0 empty + +Vtable for QNearFieldManager +QNearFieldManager::_ZTV17QNearFieldManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QNearFieldManager) +16 (int (*)(...))QNearFieldManager::metaObject +24 (int (*)(...))QNearFieldManager::qt_metacast +32 (int (*)(...))QNearFieldManager::qt_metacall +40 (int (*)(...))QNearFieldManager::~QNearFieldManager +48 (int (*)(...))QNearFieldManager::~QNearFieldManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldManager + size=24 align=8 + base size=24 base align=8 +QNearFieldManager (0x0x7f026291cc98) 0 + vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16u) + QObject (0x0x7f0262742300) 0 + primary-for QNearFieldManager (0x0x7f026291cc98) + +Class QNearFieldShareManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareManager::QPrivateSignal (0x0x7f02627424e0) 0 empty + +Vtable for QNearFieldShareManager +QNearFieldShareManager::_ZTV22QNearFieldShareManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QNearFieldShareManager) +16 (int (*)(...))QNearFieldShareManager::metaObject +24 (int (*)(...))QNearFieldShareManager::qt_metacast +32 (int (*)(...))QNearFieldShareManager::qt_metacall +40 (int (*)(...))QNearFieldShareManager::~QNearFieldShareManager +48 (int (*)(...))QNearFieldShareManager::~QNearFieldShareManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldShareManager + size=24 align=8 + base size=24 base align=8 +QNearFieldShareManager (0x0x7f026291ce38) 0 + vptr=((& QNearFieldShareManager::_ZTV22QNearFieldShareManager) + 16u) + QObject (0x0x7f0262742480) 0 + primary-for QNearFieldShareManager (0x0x7f026291ce38) + +Class QNearFieldShareTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareTarget::QPrivateSignal (0x0x7f0262742720) 0 empty + +Vtable for QNearFieldShareTarget +QNearFieldShareTarget::_ZTV21QNearFieldShareTarget: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QNearFieldShareTarget) +16 (int (*)(...))QNearFieldShareTarget::metaObject +24 (int (*)(...))QNearFieldShareTarget::qt_metacast +32 (int (*)(...))QNearFieldShareTarget::qt_metacall +40 (int (*)(...))QNearFieldShareTarget::~QNearFieldShareTarget +48 (int (*)(...))QNearFieldShareTarget::~QNearFieldShareTarget +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldShareTarget + size=24 align=8 + base size=24 base align=8 +QNearFieldShareTarget (0x0x7f026291cf70) 0 + vptr=((& QNearFieldShareTarget::_ZTV21QNearFieldShareTarget) + 16u) + QObject (0x0x7f02627426c0) 0 + primary-for QNearFieldShareTarget (0x0x7f026291cf70) + +Class QQmlNdefRecord::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QQmlNdefRecord::QPrivateSignal (0x0x7f02627427e0) 0 empty + +Vtable for QQmlNdefRecord +QQmlNdefRecord::_ZTV14QQmlNdefRecord: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QQmlNdefRecord) +16 (int (*)(...))QQmlNdefRecord::metaObject +24 (int (*)(...))QQmlNdefRecord::qt_metacast +32 (int (*)(...))QQmlNdefRecord::qt_metacall +40 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +48 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QQmlNdefRecord + size=24 align=8 + base size=24 base align=8 +QQmlNdefRecord (0x0x7f0262355000) 0 + vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16u) + QObject (0x0x7f0262742780) 0 + primary-for QQmlNdefRecord (0x0x7f0262355000) + diff --git a/tests/auto/bic/data/QtNfc.5.4.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.4.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..a99e9ba7 --- /dev/null +++ b/tests/auto/bic/data/QtNfc.5.4.0.linux-gcc-amd64.txt @@ -0,0 +1,3847 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f8137288060) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f81372880c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f81372c6c60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f81372c6cc0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f813725b6e8) 0 empty + std::input_iterator_tag (0x0x7f81372c6d20) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f813725b750) 0 empty + std::forward_iterator_tag (0x0x7f813725b7b8) 0 empty + std::input_iterator_tag (0x0x7f81372c6d80) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f813725b820) 0 empty + std::bidirectional_iterator_tag (0x0x7f813725b888) 0 empty + std::forward_iterator_tag (0x0x7f813725b8f0) 0 empty + std::input_iterator_tag (0x0x7f81372c6de0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f81372f8960) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f81372f8ba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f81372f8c60) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f81372f8cc0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f81372f8d80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f81372f8de0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f81373e22a0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f81373e2300) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f81373e2360) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f813725bc30) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f81373e23c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f813725bc30) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f813725bc98) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f81373e2420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f813725bc98) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f81373e2480) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f81361d67e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f81361d6840) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7f81361d6a20) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f8135f48300) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f8135f48360) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f8135f483c0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f8135f48420) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f8135f48540) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f8135fe9410) 0 + QAtomicInteger (0x0x7f8135fe9478) 0 + QBasicAtomicInteger (0x0x7f8135d8d060) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f8135b64180) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f813582e0c0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f8135b075b0) 0 + QGenericArgument (0x0x7f813582e120) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f813582e2a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f813582e3c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f813582e600) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f813582e660) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f813582e780) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f813582e7e0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f813582eae0) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f813582ee40) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f813582eea0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f8135663960) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f81356639c0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f8135663a80) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f8135663ae0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f8135663b40) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f8135663ba0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f8135663cc0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f8135663d20) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f813576d4e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f813576d540) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f813576d6c0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f813576d7e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f813576d960) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f813576da20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f813576d9c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f813576dba0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f813576de40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f8135098060) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f81350980c0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f8135098120) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f8135098180) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7f8135494f08) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7f81350985a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7f8135494f08) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f8135098600) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f8135098660) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f81350986c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f8135098540) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f8135098840) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f8135098f00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f8134d5faf8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7f8134d5fbc8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f8134d5fea0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7f8134d5ff70 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f8134d62300) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f8134d62660) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f8134d62600) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f8134d62b40) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f8134be68a0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f8134a9c3a8) 0 + std::iterator (0x0x7f8134be6960) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f8134a9c410) 0 + std::_Bit_iterator_base (0x0x7f8134a9c478) 0 + std::iterator (0x0x7f8134be69c0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f8134a9c4e0) 0 + std::_Bit_iterator_base (0x0x7f8134a9c548) 0 + std::iterator (0x0x7f8134be6a20) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f8134be6de0) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f81349cd240) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f81349cd300) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f81349cd3c0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f81349cd7e0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f81349cdb40) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f81349cdc60) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f81347c5480) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f81347c5660) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f81347c5720) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f813458ca80) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f813458cc00) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f813458cde0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f813458cd80) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f8134269120) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f8134269180) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f8134269240) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f81345e6340) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f81342691e0) 0 + primary-for QAbstractAnimation (0x0x7f81345e6340) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f8134269300) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f81345e63a8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f81342692a0) 0 + primary-for QAnimationDriver (0x0x7f81345e63a8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f81342693c0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f81345e6410) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f81345e6478) 0 + primary-for QAnimationGroup (0x0x7f81345e6410) + QObject (0x0x7f8134269360) 0 + primary-for QAbstractAnimation (0x0x7f81345e6478) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f8134269480) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f81345e64e0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f81345e6548) 0 + primary-for QParallelAnimationGroup (0x0x7f81345e64e0) + QAbstractAnimation (0x0x7f81345e65b0) 0 + primary-for QAnimationGroup (0x0x7f81345e6548) + QObject (0x0x7f8134269420) 0 + primary-for QAbstractAnimation (0x0x7f81345e65b0) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f8134269540) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f81345e6618) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f81345e6680) 0 + primary-for QPauseAnimation (0x0x7f81345e6618) + QObject (0x0x7f81342694e0) 0 + primary-for QAbstractAnimation (0x0x7f81345e6680) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f8134269720) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f8134269900) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f81342699c0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f8134269d20) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7f8134269cc0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f8134269d80) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f81340f1300) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f81345e6ea0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f81340f12a0) 0 + primary-for QIODevice (0x0x7f81345e6ea0) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f81340f1420) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f81340f14e0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f81340f1660) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f81340f1600) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f8133e4f068) 0 + QList (0x0x7f8133e4f0d0) 0 + QListSpecialMethods (0x0x7f81340f1840) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f81340f1b40) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f81340f1c00) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f81340f1ba0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f81340f1c60) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f81340f1ae0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f81340f1f60) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f8133f74060) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f8133f74000) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f8133f74120) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f8133f740c0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f8133f74cc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f8133e4fb60) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f8133e4fbc8) 0 + primary-for QVariantAnimation (0x0x7f8133e4fb60) + QObject (0x0x7f8133f74c60) 0 + primary-for QAbstractAnimation (0x0x7f8133e4fbc8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f8133f74d80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f8133e4fc98) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f8133e4fd00) 0 + primary-for QPropertyAnimation (0x0x7f8133e4fc98) + QAbstractAnimation (0x0x7f8133e4fd68) 0 + primary-for QVariantAnimation (0x0x7f8133e4fd00) + QObject (0x0x7f8133f74d20) 0 + primary-for QAbstractAnimation (0x0x7f8133e4fd68) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f8133f74e40) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f8133e4fdd0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f8133e4fe38) 0 + primary-for QSequentialAnimationGroup (0x0x7f8133e4fdd0) + QAbstractAnimation (0x0x7f8133e4fea0) 0 + primary-for QAnimationGroup (0x0x7f8133e4fe38) + QObject (0x0x7f8133f74de0) 0 + primary-for QAbstractAnimation (0x0x7f8133e4fea0) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f8133f74f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f8133f74ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f8133c42060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f8133c420c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f8133c42120) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f8133c42300) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f8133c42a80) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f8133c42ba0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f8133c42cc0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f8133c42e40) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f8133c42f00) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f8133dc8068) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f8133dc80d0) 0 + primary-for QBuffer (0x0x7f8133dc8068) + QObject (0x0x7f8133c42ea0) 0 + primary-for QIODevice (0x0x7f8133dc80d0) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f8133c42f60) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f8133a472a0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f8133a47300) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f8133a473c0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f8133a47660) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f8133a478a0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f8133a47f00) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f8133a47ea0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f8133809060) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f8133809120) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f81338091e0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f8133dc8548) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f8133dc85b0) 0 + primary-for QFileDevice (0x0x7f8133dc8548) + QObject (0x0x7f8133809180) 0 + primary-for QIODevice (0x0x7f8133dc85b0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f8133809360) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f8133dc86e8) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f8133dc8750) 0 + primary-for QFile (0x0x7f8133dc86e8) + QIODevice (0x0x7f8133dc87b8) 0 + primary-for QFileDevice (0x0x7f8133dc8750) + QObject (0x0x7f8133809300) 0 + primary-for QIODevice (0x0x7f8133dc87b8) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f8133809480) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f8133809720) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f8133809a20) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f8133809c00) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f8133dc8c98) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f8133809ba0) 0 + primary-for QFileSelector (0x0x7f8133dc8c98) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f8133809cc0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f8133dc8d00) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f8133809c60) 0 + primary-for QFileSystemWatcher (0x0x7f8133dc8d00) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f8133809d20) 0 + +Class QLoggingCategory::AtomicBools + size=3 align=1 + base size=3 base align=1 +QLoggingCategory::AtomicBools (0x0x7f8133809ea0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f8133809e40) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f8133996060) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f8133996240) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f8133dc8f08) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f8133dc8f70) 0 + primary-for QProcess (0x0x7f8133dc8f08) + QObject (0x0x7f81339961e0) 0 + primary-for QIODevice (0x0x7f8133dc8f70) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f81339962a0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f8133996420) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f8133dc8410) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f81335f6000) 0 + primary-for QSaveFile (0x0x7f8133dc8410) + QIODevice (0x0x7f81335f6068) 0 + primary-for QFileDevice (0x0x7f81335f6000) + QObject (0x0x7f81339963c0) 0 + primary-for QIODevice (0x0x7f81335f6068) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f81339964e0) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f81335f60d0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f8133996480) 0 + primary-for QSettings (0x0x7f81335f60d0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f8133996540) 0 empty + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f8133996660) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f8133996900) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f8133996a20) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f81335f6270) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f81335f62d8) 0 + primary-for QTemporaryFile (0x0x7f81335f6270) + QFileDevice (0x0x7f81335f6340) 0 + primary-for QFile (0x0x7f81335f62d8) + QIODevice (0x0x7f81335f63a8) 0 + primary-for QFileDevice (0x0x7f81335f6340) + QObject (0x0x7f81339969c0) 0 + primary-for QIODevice (0x0x7f81335f63a8) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f8133996b40) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f813373d060) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f813373d1e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f813373d300) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f813373d480) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f81335f6888) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f813373d420) 0 + primary-for QAbstractItemModel (0x0x7f81335f6888) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f813373d7e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f81335f6a28) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f81335f6a90) 0 + primary-for QAbstractTableModel (0x0x7f81335f6a28) + QObject (0x0x7f813373d780) 0 + primary-for QAbstractItemModel (0x0x7f81335f6a90) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f813373d8a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f81335f6af8) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f81335f6b60) 0 + primary-for QAbstractListModel (0x0x7f81335f6af8) + QObject (0x0x7f813373d840) 0 + primary-for QAbstractItemModel (0x0x7f81335f6b60) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f813373d960) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f81335f6bc8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f81335f6c30) 0 + primary-for QAbstractProxyModel (0x0x7f81335f6bc8) + QObject (0x0x7f813373d900) 0 + primary-for QAbstractItemModel (0x0x7f81335f6c30) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f813373da20) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f81335f6c98) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f81335f6d00) 0 + primary-for QIdentityProxyModel (0x0x7f81335f6c98) + QAbstractItemModel (0x0x7f81335f6d68) 0 + primary-for QAbstractProxyModel (0x0x7f81335f6d00) + QObject (0x0x7f813373d9c0) 0 + primary-for QAbstractItemModel (0x0x7f81335f6d68) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f813373da80) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f813373dc00) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f81335f6e38) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f813373dba0) 0 + primary-for QItemSelectionModel (0x0x7f81335f6e38) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f8133507000) 0 + QList (0x0x7f8133507068) 0 + QListSpecialMethods (0x0x7f813373de40) 0 empty + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f813373df00) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f81335070d0) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f8133507138) 0 + primary-for QSortFilterProxyModel (0x0x7f81335070d0) + QAbstractItemModel (0x0x7f81335071a0) 0 + primary-for QAbstractProxyModel (0x0x7f8133507138) + QObject (0x0x7f813373dea0) 0 + primary-for QAbstractItemModel (0x0x7f81335071a0) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f8133536000) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f8133507208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f8133507270) 0 + primary-for QStringListModel (0x0x7f8133507208) + QAbstractItemModel (0x0x7f81335072d8) 0 + primary-for QAbstractListModel (0x0x7f8133507270) + QObject (0x0x7f813373df60) 0 + primary-for QAbstractItemModel (0x0x7f81335072d8) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f8133536060) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f8133536120) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f81335361e0) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f8133536240) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f8133536300) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f8133536360) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f81335362a0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f81335363c0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f8133536420) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f81335364e0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f8133536540) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f8133536480) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f8133536660) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f8133507340) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f8133536600) 0 + primary-for QEventLoop (0x0x7f8133507340) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f8133536780) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f8133536840) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f81335368a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f8133507478) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f81335367e0) 0 + primary-for QAbstractEventDispatcher (0x0x7f8133507478) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f8133536900) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f8133536960) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f8133536a80) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f8133507548) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f8133536ae0) 0 + primary-for QTimerEvent (0x0x7f8133507548) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f81335075b0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f8133536b40) 0 + primary-for QChildEvent (0x0x7f81335075b0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f8133507618) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f8133536ba0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f8133507618) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f8133507680) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f8133536c00) 0 + primary-for QDeferredDeleteEvent (0x0x7f8133507680) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f8133536cc0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f81335076e8) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f8133536c60) 0 + primary-for QCoreApplication (0x0x7f81335076e8) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f8133536d20) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f8133536d80) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f8133536ea0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f813337e000) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f813337e060) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f813337e1e0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f8133507958) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f813337e180) 0 + primary-for QMimeData (0x0x7f8133507958) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f813337e2a0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f81335079c0) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f813337e240) 0 + primary-for QObjectCleanupHandler (0x0x7f81335079c0) + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f813337e3c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f813337e540) 0 + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f813337ec00) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f8133507d68) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f813337eba0) 0 + primary-for QSharedMemory (0x0x7f8133507d68) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f813337ecc0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f8133507dd0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f813337ec60) 0 + primary-for QSignalMapper (0x0x7f8133507dd0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f813337ed80) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f8133507e38) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f813337ed20) 0 + primary-for QSocketNotifier (0x0x7f8133507e38) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f813337ede0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f813337ef00) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f8133507ea0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f813337eea0) 0 + primary-for QTimer (0x0x7f8133507ea0) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f81330e00c0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f8133507f70) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f81330e0060) 0 + primary-for QTranslator (0x0x7f8133507f70) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f81330e0120) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f81330e02a0) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f81330e0300) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f81330e0420) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f8133507c30) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f81330e03c0) 0 + primary-for QLibrary (0x0x7f8133507c30) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f81330e0540) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f81330e06c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f8133153068) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f81330e0660) 0 + primary-for QPluginLoader (0x0x7f8133153068) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f81330e0720) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f81330e08a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f8133153138) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f81330e0840) 0 + primary-for QAbstractState (0x0x7f8133153138) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f81330e0960) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f81331531a0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f81330e0900) 0 + primary-for QAbstractTransition (0x0x7f81331531a0) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f81330e0a20) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f8133153208) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f8133153270) 0 + primary-for QEventTransition (0x0x7f8133153208) + QObject (0x0x7f81330e09c0) 0 + primary-for QAbstractTransition (0x0x7f8133153270) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f81330e0ae0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f81331532d8) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f8133153340) 0 + primary-for QFinalState (0x0x7f81331532d8) + QObject (0x0x7f81330e0a80) 0 + primary-for QAbstractState (0x0x7f8133153340) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f81330e0ba0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f81331533a8) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f8133153410) 0 + primary-for QHistoryState (0x0x7f81331533a8) + QObject (0x0x7f81330e0b40) 0 + primary-for QAbstractState (0x0x7f8133153410) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f81330e0c60) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f8133153478) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f81331534e0) 0 + primary-for QSignalTransition (0x0x7f8133153478) + QObject (0x0x7f81330e0c00) 0 + primary-for QAbstractTransition (0x0x7f81331534e0) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f81330e0d20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f8133153548) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f81331535b0) 0 + primary-for QState (0x0x7f8133153548) + QObject (0x0x7f81330e0cc0) 0 + primary-for QAbstractState (0x0x7f81331535b0) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f81330e0e40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f8133153750) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f81330e0ea0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f8133153750) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f81331537b8) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f81330e0f00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f81331537b8) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f8133153618) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f8133153680) 0 + primary-for QStateMachine (0x0x7f8133153618) + QAbstractState (0x0x7f81331536e8) 0 + primary-for QState (0x0x7f8133153680) + QObject (0x0x7f81330e0de0) 0 + primary-for QAbstractState (0x0x7f81331536e8) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f8133153820) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f81330e0f60) 0 nearly-empty + primary-for QException (0x0x7f8133153820) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f8133153888) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f81331538f0) 0 nearly-empty + primary-for QUnhandledException (0x0x7f8133153888) + std::exception (0x0x7f8132e29000) 0 nearly-empty + primary-for QException (0x0x7f81331538f0) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f8132e29060) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f8132e29120) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f8132e29180) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f8132e291e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f8133153a90) 0 + QBasicMutex (0x0x7f8132e29300) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f8132e29360) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f8132e293c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f8132e29420) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f8132e295a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f8132e29660) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f8132e299c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f8132eb83a8) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f8132e29960) 0 + primary-for QFutureWatcherBase (0x0x7f8132eb83a8) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f8132e29ae0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f8132e29b40) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f8132e29ba0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f8132e29c00) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f8132e29cc0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f8132eb8750) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f8132e29c60) 0 + primary-for QThread (0x0x7f8132eb8750) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f8132e29d80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f8132eb87b8) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f8132e29d20) 0 + primary-for QThreadPool (0x0x7f8132eb87b8) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f8132e29de0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f8132e29ea0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f8132c01480) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f8132c014e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f8132c01660) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f8132c01600) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f8132c017e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f8132c018a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f8132c01a80) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f8132c01c00) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f8132c01c60) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f8132c01cc0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f8132c01d20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f8132c01e40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f8132c01f60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f8132d790c0) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7f8132d791e0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f8132d79540) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f8132d79660) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f8132d79780) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f8132d79840) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f8132d79960) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f8132d79a80) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f8132d79ba0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f8132d79cc0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f813288b000) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f813288b180) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f813288b3c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f813288bde0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f813288bf60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f813294c0d0) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f813288bf00) 0 + primary-for QTimeLine (0x0x7f813294c0d0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f813297c060) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f813297c000) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f813297c2a0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f813297c300) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f813294c340) 0 + QVector (0x0x7f813297c4e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f813297c540) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f813297c660) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f813297c780) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f813297c8a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f813297c900) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f813297ca20) 0 + +Class QNdefRecord + size=8 align=8 + base size=8 base align=8 +QNdefRecord (0x0x7f813297cb40) 0 + +Class QNdefFilter::Record + size=24 align=8 + base size=24 base align=8 +QNdefFilter::Record (0x0x7f813297cc60) 0 + +Class QNdefFilter + size=8 align=8 + base size=8 base align=8 +QNdefFilter (0x0x7f813297cc00) 0 + +Class QNdefMessage + size=8 align=8 + base size=8 base align=8 +QNdefMessage (0x0x7f813294c548) 0 + QList (0x0x7f813294c5b0) 0 + QListSpecialMethods (0x0x7f813297ce40) 0 empty + +Class QNdefNfcTextRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcTextRecord (0x0x7f813294c618) 0 + QNdefRecord (0x0x7f81326d1000) 0 + +Class QNdefNfcUriRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcUriRecord (0x0x7f813294c680) 0 + QNdefRecord (0x0x7f81326d1060) 0 + +Class QNdefNfcIconRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcIconRecord (0x0x7f813294c6e8) 0 + QNdefRecord (0x0x7f81326d10c0) 0 + +Class QNdefNfcSmartPosterRecord + size=16 align=8 + base size=16 base align=8 +QNdefNfcSmartPosterRecord (0x0x7f813294c750) 0 + QNdefRecord (0x0x7f81326d1120) 0 + +Class QNearFieldTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldTarget::QPrivateSignal (0x0x7f81326d1240) 0 empty + +Class QNearFieldTarget::RequestId + size=8 align=8 + base size=8 base align=8 +QNearFieldTarget::RequestId (0x0x7f81326d12a0) 0 + +Vtable for QNearFieldTarget +QNearFieldTarget::_ZTV16QNearFieldTarget: 25u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QNearFieldTarget) +16 (int (*)(...))QNearFieldTarget::metaObject +24 (int (*)(...))QNearFieldTarget::qt_metacast +32 (int (*)(...))QNearFieldTarget::qt_metacall +40 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +48 (int (*)(...))QNearFieldTarget::~QNearFieldTarget +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))QNearFieldTarget::url +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QNearFieldTarget::hasNdefMessage +152 (int (*)(...))QNearFieldTarget::readNdefMessages +160 (int (*)(...))QNearFieldTarget::writeNdefMessages +168 (int (*)(...))QNearFieldTarget::sendCommand +176 (int (*)(...))QNearFieldTarget::sendCommands +184 (int (*)(...))QNearFieldTarget::waitForRequestCompleted +192 (int (*)(...))QNearFieldTarget::handleResponse + +Class QNearFieldTarget + size=24 align=8 + base size=24 base align=8 +QNearFieldTarget (0x0x7f813294c7b8) 0 + vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16u) + QObject (0x0x7f81326d11e0) 0 + primary-for QNearFieldTarget (0x0x7f813294c7b8) + +Class QNearFieldManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldManager::QPrivateSignal (0x0x7f81326d16c0) 0 empty + +Vtable for QNearFieldManager +QNearFieldManager::_ZTV17QNearFieldManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QNearFieldManager) +16 (int (*)(...))QNearFieldManager::metaObject +24 (int (*)(...))QNearFieldManager::qt_metacast +32 (int (*)(...))QNearFieldManager::qt_metacall +40 (int (*)(...))QNearFieldManager::~QNearFieldManager +48 (int (*)(...))QNearFieldManager::~QNearFieldManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldManager + size=24 align=8 + base size=24 base align=8 +QNearFieldManager (0x0x7f813294c8f0) 0 + vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16u) + QObject (0x0x7f81326d1660) 0 + primary-for QNearFieldManager (0x0x7f813294c8f0) + +Class QNearFieldShareManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareManager::QPrivateSignal (0x0x7f81326d1840) 0 empty + +Vtable for QNearFieldShareManager +QNearFieldShareManager::_ZTV22QNearFieldShareManager: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QNearFieldShareManager) +16 (int (*)(...))QNearFieldShareManager::metaObject +24 (int (*)(...))QNearFieldShareManager::qt_metacast +32 (int (*)(...))QNearFieldShareManager::qt_metacall +40 (int (*)(...))QNearFieldShareManager::~QNearFieldShareManager +48 (int (*)(...))QNearFieldShareManager::~QNearFieldShareManager +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldShareManager + size=24 align=8 + base size=24 base align=8 +QNearFieldShareManager (0x0x7f813294ca90) 0 + vptr=((& QNearFieldShareManager::_ZTV22QNearFieldShareManager) + 16u) + QObject (0x0x7f81326d17e0) 0 + primary-for QNearFieldShareManager (0x0x7f813294ca90) + +Class QNearFieldShareTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareTarget::QPrivateSignal (0x0x7f81326d1a80) 0 empty + +Vtable for QNearFieldShareTarget +QNearFieldShareTarget::_ZTV21QNearFieldShareTarget: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QNearFieldShareTarget) +16 (int (*)(...))QNearFieldShareTarget::metaObject +24 (int (*)(...))QNearFieldShareTarget::qt_metacast +32 (int (*)(...))QNearFieldShareTarget::qt_metacall +40 (int (*)(...))QNearFieldShareTarget::~QNearFieldShareTarget +48 (int (*)(...))QNearFieldShareTarget::~QNearFieldShareTarget +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QNearFieldShareTarget + size=24 align=8 + base size=24 base align=8 +QNearFieldShareTarget (0x0x7f813294cbc8) 0 + vptr=((& QNearFieldShareTarget::_ZTV21QNearFieldShareTarget) + 16u) + QObject (0x0x7f81326d1a20) 0 + primary-for QNearFieldShareTarget (0x0x7f813294cbc8) + +Class QQmlNdefRecord::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QQmlNdefRecord::QPrivateSignal (0x0x7f81326d1b40) 0 empty + +Vtable for QQmlNdefRecord +QQmlNdefRecord::_ZTV14QQmlNdefRecord: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QQmlNdefRecord) +16 (int (*)(...))QQmlNdefRecord::metaObject +24 (int (*)(...))QQmlNdefRecord::qt_metacast +32 (int (*)(...))QQmlNdefRecord::qt_metacall +40 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +48 (int (*)(...))QQmlNdefRecord::~QQmlNdefRecord +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QQmlNdefRecord + size=24 align=8 + base size=24 base align=8 +QQmlNdefRecord (0x0x7f813294cc30) 0 + vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16u) + QObject (0x0x7f81326d1ae0) 0 + primary-for QQmlNdefRecord (0x0x7f813294cc30) + diff --git a/tests/global/.gitignore b/tests/global/.gitignore new file mode 100644 index 00000000..1e49c600 --- /dev/null +++ b/tests/global/.gitignore @@ -0,0 +1,2 @@ +Makefile +global.pro diff --git a/tests/global/global.cfg b/tests/global/global.cfg new file mode 100644 index 00000000..ab3b751f --- /dev/null +++ b/tests/global/global.cfg @@ -0,0 +1,6 @@ + + + + + + -- cgit v1.2.3 From f0bef22496de7d09c1b2ead685ae263dd28f4388 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 14 Feb 2015 13:22:18 +0100 Subject: Use proper endian conversion functions bswap_16 isn't defined anywhere, use qbswap from instead. Change-Id: I9ee260752ab7bcae3bbd30b4b71d30d52c837a2b Reviewed-by: Alex Blasche --- src/bluetooth/bluez/bluez_data_p.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/bluetooth/bluez/bluez_data_p.h b/src/bluetooth/bluez/bluez_data_p.h index 9d2d96b3..9d0d9d9c 100644 --- a/src/bluetooth/bluez/bluez_data_p.h +++ b/src/bluetooth/bluez/bluez_data_p.h @@ -46,6 +46,7 @@ // #include +#include #include #include @@ -96,12 +97,12 @@ struct bt_security { #define btohl(d) (d) #define btohll(d) (d) #elif __BYTE_ORDER == __BIG_ENDIAN -#define htobs(d) bswap_16(d) -#define htobl(d) bswap_32(d) -#define htobll(d) bswap_64(d) -#define btohs(d) bswap_16(d) -#define btohl(d) bswap_32(d) -#define btohll(d) bswap_64(d) +#define htobs(d) qbswap((quint16)(d)) +#define htobl(d) qbswap((quint32)(d)) +#define htobll(d) qbswap((quint64)(d)) +#define btohs(d) qbswap((quint16)(d)) +#define btohl(d) qbswap((quint32)(d)) +#define btohll(d) qbswap((quint64)(d)) #else #error "Unknown byte order" #endif @@ -169,7 +170,7 @@ static inline quint16 bt_get_le16(const void *ptr) #elif __BYTE_ORDER == __BIG_ENDIAN static inline quint16 bt_get_le16(const void *ptr) { - return bswap_16(bt_get_unaligned((const quint16 *) ptr)); + return qbswap(bt_get_unaligned((const quint16 *) ptr)); } static inline void btoh128(const quint128 *src, quint128 *dst) -- cgit v1.2.3 From 6ea1e538b79a08d370660b1237c6ed6baaf82bce Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 16 Feb 2015 18:20:13 +0100 Subject: Set QBluetoothServer::ServiceAlreadyRegisteredError where possible This affects Bluez 4 & 5. Task-number: QTBUG-44452 Change-Id: Ifa9f6c56499bece3d99dba65a0afeed6c2ed60ac Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothserver_bluez.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetoothserver_bluez.cpp b/src/bluetooth/qbluetoothserver_bluez.cpp index 88eab65c..c6ce77a3 100644 --- a/src/bluetooth/qbluetoothserver_bluez.cpp +++ b/src/bluetooth/qbluetoothserver_bluez.cpp @@ -151,9 +151,11 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) else convertAddress(device.address().toUInt64(), addr.rc_bdaddr.b); - if (::bind(sock, reinterpret_cast(&addr), sizeof(sockaddr_rc)) < 0) { - d->m_lastError = InputOutputError; + if (errno == EADDRINUSE) + d->m_lastError = ServiceAlreadyRegisteredError; + else + d->m_lastError = InputOutputError; emit error(d->m_lastError); return false; } -- cgit v1.2.3 From dbf0bd93096f8ef54ebcf550ff104237742778dd Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 17 Feb 2015 15:24:22 +0100 Subject: Improve QBluetoothServiceInfo documentation serviceUuid() may be null and is not the same as the service class uuid. Task-number: QTBUG-44442 Change-Id: I200db4e2a403fabb8d1b5814b9d615dfc76a627d Reviewed-by: Timur Pocheptsov Reviewed-by: Andy Shaw --- src/bluetooth/qbluetoothserviceinfo.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetoothserviceinfo.cpp b/src/bluetooth/qbluetoothserviceinfo.cpp index f0926d9c..7b9460a1 100644 --- a/src/bluetooth/qbluetoothserviceinfo.cpp +++ b/src/bluetooth/qbluetoothserviceinfo.cpp @@ -313,7 +313,8 @@ bool QBluetoothServiceInfo::unregisterService() This is a convenience function. It is equivalent to calling setAttribute(QBluetoothServiceInfo::ServiceId, uuid). - Sets the service UUID to \a uuid. + Sets the custom service UUID to \a uuid. This function should not be used + to set a standardized service UUID. \sa serviceUuid(), setAttribute() */ @@ -324,7 +325,9 @@ bool QBluetoothServiceInfo::unregisterService() This is a convenience function. It is equivalent to calling attribute(QBluetoothServiceInfo::ServiceId).value(). - Returns the UUID of the service. + Returns the custom UUID of the service. This UUID may be null. + UUIDs based on \l{https://bluetooth.org}{Bluetooth SIG standards} + should be retrieved via \l serviceClassUuids(). \sa setServiceUuid(), attribute() */ -- cgit v1.2.3 From 5fcaf1b1bc0f237961365e8f544acaf32d174033 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 24 Feb 2015 16:16:18 +0100 Subject: Bump version Change-Id: Ibe113ca3c4278b59358814f7425b81ebf6e2f42c --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 068da422..a9b6a329 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.5.0 +MODULE_VERSION = 5.6.0 -- cgit v1.2.3 From 4aa1335fecc7107b9ab7bd9c0feb0f2fdff067ef Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 27 Feb 2015 17:00:36 +0100 Subject: Fix spelling in messages. Change-Id: Icbbfe9cfb1e4187f2c043b85b8c0d19c9a82b6b9 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp | 2 +- src/bluetooth/qbluetoothuuid.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp index 97d405a4..26052a52 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp @@ -63,7 +63,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() { Q_Q(QBluetoothDeviceDiscoveryAgent); lastError = QBluetoothDeviceDiscoveryAgent::UnsupportedPlatformError; - errorString = QBluetoothDeviceDiscoveryAgent::tr("Device discovery on this platform not support"); + errorString = QBluetoothDeviceDiscoveryAgent::tr("Device discovery not supported on this platform"); emit q->error(lastError); } diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index 2fc2f161..59b99114 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -804,8 +804,8 @@ QString QBluetoothUuid::serviceClassToString(QBluetoothUuid::ServiceClassUuid uu case QBluetoothUuid::AlertNotificationService: return QBluetoothServiceDiscoveryAgent::tr("Alert Notification Service"); case QBluetoothUuid::HumanInterfaceDevice: return QBluetoothServiceDiscoveryAgent::tr("Human Interface Device"); case QBluetoothUuid::ScanParameters: return QBluetoothServiceDiscoveryAgent::tr("Scan Parameters"); - case QBluetoothUuid::RunningSpeedAndCadence: return QBluetoothServiceDiscoveryAgent::tr("Running Speed and Cadance"); - case QBluetoothUuid::CyclingSpeedAndCadence: return QBluetoothServiceDiscoveryAgent::tr("Cycling Speed and Cadance"); + case QBluetoothUuid::RunningSpeedAndCadence: return QBluetoothServiceDiscoveryAgent::tr("Running Speed and Cadence"); + case QBluetoothUuid::CyclingSpeedAndCadence: return QBluetoothServiceDiscoveryAgent::tr("Cycling Speed and Cadence"); case QBluetoothUuid::CyclingPower: return QBluetoothServiceDiscoveryAgent::tr("Cycling Power"); case QBluetoothUuid::LocationAndNavigation: return QBluetoothServiceDiscoveryAgent::tr("Location and Navigation"); case QBluetoothUuid::EnvironmentalSensing: return QBluetoothServiceDiscoveryAgent::tr("Environmental Sensing"); @@ -855,7 +855,7 @@ QString QBluetoothUuid::protocolToString(QBluetoothUuid::ProtocolUuid uuid) case QBluetoothUuid::Avdtp: return QBluetoothServiceDiscoveryAgent::tr("Audio/Video Distribution Transport Protocol"); case QBluetoothUuid::Cmtp: return QBluetoothServiceDiscoveryAgent::tr("Common ISDN Access Protocol"); case QBluetoothUuid::UdiCPlain: return QBluetoothServiceDiscoveryAgent::tr("UdiCPlain"); - case QBluetoothUuid::McapControlChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol -Conrol"); + case QBluetoothUuid::McapControlChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol -Control"); case QBluetoothUuid::McapDataChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol - Data"); case QBluetoothUuid::L2cap: return QBluetoothServiceDiscoveryAgent::tr("Layer 2 Control Protocol"); default: -- cgit v1.2.3 From b09ac3271cac13d96f7cdc945b632bbc505acc93 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 2 Mar 2015 15:21:38 +0100 Subject: Further fixes to Bluetooth UUID messages. - Use Linguist comments instead of disambiguating strings for developer comments - Add Linguist comments for some abbreviations - Fix spelling. Change-Id: I5887be7c7c5ef9197b5bde8b0b46ba68690af0ef Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothuuid.cpp | 43 ++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index 59b99114..ec0cd13a 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -876,14 +876,19 @@ QString QBluetoothUuid::protocolToString(QBluetoothUuid::ProtocolUuid uuid) QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) { switch (uuid) { + //: GAP: Generic Access Profile (Bluetooth) case QBluetoothUuid::DeviceName: return QBluetoothServiceDiscoveryAgent::tr("GAP Device Name"); + //: GAP: Generic Access Profile (Bluetooth) case QBluetoothUuid::Appearance: return QBluetoothServiceDiscoveryAgent::tr("GAP Appearance"); case QBluetoothUuid::PeripheralPrivacyFlag: + //: GAP: Generic Access Profile (Bluetooth) return QBluetoothServiceDiscoveryAgent::tr("GAP Peripheral Privacy Flag"); case QBluetoothUuid::ReconnectionAddress: + //: GAP: Generic Access Profile (Bluetooth) return QBluetoothServiceDiscoveryAgent::tr("GAP Reconnection Address"); case QBluetoothUuid::PeripheralPreferredConnectionParameters: return QBluetoothServiceDiscoveryAgent::tr("GAP Peripheral Preferred Connection Parameters"); + //: GATT: _G_eneric _Att_ribute Profile (Bluetooth) case QBluetoothUuid::ServiceChanged: return QBluetoothServiceDiscoveryAgent::tr("GATT Service Changed"); case QBluetoothUuid::AlertLevel: return QBluetoothServiceDiscoveryAgent::tr("Alert Level"); case QBluetoothUuid::TxPowerLevel: return QBluetoothServiceDiscoveryAgent::tr("TX Power"); @@ -950,8 +955,10 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::SupportedUnreadAlertCategory: return QBluetoothServiceDiscoveryAgent::tr("Supported Unread Alert Category"); case QBluetoothUuid::BloodPressureFeature: return QBluetoothServiceDiscoveryAgent::tr("Blood Pressure Feature"); + //: HID: Human Interface Device Profile (Bluetooth) case QBluetoothUuid::HIDInformation: return QBluetoothServiceDiscoveryAgent::tr("HID Information"); case QBluetoothUuid::ReportMap: return QBluetoothServiceDiscoveryAgent::tr("Report Map"); + //: HID: Human Interface Device Profile (Bluetooth) case QBluetoothUuid::HIDControlPoint: return QBluetoothServiceDiscoveryAgent::tr("HID Control Point"); case QBluetoothUuid::Report: return QBluetoothServiceDiscoveryAgent::tr("Report"); case QBluetoothUuid::ProtocolMode: return QBluetoothServiceDiscoveryAgent::tr("Protocol Mode"); @@ -959,11 +966,16 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::PnPID: return QBluetoothServiceDiscoveryAgent::tr("PnP ID"); case QBluetoothUuid::GlucoseFeature: return QBluetoothServiceDiscoveryAgent::tr("Glucose Feature"); case QBluetoothUuid::RecordAccessControlPoint: + //: Glucose Sensor patient record database. return QBluetoothServiceDiscoveryAgent::tr("Record Access Control Point"); + //: RSC: Running Speed and Cadence case QBluetoothUuid::RSCMeasurement: return QBluetoothServiceDiscoveryAgent::tr("RSC Measurement"); + //: RSC: Running Speed and Cadence case QBluetoothUuid::RSCFeature: return QBluetoothServiceDiscoveryAgent::tr("RSC Feature"); case QBluetoothUuid::SCControlPoint: return QBluetoothServiceDiscoveryAgent::tr("SC Control Point"); + //: CSC: Cycling Speed and Cadence case QBluetoothUuid::CSCMeasurement: return QBluetoothServiceDiscoveryAgent::tr("CSC Measurement"); + //: CSC: Cycling Speed and Cadence case QBluetoothUuid::CSCFeature: return QBluetoothServiceDiscoveryAgent::tr("CSC Feature"); case QBluetoothUuid::SensorLocation: return QBluetoothServiceDiscoveryAgent::tr("Sensor Location"); case QBluetoothUuid::CyclingPowerMeasurement: @@ -971,25 +983,30 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::CyclingPowerVector: return QBluetoothServiceDiscoveryAgent::tr("Cycling Power Vector"); case QBluetoothUuid::CyclingPowerFeature: return QBluetoothServiceDiscoveryAgent::tr("Cycling Power Feature"); case QBluetoothUuid::CyclingPowerControlPoint: - return QBluetoothServiceDiscoveryAgent::tr("Cycling Power COntrol Point"); + return QBluetoothServiceDiscoveryAgent::tr("Cycling Power Control Point"); case QBluetoothUuid::LocationAndSpeed: return QBluetoothServiceDiscoveryAgent::tr("Location And Speed"); case QBluetoothUuid::Navigation: return QBluetoothServiceDiscoveryAgent::tr("Navigation"); case QBluetoothUuid::PositionQuality: return QBluetoothServiceDiscoveryAgent::tr("Position Quality"); case QBluetoothUuid::LNFeature: return QBluetoothServiceDiscoveryAgent::tr("LN Feature"); case QBluetoothUuid::LNControlPoint: return QBluetoothServiceDiscoveryAgent::tr("LN Control Point"); case QBluetoothUuid::MagneticDeclination: - return QBluetoothServiceDiscoveryAgent::tr("Magnetic Declination", "angle between geographic and magnetic north"); - case QBluetoothUuid::Elevation: return QBluetoothServiceDiscoveryAgent::tr("Elevation", "above/below sea level"); + //: Angle between geographic and magnetic north + return QBluetoothServiceDiscoveryAgent::tr("Magnetic Declination"); + //: Above/below sea level + case QBluetoothUuid::Elevation: return QBluetoothServiceDiscoveryAgent::tr("Elevation"); case QBluetoothUuid::Pressure: return QBluetoothServiceDiscoveryAgent::tr("Pressure"); case QBluetoothUuid::Temperature: return QBluetoothServiceDiscoveryAgent::tr("Temperature"); case QBluetoothUuid::Humidity: return QBluetoothServiceDiscoveryAgent::tr("Humidity"); - case QBluetoothUuid::TrueWindSpeed: return QBluetoothServiceDiscoveryAgent::tr("True Wind Speed", "wind speed while standing"); + //: Wind speed while standing + case QBluetoothUuid::TrueWindSpeed: return QBluetoothServiceDiscoveryAgent::tr("True Wind Speed"); case QBluetoothUuid::TrueWindDirection : return QBluetoothServiceDiscoveryAgent::tr("True Wind Direction"); case QBluetoothUuid::ApparentWindSpeed: - return QBluetoothServiceDiscoveryAgent::tr("Apparent Wind Speed", "wind speed while observer is moving"); + //: Wind speed while observer is moving + return QBluetoothServiceDiscoveryAgent::tr("Apparent Wind Speed"); case QBluetoothUuid::ApparentWindDirection: return QBluetoothServiceDiscoveryAgent::tr("Apparent Wind Direction"); case QBluetoothUuid::GustFactor: - return QBluetoothServiceDiscoveryAgent::tr("Gust Factor", "factor by which wind gust is stronger than average wind"); + //: Factor by which wind gust is stronger than average wind + return QBluetoothServiceDiscoveryAgent::tr("Gust Factor"); case QBluetoothUuid::PollenConcentration: return QBluetoothServiceDiscoveryAgent::tr("Pollen Concentration"); case QBluetoothUuid::UVIndex: return QBluetoothServiceDiscoveryAgent::tr("UV Index"); case QBluetoothUuid::Irradiance: return QBluetoothServiceDiscoveryAgent::tr("Irradiance"); @@ -998,13 +1015,15 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::HeatIndex: return QBluetoothServiceDiscoveryAgent::tr("Heat Index"); case QBluetoothUuid::DewPoint: return QBluetoothServiceDiscoveryAgent::tr("Dew Point"); case QBluetoothUuid::DescriptorValueChanged: - return QBluetoothServiceDiscoveryAgent::tr("Descriptor Value Changed", "Environmental sensing related"); + //: Environmental sensing related + return QBluetoothServiceDiscoveryAgent::tr("Descriptor Value Changed"); case QBluetoothUuid::AerobicHeartRateLowerLimit: return QBluetoothServiceDiscoveryAgent::tr("Aerobic Heart Rate Lower Limit"); case QBluetoothUuid::AerobicHeartRateUpperLimit: return QBluetoothServiceDiscoveryAgent::tr("Aerobic Heart Rate Upper Limit"); case QBluetoothUuid::AerobicThreshold: return QBluetoothServiceDiscoveryAgent::tr("Aerobic Threshold"); - case QBluetoothUuid::Age: return QBluetoothServiceDiscoveryAgent::tr("Age", "age of person"); + //: Age of person + case QBluetoothUuid::Age: return QBluetoothServiceDiscoveryAgent::tr("Age"); case QBluetoothUuid::AnaerobicHeartRateLowerLimit: return QBluetoothServiceDiscoveryAgent::tr("Anaerobic Heart Rate Lower Limit"); case QBluetoothUuid::AnaerobicHeartRateUpperLimit: @@ -1021,7 +1040,8 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::FiveZoneHeartRateLimits: return QBluetoothServiceDiscoveryAgent::tr("5-Zone Heart Rate Limits"); case QBluetoothUuid::Gender: return QBluetoothServiceDiscoveryAgent::tr("Gender"); case QBluetoothUuid::HeartRateMax: return QBluetoothServiceDiscoveryAgent::tr("Heart Rate Maximum"); - case QBluetoothUuid::Height: return QBluetoothServiceDiscoveryAgent::tr("Height", "of a person"); + //: Height of a person + case QBluetoothUuid::Height: return QBluetoothServiceDiscoveryAgent::tr("Height"); case QBluetoothUuid::HipCircumference: return QBluetoothServiceDiscoveryAgent::tr("Hip Circumference"); case QBluetoothUuid::LastName: return QBluetoothServiceDiscoveryAgent::tr("Last Name"); case QBluetoothUuid::MaximumRecommendedHeartRate: @@ -1035,7 +1055,8 @@ QString QBluetoothUuid::characteristicToString(CharacteristicType uuid) case QBluetoothUuid::WaistCircumference: return QBluetoothServiceDiscoveryAgent::tr("Waist Circumference"); case QBluetoothUuid::Weight: return QBluetoothServiceDiscoveryAgent::tr("Weight"); case QBluetoothUuid::DatabaseChangeIncrement: - return QBluetoothServiceDiscoveryAgent::tr("Database Change Increment", "Environmental sensing related"); + //: Environmental sensing related + return QBluetoothServiceDiscoveryAgent::tr("Database Change Increment"); case QBluetoothUuid::UserIndex: return QBluetoothServiceDiscoveryAgent::tr("User Index"); case QBluetoothUuid::BodyCompositionFeature: return QBluetoothServiceDiscoveryAgent::tr("Body Composition Feature"); case QBluetoothUuid::BodyCompositionMeasurement: return QBluetoothServiceDiscoveryAgent::tr("Body Composition Measurement"); @@ -1070,7 +1091,7 @@ QString QBluetoothUuid::descriptorToString(QBluetoothUuid::DescriptorType uuid) case QBluetoothUuid::ClientCharacteristicConfiguration: return QBluetoothServiceDiscoveryAgent::tr("Client Characteristic Configuration"); case QBluetoothUuid::ServerCharacteristicConfiguration: - return QBluetoothServiceDiscoveryAgent::tr("Server Characteristic Configuratio"); + return QBluetoothServiceDiscoveryAgent::tr("Server Characteristic Configuration"); case QBluetoothUuid::CharacteristicPresentationFormat: return QBluetoothServiceDiscoveryAgent::tr("Characteristic Presentation Format"); case QBluetoothUuid::CharacteristicAggregateFormat: -- cgit v1.2.3 From fbb7acbc7f59fd79cbe6e59aef21be6d7c6cf5ca Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 4 Mar 2015 15:20:12 +0100 Subject: Fix case where BluetoothDevice.getServiceChannel() error is not handled This applies to Android versions 4.1.x and below. The function returns BluetoothDevice.ERROR or -1 in case of an error. So far only the ERROR case was caught. Task-number: QTBUG-44792 Change-Id: I512f846d74f2a03b2e6f5bf4df4127d584993f6c Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_android.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index c8216ea2..73968e05 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -138,7 +138,8 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe } if (socketChannel - == remoteDevice.getStaticField("android/bluetooth/BluetoothDevice", "ERROR")) { + == remoteDevice.getStaticField("android/bluetooth/BluetoothDevice", "ERROR") + || socketChannel == -1) { qCWarning(QT_BT_ANDROID) << "Cannot determine RFCOMM service channel."; } else { qCWarning(QT_BT_ANDROID) << "Using found rfcomm channel" << socketChannel; -- cgit v1.2.3 From 0c626f290111a0dfed2e0faae98afb1b0ad9943c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 4 Mar 2015 12:25:46 +0100 Subject: Further fixes to translated messages. Change-Id: I7d5f9f8b9ad26ed607684c44e231eb0fcbcdc9ab Reviewed-by: Christian Stenger Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothtransferreply_bluez.cpp | 2 +- src/bluetooth/qbluetoothtransferreply_qnx.cpp | 4 ++-- src/bluetooth/qbluetoothuuid.cpp | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qbluetoothtransferreply_bluez.cpp b/src/bluetooth/qbluetoothtransferreply_bluez.cpp index 9a9ad38f..61bfb90d 100644 --- a/src/bluetooth/qbluetoothtransferreply_bluez.cpp +++ b/src/bluetooth/qbluetoothtransferreply_bluez.cpp @@ -123,7 +123,7 @@ bool QBluetoothTransferReplyBluez::start() m_tempfile->open(); qCDebug(QT_BT_BLUEZ) << "Not a QFile, making a copy" << m_tempfile->fileName(); if (!m_source->isReadable()) { - m_errorStr = QBluetoothTransferReply::tr("QIODevice cannot be read." + m_errorStr = QBluetoothTransferReply::tr("QIODevice cannot be read. " "Make sure it is open for reading."); m_error = QBluetoothTransferReply::IODeviceNotReadableError; m_finished = true; diff --git a/src/bluetooth/qbluetoothtransferreply_qnx.cpp b/src/bluetooth/qbluetoothtransferreply_qnx.cpp index 5b40073c..fa8992d2 100644 --- a/src/bluetooth/qbluetoothtransferreply_qnx.cpp +++ b/src/bluetooth/qbluetoothtransferreply_qnx.cpp @@ -112,7 +112,7 @@ bool QBluetoothTransferReplyQnx::start() file.remove(); } else if (directory.exists(appName) && busy) { - m_errorStr = QBluetoothTransferReply::tr("Resurce busy."); + m_errorStr = QBluetoothTransferReply::tr("Resource busy."); m_error = QBluetoothTransferReply::ResourceBusyError; m_finished = true; m_running = false; @@ -121,7 +121,7 @@ bool QBluetoothTransferReplyQnx::start() return false; } if (!source->isReadable()) { - m_errorStr = QBluetoothTransferReply::tr("QIODevice cannot be read." + m_errorStr = QBluetoothTransferReply::tr("QIODevice cannot be read. " "Make sure it is open for reading."); m_error = QBluetoothTransferReply::IODeviceNotReadableError; m_finished = true; diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp index ec0cd13a..bbb9f652 100644 --- a/src/bluetooth/qbluetoothuuid.cpp +++ b/src/bluetooth/qbluetoothuuid.cpp @@ -812,6 +812,7 @@ QString QBluetoothUuid::serviceClassToString(QBluetoothUuid::ServiceClassUuid uu case QBluetoothUuid::BodyComposition: return QBluetoothServiceDiscoveryAgent::tr("Body Composition"); case QBluetoothUuid::UserData: return QBluetoothServiceDiscoveryAgent::tr("User Data"); case QBluetoothUuid::WeightScale: return QBluetoothServiceDiscoveryAgent::tr("Weight Scale"); + //: Connection management (Bluetooth) case QBluetoothUuid::BondManagement: return QBluetoothServiceDiscoveryAgent::tr("Bond Management"); case QBluetoothUuid::ContinuousGlucoseMonitoring: return QBluetoothServiceDiscoveryAgent::tr("Continuous Glucose Monitoring"); default: @@ -855,7 +856,7 @@ QString QBluetoothUuid::protocolToString(QBluetoothUuid::ProtocolUuid uuid) case QBluetoothUuid::Avdtp: return QBluetoothServiceDiscoveryAgent::tr("Audio/Video Distribution Transport Protocol"); case QBluetoothUuid::Cmtp: return QBluetoothServiceDiscoveryAgent::tr("Common ISDN Access Protocol"); case QBluetoothUuid::UdiCPlain: return QBluetoothServiceDiscoveryAgent::tr("UdiCPlain"); - case QBluetoothUuid::McapControlChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol -Control"); + case QBluetoothUuid::McapControlChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol - Control"); case QBluetoothUuid::McapDataChannel: return QBluetoothServiceDiscoveryAgent::tr("Multi-Channel Adaptation Protocol - Data"); case QBluetoothUuid::L2cap: return QBluetoothServiceDiscoveryAgent::tr("Layer 2 Control Protocol"); default: -- cgit v1.2.3 From 6b2fd04b7be4494767b6092a030607010d91310c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 5 Mar 2015 12:22:22 +0100 Subject: Shift all OSX & iOS translations into C++ file lupdate cannot parse .mm files. Therefore tr markup must be inside of C++ files. Some error strings where slightly modified to make use of already existing translations for other backends such as Bluez and QNX. Change-Id: I97fe6cfe2227e32fdbc61edd253080a1cd68edc9 Reviewed-by: Friedemann Kleint --- src/bluetooth/osx/osxbt.pri | 3 + src/bluetooth/osx/uistrings.cpp | 82 +++++++++++++++++++ src/bluetooth/osx/uistrings_p.h | 91 ++++++++++++++++++++++ .../qbluetoothdevicediscoveryagent_ios.mm | 14 ++-- .../qbluetoothdevicediscoveryagent_osx.mm | 16 ++-- .../qbluetoothservicediscoveryagent_osx.mm | 11 +-- src/bluetooth/qbluetoothsocket_osx.mm | 17 ++-- src/bluetooth/qbluetoothtransferreply_bluez.cpp | 2 +- src/bluetooth/qbluetoothtransferreply_osx.mm | 42 +++++----- src/bluetooth/qlowenergycontroller_osx.mm | 9 ++- 10 files changed, 235 insertions(+), 52 deletions(-) create mode 100644 src/bluetooth/osx/uistrings.cpp create mode 100644 src/bluetooth/osx/uistrings_p.h diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 5f1dddec..06389fcc 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -1,3 +1,6 @@ +SOURCES += osx/uistrings.cpp +PRIVATE_HEADERS += osx/uistrings_p.h + CONFIG(osx) { PRIVATE_HEADERS += osx/osxbtutility_p.h \ osx/osxbtdevicepair_p.h \ diff --git a/src/bluetooth/osx/uistrings.cpp b/src/bluetooth/osx/uistrings.cpp new file mode 100644 index 00000000..5684533e --- /dev/null +++ b/src/bluetooth/osx/uistrings.cpp @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "uistrings_p.h" + +// Translatable messages should go into this .cpp file for them to +// be picked up by lupdate. + +QT_BEGIN_NAMESPACE + +const char DEV_DISCOVERY[] = "QBluetoothDeviceDiscoveryAgent"; +const char DD_POWERED_OFF[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Device is powered off"); +const char DD_INVALID_ADAPTER[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Cannot find valid Bluetooth adapter."); +const char DD_IO[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Input Output Error"); +const char DD_NOTSUPPORTED[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Bluetooth LE is not supported"); +const char DD_UNKNOWN_ERROR[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Unknown error"); +const char DD_NOT_STARTED[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Cannot start device inquiry"); +const char DD_NOT_STARTED_LE[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Cannot start low energy device inquiry"); +const char DD_NOT_STOPPED[] = QT_TRANSLATE_NOOP("QBluetoothDeviceDiscoveryAgent", "Discovery cannot be stopped"); + +const char SERVICE_DISCOVERY[] = "QBluetoothServiceDiscoveryAgent"; +const char SD_LOCAL_DEV_OFF[] = QT_TRANSLATE_NOOP("QBluetoothServiceDiscoveryAgent", "Local device is powered off"); +const char SD_MINIMAL_FAILED[] = QT_TRANSLATE_NOOP("QBluetoothServiceDiscoveryAgent", "Minimal service discovery failed"); +const char SD_INVALID_ADDRESS[] = QT_TRANSLATE_NOOP("QBluetoothServiceDiscoveryAgent", "Invalid Bluetooth adapter address"); + +const char SOCKET[] = "QBluetoothSocket"; +const char SOC_NETWORK_ERROR[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Network Error"); +const char SOC_NOWRITE[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Cannot write while not connected"); +const char SOC_CONNECT_IN_PROGRESS[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Trying to connect while connection is in progress"); +const char SOC_SERVICE_NOT_FOUND[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Service cannot be found"); +const char SOC_INVAL_DATASIZE[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Invalid data/data size"); +const char SOC_NOREAD[] = QT_TRANSLATE_NOOP("QBluetoothSocket", "Cannot read while not connected"); + +const char TRANSFER_REPLY[] = "QBluetoothTransferReply"; +const char TR_INVAL_TARGET[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Invalid target address"); +const char TR_SESSION_NO_START[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Push session cannot be started"); +const char TR_CONNECT_FAILED[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Push session cannot connect"); +const char TR_FILE_NOT_EXIST[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Source file does not exist"); +const char TR_NOT_READ_IODEVICE[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "QIODevice cannot be read. Make sure it is open for reading."); +const char TR_SESSION_FAILED[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Push session failed"); +const char TR_INVALID_DEVICE[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Invalid input device (null)"); +const char TR_OP_CANCEL[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Operation canceled"); +const char TR_IN_PROGRESS[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Transfer already started"); +const char TR_SERVICE_NO_FOUND[] = QT_TRANSLATE_NOOP("QBluetoothTransferReply", "Push service not found"); + +const char LE_CONTROLLER[] = "QLowEnergyController"; +const char LEC_RDEV_NO_FOUND[] = QT_TRANSLATE_NOOP("QLowEnergyController", "Remote device cannot be found"); +const char LEC_NO_LOCAL_DEV[] = QT_TRANSLATE_NOOP("QLowEnergyController", "Cannot find local adapter"); +const char LEC_IO_ERROR[] = QT_TRANSLATE_NOOP("QLowEnergyController", "Error occurred during connection I/O"); +const char LEC_UNKNOWN_ERROR[] = QT_TRANSLATE_NOOP("QLowEnergyController", "Unknown Error"); + +QT_END_NAMESPACE diff --git a/src/bluetooth/osx/uistrings_p.h b/src/bluetooth/osx/uistrings_p.h new file mode 100644 index 00000000..303bad89 --- /dev/null +++ b/src/bluetooth/osx/uistrings_p.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TRANSLATIONS_H +#define TRANSLATIONS_H + +#include +#include + +QT_BEGIN_NAMESPACE + +// QBluetoothDeviceDiscoveryAgent related strings +extern const char DEV_DISCOVERY[]; +extern const char DD_POWERED_OFF[]; +extern const char DD_INVALID_ADAPTER[]; +extern const char DD_IO[]; +extern const char DD_NOTSUPPORTED[]; +extern const char DD_UNKNOWN_ERROR[]; +extern const char DD_NOT_STARTED[]; +extern const char DD_NOT_STARTED_LE[]; +extern const char DD_NOT_STOPPED[]; + +// QBluetoothServiceDiscoveryAgent related strings +extern const char SERVICE_DISCOVERY[]; +extern const char SD_LOCAL_DEV_OFF[]; +extern const char SD_MINIMAL_FAILED[]; +extern const char SD_INVALID_ADDRESS[]; + +// QBluetoothSocket related strings +extern const char SOCKET[]; +extern const char SOC_NETWORK_ERROR[]; +extern const char SOC_NOWRITE[]; +extern const char SOC_CONNECT_IN_PROGRESS[]; +extern const char SOC_SERVICE_NOT_FOUND[]; +extern const char SOC_INVAL_DATASIZE[]; +extern const char SOC_NOREAD[]; + +// QBluetoothTransferReply related strings +extern const char TRANSFER_REPLY[]; +extern const char TR_INVAL_TARGET[]; +extern const char TR_SESSION_NO_START[]; +extern const char TR_CONNECT_FAILED[]; +extern const char TR_FILE_NOT_EXIST[]; +extern const char TR_NOT_READ_IODEVICE[]; +extern const char TR_SESSION_FAILED[]; +extern const char TR_INVALID_DEVICE[]; +extern const char TR_OP_CANCEL[]; +extern const char TR_IN_PROGRESS[]; +extern const char TR_SERVICE_NO_FOUND[]; + +// QLowEnergyController related strings +extern const char LE_CONTROLLER[]; +extern const char LEC_RDEV_NO_FOUND[]; +extern const char LEC_NO_LOCAL_DEV[]; +extern const char LEC_IO_ERROR[]; +extern const char LEC_UNKNOWN_ERROR[]; + +QT_END_NAMESPACE + +#endif // TRANSLATIONS_H + diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm index 1bce6400..85c9f0da 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_ios.mm @@ -36,6 +36,7 @@ #include "qbluetoothlocaldevice.h" #include "qbluetoothdeviceinfo.h" #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include "qbluetoothuuid.h" #include @@ -156,8 +157,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() // We can be here only if we have some kind of // resource allocation error. setError(QBluetoothDeviceDiscoveryAgent::UnknownError, - QObject::tr("device discovery agent, failed to start: " - "resource allocation error")); + QCoreApplication::translate(DEV_DISCOVERY, DD_NOT_STARTED); emit q_ptr->error(lastError); } } @@ -270,20 +270,20 @@ void QBluetoothDeviceDiscoveryAgentPrivate::setError(QBluetoothDeviceDiscoveryAg errorString = QString(); break; case QBluetoothDeviceDiscoveryAgent::PoweredOffError: - errorString = QObject::tr("device discovery agent: adapter is powered off"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_POWERED_OFF); break; case QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError: - errorString = QObject::tr("device discovery agent: invalid bluetooth adapter"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_INVALID_ADAPTER); break; case QBluetoothDeviceDiscoveryAgent::InputOutputError: - errorString = QObject::tr("device discovery agent: input output error"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_IO); break; case QBluetoothDeviceDiscoveryAgent::UnsupportedPlatformError: - errorString = QObject::tr("Bluetooth LE is not supported"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_NOTSUPPORTED); break; case QBluetoothDeviceDiscoveryAgent::UnknownError: default: - errorString = QObject::tr("device discovery agent: unknown error"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_UNKNOWN_ERROR); } } } diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm index b6e32231..194eba07 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm @@ -38,6 +38,7 @@ #include "osx/osxbtsdpinquiry_p.h" #include "qbluetoothdeviceinfo.h" #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include "qbluetoothhostinfo.h" #include "qbluetoothuuid.h" @@ -206,7 +207,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() const IOReturn res = [inquiry start]; if (res != kIOReturnSuccess) { - setError(res, QObject::tr("device discovery agent: failed to start")); + setError(res, QCoreApplication::translate(DEV_DISCOVERY, DD_NOT_STARTED)); agentState = NonActive; emit q_ptr->error(lastError); } @@ -224,8 +225,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startLE() // We can be here only if we have some kind of resource allocation error, so we // do not emit finished, we emit error. setError(QBluetoothDeviceDiscoveryAgent::UnknownError, - QObject::tr("device discovery agent, LE mode: " - "resource allocation error")); + QCoreApplication::translate(DEV_DISCOVERY, DD_NOT_STARTED_LE)); agentState = NonActive; emit q_ptr->error(lastError); } @@ -250,7 +250,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::stop() qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to stop"; startPending = prevStart; stopPending = false; - setError(res, QObject::tr("device discovery agent: failed to stop")); + setError(res, QCoreApplication::translate(DEV_DISCOVERY, DD_NOT_STOPPED)); emit q_ptr->error(lastError); } } else { @@ -357,17 +357,17 @@ void QBluetoothDeviceDiscoveryAgentPrivate::setError(QBluetoothDeviceDiscoveryAg errorString = QString(); break; case QBluetoothDeviceDiscoveryAgent::PoweredOffError: - errorString = QObject::tr("device discovery agent: adapter is powered off"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_POWERED_OFF); break; case QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError: - errorString = QObject::tr("device discovery agent: invalid bluetooth adapter"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_INVALID_ADAPTER); break; case QBluetoothDeviceDiscoveryAgent::InputOutputError: - errorString = QObject::tr("device discovery agent: input output error"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_IO); break; case QBluetoothDeviceDiscoveryAgent::UnknownError: default: - errorString = QObject::tr("device discovery agent: unknown error"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_UNKNOWN_ERROR); } } diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm index faceabac..572e445e 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm @@ -37,6 +37,7 @@ #include "osx/osxbtsdpinquiry_p.h" #include "qbluetoothhostinfo.h" #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include #include @@ -176,7 +177,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::startServiceDiscovery() discoveredDevices.clear(); if (singleDevice) { error = QBluetoothServiceDiscoveryAgent::PoweredOffError; - errorString = QBluetoothServiceDiscoveryAgent::tr("Local device is powered off"); + errorString = QCoreApplication::translate(SERVICE_DISCOVERY, SD_LOCAL_DEV_OFF); emit q_ptr->error(error); } @@ -250,7 +251,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryError(QBluetoothD Q_ASSERT_X(q_ptr, Q_FUNC_INFO, "invalid q_ptr (null)"); error = QBluetoothServiceDiscoveryAgent::UnknownError; - errorString = tr("Unknown error while scanning for devices"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_UNKNOWN_ERROR); deviceDiscoveryAgent->stop(); deviceDiscoveryAgent.reset(Q_NULLPTR); @@ -326,7 +327,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::SDPInquiryError(IOBluetoothDevice * // TODO: find a better mapping from IOReturn to QBluetoothServiceDiscoveryAgent::Error. if (singleDevice) { error = QBluetoothServiceDiscoveryAgent::UnknownError; - errorString = QObject::tr("service discovery agent: unknown error"); + errorString = QCoreApplication::translate(DEV_DISCOVERY, DD_UNKNOWN_ERROR); emit q_ptr->error(error); } @@ -344,7 +345,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::performMinimalServiceDiscovery(cons if (!device || !device.services) { if (singleDevice) { error = QBluetoothServiceDiscoveryAgent::UnknownError; - errorString = tr("service discovery agent: minimal service discovery failed"); + errorString = QCoreApplication::translate(SERVICE_DISCOVERY, SD_MINIMAL_FAILED); emit q_ptr->error(error); } } else { @@ -431,7 +432,7 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoot return; } d_ptr->error = InvalidBluetoothAdapterError; - d_ptr->errorString = tr("Invalid Bluetooth adapter address"); + d_ptr->errorString = QCoreApplication::translate(SERVICE_DISCOVERY, SD_INVALID_ADDRESS); } } diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 2472cbee..62883247 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -42,6 +42,7 @@ #include "qbluetoothlocaldevice.h" #include "qbluetoothdeviceinfo.h" #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include "qbluetoothsocket.h" #include @@ -250,7 +251,7 @@ void QBluetoothSocketPrivate::_q_writeNotify() status = [l2capChannel writeAsync:writeChunk.data() length:UInt16(size)]; if (status != kIOReturnSuccess) { - errorString = QBluetoothSocket::tr("Network Error"); + errorString = QCoreApplication::translate(SOCKET, SOC_NETWORK_ERROR); q_ptr->setSocketError(QBluetoothSocket::NetworkError); return; } else { @@ -386,7 +387,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) Q_ASSERT_X(maxSize > 0, Q_FUNC_INFO, "invalid data size"); if (state != QBluetoothSocket::ConnectedState) { - errorString = tr("Cannot write while not connected"); + errorString = QCoreApplication::translate(SOCKET, SOC_NOWRITE); q_ptr->setSocketError(QBluetoothSocket::OperationError); return -1; } @@ -445,7 +446,7 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op { if (state() != UnconnectedState && state() != ServiceLookupState) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; - d_ptr->errorString = tr("Trying to connect while connection is in progress"); + d_ptr->errorString = QCoreApplication::translate(SOCKET, SOC_CONNECT_IN_PROGRESS); setSocketError(OperationError); return; } @@ -474,7 +475,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const { if (state() != QBluetoothSocket::UnconnectedState) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; - d_ptr->errorString = tr("Trying to connect while connection is in progress"); + d_ptr->errorString = QCoreApplication::translate(SOCKET, SOC_CONNECT_IN_PROGRESS); setSocketError(QBluetoothSocket::OperationError); return; } @@ -491,7 +492,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint1 { if (state() != QBluetoothSocket::UnconnectedState) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "called on a busy socket"; - d_ptr->errorString = tr("Trying to connect while connection is in progress"); + d_ptr->errorString = QCoreApplication::translate(SOCKET, SOC_CONNECT_IN_PROGRESS); setSocketError(OperationError); return; } @@ -585,7 +586,7 @@ void QBluetoothSocket::serviceDiscovered(const QBluetoothServiceInfo &service) void QBluetoothSocket::discoveryFinished() { - d_ptr->errorString = tr("Service cannot be found"); + d_ptr->errorString = QCoreApplication::translate(SOCKET, SOC_SERVICE_NOT_FOUND); setSocketState(UnconnectedState); setSocketError(ServiceNotFoundError); } @@ -642,7 +643,7 @@ quint16 QBluetoothSocket::peerPort() const qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize) { if (!data || maxSize <= 0) { - d_ptr->errorString = tr("Invalid data/data size"); + d_ptr->errorString = QCoreApplication::translate(SOCKET, SOC_INVAL_DATASIZE); setSocketError(QBluetoothSocket::OperationError); return -1; } @@ -653,7 +654,7 @@ qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize) qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) { if (state != QBluetoothSocket::ConnectedState) { - errorString = tr("Cannot read while not connected"); + errorString = QCoreApplication::translate(SOCKET, SOC_NOREAD); q_ptr->setSocketError(QBluetoothSocket::OperationError); return -1; } diff --git a/src/bluetooth/qbluetoothtransferreply_bluez.cpp b/src/bluetooth/qbluetoothtransferreply_bluez.cpp index 61bfb90d..f7f72873 100644 --- a/src/bluetooth/qbluetoothtransferreply_bluez.cpp +++ b/src/bluetooth/qbluetoothtransferreply_bluez.cpp @@ -385,7 +385,7 @@ void QBluetoothTransferReplyBluez::Error(const QDBusObjectPath &in0, const QStri m_errorStr = tr("Could not open file for sending"); } else if (in1 == QStringLiteral("Operation canceled")) { m_error = QBluetoothTransferReply::UserCanceledTransferError; - m_errorStr = tr("Operation canceled"); + m_errorStr = QBluetoothTransferReply::tr("Operation canceled"); } else { m_error = QBluetoothTransferReply::UnknownError; } diff --git a/src/bluetooth/qbluetoothtransferreply_osx.mm b/src/bluetooth/qbluetoothtransferreply_osx.mm index 2b5389fb..1b84626b 100644 --- a/src/bluetooth/qbluetoothtransferreply_osx.mm +++ b/src/bluetooth/qbluetoothtransferreply_osx.mm @@ -36,6 +36,7 @@ #include "osx/osxbtobexsession_p.h" #include "qbluetoothserviceinfo.h" #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include "qbluetoothuuid.h" @@ -172,7 +173,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev if (device.isNull() || !channelID) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid device address or port"; setReplyError(QBluetoothTransferReply::HostNotFoundError, - QObject::tr("Invalid target address")); + QCoreApplication::translate(TRANSFER_REPLY, TR_INVAL_TARGET)); return; } @@ -182,7 +183,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate OSXBTOBEXSession object"; setReplyError(QBluetoothTransferReply::UnknownError, - QObject::tr("Failed to create an OBEX session")); + QCoreApplication::translate(TRANSFER_REPLY, TR_SESSION_NO_START)); return; } @@ -199,7 +200,7 @@ void QBluetoothTransferReplyOSXPrivate::sendConnect(const QBluetoothAddress &dev if (error == QBluetoothTransferReply::NoError) { // The error is not set yet. error = QBluetoothTransferReply::SessionError; - errorString = QObject::tr("OBEXConnect failed"); + errorString = QCoreApplication::translate(TRANSFER_REPLY, TR_CONNECT_FAILED); } requestComplete = true; @@ -221,14 +222,13 @@ void QBluetoothTransferReplyOSXPrivate::sendPut() if (file) { if (!file->exists()) { setReplyError(QBluetoothTransferReply::FileNotFoundError, - QObject::tr("Source file does not exist")); + QCoreApplication::translate(TRANSFER_REPLY, TR_FILE_NOT_EXIST)); return; } else if (!file->isReadable()) { file->open(QIODevice::ReadOnly); if (!file->isReadable()) { setReplyError(QBluetoothTransferReply::IODeviceNotReadableError, - QObject::tr("File cannot be read. " - "Make sure it is open for reading.")); + QCoreApplication::translate(TRANSFER_REPLY, TR_NOT_READ_IODEVICE)); return; } } @@ -237,8 +237,7 @@ void QBluetoothTransferReplyOSXPrivate::sendPut() } else { if (!inputStream->isReadable()) { setReplyError(QBluetoothTransferReply::IODeviceNotReadableError, - QObject::tr("QIODevice cannot be read. " - "Make sure it is open for reading.")); + QCoreApplication::translate(TRANSFER_REPLY, TR_NOT_READ_IODEVICE)); return; } @@ -253,7 +252,7 @@ void QBluetoothTransferReplyOSXPrivate::sendPut() if ([session OBEXPutFile:inputStream withName:fileName] != kOBEXSuccess) { // TODO: convert OBEXError into something reasonable? setReplyError(QBluetoothTransferReply::SessionError, - QObject::tr("OBEX put failed")); + QCoreApplication::translate(TRANSFER_REPLY, TR_SESSION_FAILED)); } } @@ -265,12 +264,12 @@ void QBluetoothTransferReplyOSXPrivate::OBEXConnectError(OBEXError errorCode, OB if (session) { setReplyError(QBluetoothTransferReply::SessionError, - QObject::tr("OBEX connect failed")); + QCoreApplication::translate(TRANSFER_REPLY, TR_CONNECT_FAILED)); } else { // Else we're still in OBEXConnect, in a call-back // and do not want to emit yet (will be done a bit later). error = QBluetoothTransferReply::SessionError; - errorString = QObject::tr("OBEX connect failed"); + errorString = QCoreApplication::translate(TRANSFER_REPLY, TR_CONNECT_FAILED); requestComplete = true; } } @@ -318,7 +317,7 @@ void QBluetoothTransferReplyOSXPrivate::OBEXPutError(OBEXError errorCode, OBEXOp } setReplyError(QBluetoothTransferReply::SessionError, - QObject::tr("OBEX PUT command failed")); + QCoreApplication::translate(TRANSFER_REPLY, TR_SESSION_FAILED)); } void QBluetoothTransferReplyOSXPrivate::setReplyError(QBluetoothTransferReply::TransferError errorCode, @@ -352,7 +351,7 @@ QBluetoothTransferReplyOSX::QBluetoothTransferReplyOSX(QIODevice *input, } else { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid input stream (null)"; osx_d_ptr->requestComplete = true; - osx_d_ptr->errorString = tr("Invalid input file (null)"); + osx_d_ptr->errorString = QCoreApplication::translate(TRANSFER_REPLY, TR_INVALID_DEVICE); osx_d_ptr->error = FileNotFoundError; QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QBluetoothTransferReply::TransferError, FileNotFoundError)); @@ -393,7 +392,7 @@ bool QBluetoothTransferReplyOSX::abort() // Not setReplyError, we emit finished only! osx_d_ptr->requestComplete = true; - osx_d_ptr->errorString = tr("Operation canceled"); + osx_d_ptr->errorString = QCoreApplication::translate(TRANSFER_REPLY, TR_OP_CANCEL); osx_d_ptr->error = UserCanceledTransferError; emit finished(this); @@ -412,13 +411,15 @@ bool QBluetoothTransferReplyOSX::start() // Step 0: find a channelID. if (request().address().isNull()) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "invalid device address"; - osx_d_ptr->setReplyError(HostNotFoundError, tr("Invalid target address")); + osx_d_ptr->setReplyError(HostNotFoundError, + QCoreApplication::translate(TRANSFER_REPLY, TR_INVAL_TARGET)); return false; } return osx_d_ptr->startOPP(request().address()); } else { - osx_d_ptr->setReplyError(UnknownError, tr("Transfer already started")); + osx_d_ptr->setReplyError(UnknownError, + QCoreApplication::translate(TRANSFER_REPLY, TR_IN_PROGRESS)); return false; } } @@ -440,7 +441,8 @@ void QBluetoothTransferReplyOSX::serviceDiscoveryFinished() osx_d_ptr->agent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery); } else { // No service record, no channel ID, no OBEX session. - osx_d_ptr->setReplyError(HostNotFoundError, tr("OBEX/OPP serice not found")); + osx_d_ptr->setReplyError(HostNotFoundError, + QCoreApplication::translate(TRANSFER_REPLY, TR_SERVICE_NO_FOUND)); } } } @@ -451,7 +453,8 @@ void QBluetoothTransferReplyOSX::serviceDiscoveryError(QBluetoothServiceDiscover if (errorCode == QBluetoothServiceDiscoveryAgent::PoweredOffError) { // There's nothing else we can do. - osx_d_ptr->setReplyError(UnknownError, tr("Bluetooth adapter is powered off")); + osx_d_ptr->setReplyError(UnknownError, + QCoreApplication::translate(DEV_DISCOVERY, DD_POWERED_OFF)); return; } @@ -459,7 +462,8 @@ void QBluetoothTransferReplyOSX::serviceDiscoveryError(QBluetoothServiceDiscover osx_d_ptr->minimalScan = false; osx_d_ptr->agent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery); } else { - osx_d_ptr->setReplyError(HostNotFoundError, tr("Invalid target address")); + osx_d_ptr->setReplyError(HostNotFoundError, + QCoreApplication::translate(TRANSFER_REPLY, TR_INVAL_TARGET)); } } diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 6be8dd67..80a94d64 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -33,6 +33,7 @@ ****************************************************************************/ #include "osx/osxbtutility_p.h" +#include "osx/uistrings_p.h" #include "qlowenergyserviceprivate_p.h" #include "qlowenergycontroller_osx_p.h" @@ -694,17 +695,17 @@ void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::E errorString.clear(); break; case QLowEnergyController::UnknownRemoteDeviceError: - errorString = QLowEnergyController::tr("Remote device cannot be found"); + errorString = QCoreApplication::translate(LE_CONTROLLER, LEC_RDEV_NO_FOUND); break; case QLowEnergyController::InvalidBluetoothAdapterError: - errorString = QLowEnergyController::tr("Cannot find local adapter"); + errorString = QCoreApplication::translate(LE_CONTROLLER, LEC_NO_LOCAL_DEV); break; case QLowEnergyController::NetworkError: - errorString = QLowEnergyController::tr("Error occurred during connection I/O"); + errorString = QCoreApplication::translate(LE_CONTROLLER, LEC_IO_ERROR); break; case QLowEnergyController::UnknownError: default: - errorString = QLowEnergyController::tr("Unknown Error"); + errorString = QCoreApplication::translate(LE_CONTROLLER, LEC_UNKNOWN_ERROR); break; } } -- cgit v1.2.3 From 935975a268279671a34084e306b44901d266c419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Wa=C3=9Fmuth?= Date: Tue, 10 Mar 2015 15:49:33 +0100 Subject: QLowEnergyController_bluez now responds to server requests. The bluez implementation of QLowEnergyController now responds to requests with a "Request not supported" message, instead of ignoring it. If such requests are ignored, the remote will close the connection after 30 seconds, according to the bluetooth ATT specification. Task-number: QTBUG-44915 Change-Id: Id81b4a31d92a48269eda7d6c2d5995639dffe00a Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_bluez.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index f22cea71..f061dba8 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -79,6 +79,7 @@ #define ATT_OP_WRITE_COMMAND 0x52 //write characteristic without response //GATT command sizes in bytes +#define ERROR_RESPONSE_HEADER_SIZE 5 #define FIND_INFO_REQUEST_HEADER_SIZE 5 #define GRP_TYPE_REQ_HEADER_SIZE 7 #define READ_BY_TYPE_REQ_HEADER_SIZE 7 @@ -352,9 +353,20 @@ void QLowEnergyControllerPrivate::l2cpReadyRead() case ATT_OP_READ_REQUEST: case ATT_OP_FIND_INFORMATION_REQUEST: case ATT_OP_WRITE_REQUEST: - qCWarning(QT_BT_BLUEZ) << "Unexpected message type" << hex << command - << "will be ignored" ; + { + qCDebug(QT_BT_BLUEZ) << "Server request" << hex << command; + + //send not supported + QByteArray packet(ERROR_RESPONSE_HEADER_SIZE, Qt::Uninitialized); + packet[0] = ATT_OP_ERROR_RESPONSE; + packet[1] = command; + bt_put_unaligned(htobs(0), (quint16 *)(packet.data() + 2)); + packet[4] = ATT_ERROR_REQUEST_NOT_SUPPORTED; + + sendCommand(packet); + return; + } default: //only solicited replies finish pending requests requestPending = false; -- cgit v1.2.3 From 341223e26d611b41c4b533c1b3b0a5d428c83331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Tue, 3 Mar 2015 11:24:36 +0100 Subject: Android: Replace call to deprecated getStaticObjectField() function. The template version of QAndroidJniObject::getStaticObjectField() is deprecated. Use the non-template version instead. Change-Id: If60abfc33e55dbdfdfedb7c603f191285cd13eeb Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothsocket_android.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 31009ba2..ab257cf4 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -98,7 +98,7 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe return false; } - QAndroidJniObject integerObject = QAndroidJniObject::getStaticObjectField( + QAndroidJniObject integerObject = QAndroidJniObject::getStaticObjectField( "java/lang/Integer", "TYPE", "Ljava/lang/Class;"); if (!integerObject.isValid()) { qCWarning(QT_BT_ANDROID) << "Could not get Integer.TYPE"; -- cgit v1.2.3 From 669b427653f8f708269431917f720f7e76680191 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Mar 2015 10:21:22 +0100 Subject: Android: Fix crash in QBluetoothLocalDevice ctor due to Java exception In general BluetoothAdapter.getDefaultAdapter should not throw an exception. If the device does not support Bluetooth the function should return a null reference only. However some devices throw a RuntimeException as well. We need to catch it to prevent unwinding of the stack. At the same time the patch simplifies the code by using QAndroidJniObject where possible. [ChangeLog][QtBluetooth][Android] Fixed crash in QBluetoothLocalDevice ctor on some devices due to a platform exception in QBluetoothAdapter.getDefaultAdapter(). Task-number: QTBUG-45066 Change-Id: I933783cda891127e5e37722f96f477c13b433ca7 Reviewed-by: Timur Pocheptsov Reviewed-by: Christian Stromme --- src/bluetooth/qbluetoothlocaldevice_android.cpp | 38 +++++++------------------ 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_android.cpp b/src/bluetooth/qbluetoothlocaldevice_android.cpp index 11515743..8160a15d 100644 --- a/src/bluetooth/qbluetoothlocaldevice_android.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_android.cpp @@ -83,35 +83,20 @@ void QBluetoothLocalDevicePrivate::initialize(const QBluetoothAddress &address) { QAndroidJniEnvironment env; - jclass btAdapterClass = env->FindClass("android/bluetooth/BluetoothAdapter"); - if (btAdapterClass == NULL) { - qCWarning(QT_BT_ANDROID) - << "Native registration unable to find class android/bluetooth/BluetoothAdapter"; - return; - } - - jmethodID getDefaultAdapterID - = env->GetStaticMethodID(btAdapterClass, "getDefaultAdapter", - "()Landroid/bluetooth/BluetoothAdapter;"); - if (getDefaultAdapterID == NULL) { - qCWarning(QT_BT_ANDROID) - << "Native registration unable to get method ID: " \ - "getDefaultAdapter of android/bluetooth/BluetoothAdapter"; - return; - } - - jobject btAdapterObject = env->CallStaticObjectMethod(btAdapterClass, getDefaultAdapterID); - if (btAdapterObject == NULL) { + QAndroidJniObject adapter = QAndroidJniObject::callStaticObjectMethod( + "android/bluetooth/BluetoothAdapter", "getDefaultAdapter", + "()Landroid/bluetooth/BluetoothAdapter;"); + if (!adapter.isValid()) { + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } qCWarning(QT_BT_ANDROID) << "Device does not support Bluetooth"; - env->DeleteLocalRef(btAdapterClass); return; } - obj = new QAndroidJniObject(btAdapterObject); - if (!obj->isValid()) { - delete obj; - obj = 0; - } else if (!address.isNull()) { + obj = new QAndroidJniObject(adapter); + if (!address.isNull()) { const QString localAddress = obj->callObjectMethod("getAddress", "()Ljava/lang/String;").toString(); if (localAddress != address.toString()) { @@ -120,9 +105,6 @@ void QBluetoothLocalDevicePrivate::initialize(const QBluetoothAddress &address) obj = 0; } } - - env->DeleteLocalRef(btAdapterObject); - env->DeleteLocalRef(btAdapterClass); } bool QBluetoothLocalDevicePrivate::isValid() const -- cgit v1.2.3 From d70cba381938a2043b66211dcca07c012f3fa34a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Mar 2015 09:49:12 +0100 Subject: OSX: Ensure service discovery is stopped when socket disconnects Task-number: QTBUG-44930 Change-Id: Iffdbe5d85a0c8b0168d6a196ffbe848e07535950 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_osx.mm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 62883247..808b8e5a 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -596,6 +596,12 @@ void QBluetoothSocket::abort() if (state() == UnconnectedState) return; + if (state() == ServiceLookupState && d_ptr->discoveryAgent) { + d_ptr->discoveryAgent->disconnect(); + d_ptr->discoveryAgent->stop(); + d_ptr->discoveryAgent.reset(); + } + d_ptr->abort(); setOpenMode(NotOpen); @@ -676,6 +682,13 @@ void QBluetoothSocket::close() return; setOpenMode(NotOpen); + + if (state() == ServiceLookupState && d_ptr->discoveryAgent) { + d_ptr->discoveryAgent->disconnect(); + d_ptr->discoveryAgent->stop(); + d_ptr->discoveryAgent.reset(); + } + setSocketState(ClosingState); d_ptr->close(); -- cgit v1.2.3 From a888044ed7c4ac1422f5e1f73fe747f0cd2f7531 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Mar 2015 10:01:10 +0100 Subject: OSX: Minor signal and readability fix for QBluetoothSocket 1.) QBluetoothSocketPrivate::close() is always called after the socket state has changed to ClosingState. The removed check was meaningless. 2.) Ensure socket is set to NotOpen and ClosingState before we start the socket's abort() process. Change-Id: Idf693be2068f77020113f38612b03565a2a89ca4 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_osx.mm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 808b8e5a..1d8cbd10 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -153,10 +153,6 @@ void QBluetoothSocketPrivate::close() Q_ASSERT_X(!isConnecting, Q_FUNC_INFO, "internal inconsistency - " "still in connectToService()"); - // Only go through closing if the socket was fully opened - if (state == QBluetoothSocket::ConnectedState) - q_ptr->setSocketState(QBluetoothSocket::ClosingState); - if (!txBuffer.size()) abort(); } @@ -596,15 +592,17 @@ void QBluetoothSocket::abort() if (state() == UnconnectedState) return; + setOpenMode(NotOpen); + if (state() == ServiceLookupState && d_ptr->discoveryAgent) { d_ptr->discoveryAgent->disconnect(); d_ptr->discoveryAgent->stop(); d_ptr->discoveryAgent.reset(); } + setSocketState(QBluetoothSocket::ClosingState); d_ptr->abort(); - setOpenMode(NotOpen); setSocketState(QBluetoothSocket::UnconnectedState); emit disconnected(); } -- cgit v1.2.3 From 752de447fe646c20f35b0b304ec2ff737be10ab6 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Mar 2015 15:50:15 +0100 Subject: Minor code optimization QBluetoothSocketPrivate::close() was always called when the internal socket state has been set to ClosingState. The removed checks were meaningless. Change-Id: Ia36808a21de7dd1076cdd47bca8fd6855ec957c3 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_bluez.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 9eedc492..9f68386c 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -511,20 +511,10 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) void QBluetoothSocketPrivate::close() { - Q_Q(QBluetoothSocket); - - // Only go through closing if the socket was fully opened - if(state == QBluetoothSocket::ConnectedState) - q->setSocketState(QBluetoothSocket::ClosingState); - - if(txBuffer.size() > 0 && - state == QBluetoothSocket::ClosingState){ + if (txBuffer.size() > 0) connectWriteNotifier->setEnabled(true); - } - else { + else abort(); - } - } bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType_, -- cgit v1.2.3 From eb78c7e82288fb730c40b97f720a4b6d7f251d35 Mon Sep 17 00:00:00 2001 From: Stephan Binner Date: Fri, 20 Mar 2015 15:51:09 +0100 Subject: Fix storing of image MIME record Change-Id: I0866be315d70a6e21b587130c246e8e06a954a36 Reviewed-by: Alex Blasche --- examples/nfc/ndefeditor/mimeimagerecordeditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp index 134d674c..5ed733a4 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp @@ -134,6 +134,7 @@ void MimeImageRecordEditor::on_mimeImageOpen_clicked() ui->mimeImageFile->setText(mimeDataFile); ui->mimeImageImage->setPixmap(QPixmap::fromImage(image)); + m_record.setTypeNameFormat(QNdefRecord::Mime); m_record.setType(mimeType.toLatin1()); m_record.setPayload(imageData); } -- cgit v1.2.3 From 1347daf482148127a75b72048db6b76ecc058242 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 23 Mar 2015 11:38:03 +0100 Subject: Bluetooth socket - fix invalid invokeMethod call on OS X While removing hand-written signatures from warnings/errors, the correct name in invokeMethod was accidentally replaced with Q_FUNC_INFO - must be '_q_writeNotify' instead, now fixed. Change-Id: I65225de7cd6e2fdce0cdd8b7c9f09609feb49ae3 Task-number: QTBUG-45177 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothsocket_osx.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index 1d8cbd10..490c1bed 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -392,7 +392,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) // IOBluetoothL2CAPChannel buffered (writeAsync). if (!txBuffer.size()) - QMetaObject::invokeMethod(this, Q_FUNC_INFO, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "_q_writeNotify", Qt::QueuedConnection); char *dst = txBuffer.reserve(maxSize); std::copy(data, data + maxSize, dst); -- cgit v1.2.3 From 3770dcf6dbfadd88c16beaa4d510dc16b519d4b8 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Mar 2015 15:42:02 +0100 Subject: Fix crash in QBluetoothServiceDiscoveryAgent on Bluez 5.x The list of internally discovered devices was already cleared. It should not be referenced anymore. Furthermore the QBluetoothSocket is killed while its internal QBluetoothServiceDiscoveryAgent is still running. This change stops the agent as well and thereby prevents more QBluetoothSocket slots froms being invoked and a more controlled termination of QBluetoothServiceDiscoveryAgent. [ChangeLog][QtBluetooth][Android] Fixed crash in QBluetoothServiceDiscoveryAgent on Bluez 5 when using single device discovery. Single device discovery is used during QBluetoothSocket::connectToService(). Task-number: QTBUG-44930 Change-Id: Ib3129c492151a3fe12b0c451cf5ffdddc62d001c Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp | 4 +++- src/bluetooth/qbluetoothsocket.cpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index 75efa37d..412fd916 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -272,7 +272,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_finishSdpScan(QBluetoothServiceD if (errorCode != QBluetoothServiceDiscoveryAgent::NoError) { qCWarning(QT_BT_BLUEZ) << "SDP search failed for" - << discoveredDevices.at(0).address().toString(); + << (!discoveredDevices.isEmpty() + ? discoveredDevices.at(0).address().toString() + : QStringLiteral("")); // We have an error which we need to indicate and stop further processing discoveredDevices.clear(); error = errorCode; diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 3c0b4239..f91057e1 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -602,6 +602,13 @@ void QBluetoothSocket::abort() Q_D(QBluetoothSocket); setOpenMode(QIODevice::NotOpen); + + if (state() == ServiceLookupState && d->discoveryAgent) { + d->discoveryAgent->disconnect(); + d->discoveryAgent->stop(); + d->discoveryAgent = 0; + } + setSocketState(ClosingState); d->abort(); @@ -679,6 +686,13 @@ void QBluetoothSocket::close() Q_D(QBluetoothSocket); setOpenMode(QIODevice::NotOpen); + + if (state() == ServiceLookupState && d->discoveryAgent) { + d->discoveryAgent->disconnect(); + d->discoveryAgent->stop(); + d->discoveryAgent = 0; + } + setSocketState(ClosingState); d->close(); -- cgit v1.2.3 From 0ae7051fbee32bc7bd2cbe452c78400ac7bb18d1 Mon Sep 17 00:00:00 2001 From: Stephan Binner Date: Mon, 23 Mar 2015 14:13:32 +0100 Subject: Fix loading of image and show image beneath texts Change-Id: I3c623dc0db720083bc2c0c4ef53e70ccf208bfd8 Reviewed-by: Alex Blasche --- examples/nfc/poster/poster.qml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index 499839e7..e7b5bba3 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -91,7 +91,7 @@ Rectangle { } break; case NdefRecord.Mime: - if (messageRecords[i].type.startsWith("image/")) { + if (messageRecords[i].type.indexOf("image/") === 0 ) { posterImage.source = messageRecords[i].uri; found = true; } @@ -115,15 +115,6 @@ Rectangle { font.pointSize: 18 } - Text { - id: posterText - anchors.horizontalCenter: parent.right - anchors.horizontalCenterOffset: - parent.width / 4 - y: -height - font.bold: true - font.pointSize: 18 - } - Image { id: posterImage scale: Image.PreserveAspectFit @@ -134,6 +125,15 @@ Rectangle { smooth: true } + Text { + id: posterText + anchors.horizontalCenter: parent.right + anchors.horizontalCenterOffset: - parent.width / 4 + y: -height + font.bold: true + font.pointSize: 18 + } + Text { id: posterUrl anchors.horizontalCenter: parent.right -- cgit v1.2.3 From 4103cc487bb92c375fdf4c0b9ab064435320e0a5 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 23 Mar 2015 16:34:48 +0100 Subject: Bluetooth - LE device discovery agent, timer bug (OS X) CBCentralManager does not have a timeout while scanning and we had to use a delayed selector (via performSelector) to interrupt the scan. This is a bug in the case we're in NSModalPanelRunLoopMode mode (for example) - selector never gets performed (it waits for the default mode) or performed too late. Found in our btchat example. Now we use external QTimer instead to check if it's time to stop a scan. Change-Id: I159bf5821398f3aa76f03a52a8334dea97cbf688 Reviewed-by: Alex Blasche --- src/bluetooth/bluetooth.pro | 1 + src/bluetooth/osx/osxbtcentralmanager.mm | 8 +-- src/bluetooth/osx/osxbtledeviceinquiry.mm | 25 +++++-- src/bluetooth/osx/osxbtledeviceinquiry_p.h | 6 ++ .../qbluetoothdevicediscoveryagent_osx.mm | 76 +++++++++++++++++++++- .../qbluetoothdevicediscoverytimer_osx_p.h | 68 +++++++++++++++++++ 6 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 src/bluetooth/qbluetoothdevicediscoverytimer_osx_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 9cec0a3d..be953d04 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -165,6 +165,7 @@ config_bluez:qtHaveModule(dbus) { qbluetoothserver_osx_p.h \ qbluetoothtransferreply_osx_p.h \ qbluetoothtransferreply_osx_p.h \ + qbluetoothdevicediscoverytimer_osx_p.h \ qlowenergycontroller_osx_p.h SOURCES -= qbluetoothdevicediscoveryagent.cpp diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index e539788d..bacea96b 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -680,9 +680,7 @@ using namespace QT_NAMESPACE; writeQueue.enqueue(request); [self performNextWriteRequest]; - // TODO: this is quite ugly: true value can be returned after - // write actually. If I have any problems with the order later, - // I'll use performSelector afterDelay with some delay. + return true; } @@ -705,9 +703,7 @@ using namespace QT_NAMESPACE; writeQueue.enqueue(request); [self performNextWriteRequest]; - // TODO: this is quite ugly: true value can be returned after - // write actually. If I have any problems with the order later, - // I'll use performSelector afterDelay with some delay. + return true; } diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 4e9235af..1dbe63a6 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -115,11 +115,12 @@ using namespace QT_NAMESPACE; @implementation QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) -+ (NSTimeInterval)inquiryLength ++ (int)inquiryLength { // There is no default timeout, // scan does not stop if not asked. - return 10; + // Return in milliseconds + return 10 * 1000; } - (id)initWithDelegate:(OSXBluetooth::LEDeviceInquiryDelegate *)aDelegate @@ -188,6 +189,7 @@ using namespace QT_NAMESPACE; [manager release]; } + startTime = QTime(); pendingStart = true; manager = [CBCentralManager alloc]; manager = [manager initWithDelegate:self queue:nil]; @@ -215,8 +217,12 @@ using namespace QT_NAMESPACE; if (pendingStart) { pendingStart = false; isActive = true; - [self performSelector:@selector(stopScan) withObject:nil - afterDelay:[QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) inquiryLength]]; +#ifndef Q_OS_OSX + const NSTimeInterval timeout([QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) inquiryLength] / 1000); + Q_ASSERT_X(timeout > 0., Q_FUNC_INFO, "invalid scan timeout"); + [self performSelector:@selector(stopScan) withObject:nil afterDelay:timeout]; +#endif + startTime = QTime::currentTime(); [manager scanForPeripheralsWithServices:nil options:nil]; } // Else we ignore. } else if (state == CBCentralManagerStateUnsupported || state == CBCentralManagerStateUnauthorized) { @@ -285,10 +291,10 @@ using namespace QT_NAMESPACE; using namespace OSXBluetooth; - Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); - Q_ASSERT_X(isActive,Q_FUNC_INFO, "called while there is no active scan"); - Q_ASSERT_X(!pendingStart, Q_FUNC_INFO, "both pendingStart and isActive are true"); + if (!isActive) + return; + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_9, __IPHONE_6_0) if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_9, QSysInfo::MV_IOS_6_0)) { @@ -323,4 +329,9 @@ using namespace QT_NAMESPACE; return pendingStart || isActive; } +- (const QTime&)startTime +{ + return startTime; +} + @end diff --git a/src/bluetooth/osx/osxbtledeviceinquiry_p.h b/src/bluetooth/osx/osxbtledeviceinquiry_p.h index 65005894..7e6d0c8f 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtledeviceinquiry_p.h @@ -36,6 +36,7 @@ #include "qbluetoothdevicediscoveryagent.h" +#include #include #include @@ -88,8 +89,12 @@ QT_END_NAMESPACE bool cancelled; // scan actually started. bool isActive; + QTime startTime; } +// Inquiry length in milliseconds. ++ (int)inquiryLength; + - (id)initWithDelegate:(QT_PREPEND_NAMESPACE(OSXBluetooth)::LEDeviceInquiryDelegate *)aDelegate; - (void)dealloc; @@ -99,6 +104,7 @@ QT_END_NAMESPACE - (void)stop; - (bool)isActive; +- (const QTime &)startTime; @end diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm index 194eba07..ecd21239 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm @@ -31,6 +31,7 @@ ** ****************************************************************************/ +#include "qbluetoothdevicediscoverytimer_osx_p.h" #include "qbluetoothdevicediscoveryagent.h" #include "osx/osxbtledeviceinquiry_p.h" #include "osx/osxbtdeviceinquiry_p.h" @@ -43,6 +44,7 @@ #include "qbluetoothuuid.h" #include +#include #include #include #include @@ -60,6 +62,7 @@ class QBluetoothDeviceDiscoveryAgentPrivate : public OSXBluetooth::DeviceInquiry public OSXBluetooth::LEDeviceInquiryDelegate { friend class QBluetoothDeviceDiscoveryAgent; + friend class OSXBluetooth::DDATimerHandler; public: QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress & address, QBluetoothDeviceDiscoveryAgent *q); @@ -97,6 +100,8 @@ private: void setError(IOReturn error, const QString &text = QString()); void setError(QBluetoothDeviceDiscoveryAgent::Error, const QString &text = QString()); + void checkLETimeout(); + QBluetoothDeviceDiscoveryAgent *q_ptr; AgentState agentState; @@ -121,8 +126,45 @@ private: typedef QList DevicesList; DevicesList discoveredDevices; + + OSXBluetooth::DDATimerHandler timer; }; +namespace OSXBluetooth { + +DDATimerHandler::DDATimerHandler(QBluetoothDeviceDiscoveryAgentPrivate *d) + : owner(d) +{ + Q_ASSERT_X(owner, Q_FUNC_INFO, "invalid pointer"); + + timer.setSingleShot(true); + connect(&timer, &QTimer::timeout, this, &DDATimerHandler::onTimer); +} + +void DDATimerHandler::start(int msec) +{ + Q_ASSERT_X(msec > 0, Q_FUNC_INFO, "invalid time interval"); + if (timer.isActive()) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "timer is active"; + return; + } + + timer.start(msec); +} + +void DDATimerHandler::stop() +{ + timer.stop(); +} + +void DDATimerHandler::onTimer() +{ + Q_ASSERT(owner); + owner->checkLETimeout(); +} + +} + QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &adapter, QBluetoothDeviceDiscoveryAgent *q) : q_ptr(q), @@ -131,7 +173,8 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con startPending(false), stopPending(false), lastError(QBluetoothDeviceDiscoveryAgent::NoError), - inquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry) + inquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry), + timer(this) { Q_ASSERT_X(q != Q_NULLPTR, Q_FUNC_INFO, "invalid q_ptr (null)"); @@ -221,9 +264,14 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startLE() agentState = LEScan; + // CoreBluetooth does not have a timeout. We start a timer here + // and check if scan really started and if yes if we have a timeout. + timer.start([LEDeviceInquiryObjC inquiryLength]); + if (![inquiryLE start]) { // We can be here only if we have some kind of resource allocation error, so we // do not emit finished, we emit error. + timer.stop(); setError(QBluetoothDeviceDiscoveryAgent::UnknownError, QCoreApplication::translate(DEV_DISCOVERY, DD_NOT_STARTED_LE)); agentState = NonActive; @@ -375,6 +423,27 @@ void QBluetoothDeviceDiscoveryAgentPrivate::setError(QBluetoothDeviceDiscoveryAg qCDebug(QT_BT_OSX) << "error set: "< 0); + const QTime scanStartTime([inquiryLE startTime]); + if (scanStartTime.isValid()) { + const int elapsed = scanStartTime.msecsTo(QTime::currentTime()); + Q_ASSERT(elapsed >= 0); + if (elapsed >= timeout) + [inquiryLE stop]; + else + timer.start(timeout - elapsed); + } else { + // Scan not started yet. Wait 5 seconds more. + timer.start(timeout / 2); + } +} + void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryError(QBluetoothDeviceDiscoveryAgent::Error error) { // At the moment the only error reported can be 'powered off' error, it happens @@ -382,6 +451,8 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryError(QBluetoothDevic Q_ASSERT_X(error == QBluetoothDeviceDiscoveryAgent::PoweredOffError, Q_FUNC_INFO, "unexpected error code"); + timer.stop(); + agentState = NonActive; setError(error); emit q_ptr->error(lastError); @@ -394,6 +465,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEnotSupported() // After we call startLE and before receive NotSupported, // the user can call stop (setting a pending stop). // So the same rule apply: + timer.stop(); LEdeviceInquiryFinished(); } @@ -427,6 +499,8 @@ void QBluetoothDeviceDiscoveryAgentPrivate::LEdeviceInquiryFinished() // The same logic as in inquiryFinished, but does not start LE scan. agentState = NonActive; + timer.stop(); + if (stopPending && !startPending) { stopPending = false; emit q_ptr->canceled(); diff --git a/src/bluetooth/qbluetoothdevicediscoverytimer_osx_p.h b/src/bluetooth/qbluetoothdevicediscoverytimer_osx_p.h new file mode 100644 index 00000000..1537d82e --- /dev/null +++ b/src/bluetooth/qbluetoothdevicediscoverytimer_osx_p.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHDEVICEDISCOVERYTIMER_OSX_P_H +#define QBLUETOOTHDEVICEDISCOVERYTIMER_OSX_P_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QBluetoothDeviceDiscoveryAgentPrivate; + +namespace OSXBluetooth { + +class DDATimerHandler : public QObject +{ + Q_OBJECT + +public: + DDATimerHandler(QBluetoothDeviceDiscoveryAgentPrivate *d); + + void start(int msec); + void stop(); + +private slots: + void onTimer(); + +private: + QTimer timer; + QBluetoothDeviceDiscoveryAgentPrivate *owner; +}; + +} + +QT_END_NAMESPACE + +#endif // QBLUETOOTHDEVICEDISCOVERYTIMER_OSX_P_H -- cgit v1.2.3 From cd37c6bbc6ad4368bf9f4bc5fb3b8462f2b10cab Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 23 Mar 2015 17:51:35 +0100 Subject: Bluetooth (classic) service discovery - skip LE devices (OS X) LE scan on OS X can find LE devices, but CoreBluetooth does not expose hardware addresses and as a result we can not run (and should not) SDP scan on such devices - just skip them. Change-Id: Iaa5c47e1d317c39918d13830c9c6eeab398bc7a5 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothservicediscoveryagent_osx.mm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm index 572e445e..64723dd1 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm @@ -171,6 +171,13 @@ void QBluetoothServiceDiscoveryAgentPrivate::startServiceDiscovery() state = ServiceDiscovery; const QBluetoothAddress &address(discoveredDevices.at(0).address()); + if (address.isNull()) { + // This can happen: LE scan works with CoreBluetooth, but CBPeripherals + // do not expose hardware addresses. + // Pop the current QBluetoothDeviceInfo and decide what to do next. + return serviceDiscoveryFinished(); + } + // Autoreleased object. IOBluetoothHostController *const hc = [IOBluetoothHostController defaultController]; if (![hc powerState]) { -- cgit v1.2.3 From 8440ab606048663ae7bef42c5930d5d77f30bf50 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 24 Mar 2015 13:12:27 +0100 Subject: Bluetooth device discovery agent - minor cleanup (OS X) Use d_ptr; test inquiryLE in 'isValid' also (just to be consistent). Change-Id: If5a8977cfc7adfb06150a2bf8a2e14d0613e26c7 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtledeviceinquiry.mm | 1 - src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm | 9 ++++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 1dbe63a6..af304d8d 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -108,7 +108,6 @@ using namespace QT_NAMESPACE; #endif @interface QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) (PrivateAPI) -+ (NSTimeInterval)inquiryLength; // "Timeout" callback to stop a scan. - (void)stopScan; @end diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm index ecd21239..ebf9352d 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm @@ -217,7 +217,8 @@ bool QBluetoothDeviceDiscoveryAgentPrivate::isValid() const // can fail to initialize some important data-members // (and the error is probably not even related to Bluetooth at all) // - say, allocation error - this is what meant here by valid/invalid. - return hostController && [hostController powerState] == kBluetoothHCIPowerStateON && inquiry; + return hostController && [hostController powerState] == kBluetoothHCIPowerStateON + && inquiry && inquiryLE; } bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const @@ -564,14 +565,12 @@ QBluetoothDeviceDiscoveryAgent::~QBluetoothDeviceDiscoveryAgent() QBluetoothDeviceDiscoveryAgent::InquiryType QBluetoothDeviceDiscoveryAgent::inquiryType() const { - Q_D(const QBluetoothDeviceDiscoveryAgent); - return d->inquiryType; + return d_ptr->inquiryType; } void QBluetoothDeviceDiscoveryAgent::setInquiryType(QBluetoothDeviceDiscoveryAgent::InquiryType type) { - Q_D(QBluetoothDeviceDiscoveryAgent); - d->inquiryType = type; + d_ptr->inquiryType = type; } QList QBluetoothDeviceDiscoveryAgent::discoveredDevices() const -- cgit v1.2.3 From ec8974790e4129d802b187e7322c4c871a8ddbf2 Mon Sep 17 00:00:00 2001 From: Peter Rustler Date: Mon, 16 Mar 2015 12:18:00 +0100 Subject: Make the right Nfc import in qml examples The examples in nfc that uses qml need to import 5.5 instead of 5.2. This patch is cherry-picked from the qtconnectivity/neard branch. Change-Id: Ieb4dcfc3ec667d7a13c78a6d52d6c1a3c54f78eb Reviewed-by: Stephan Binner Reviewed-by: Peter Rustler Reviewed-by: Alex Blasche --- examples/nfc/corkboard/corkboards.qml | 2 +- examples/nfc/poster/poster.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index fc2377bc..2f00bb5a 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -40,7 +40,7 @@ ****************************************************************************/ import QtQuick 2.3 -import QtNfc 5.2 +import QtNfc 5.5 Rectangle { width: 800; height: 480 diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index e7b5bba3..89e6af19 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -39,7 +39,7 @@ ****************************************************************************/ import QtQuick 2.3 -import QtNfc 5.2 +import QtNfc 5.5 Rectangle { id: root -- cgit v1.2.3 From e49ef4af0b202ef0387d6a76abd451f75760d1b8 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Mar 2015 15:21:33 +0100 Subject: Android: Fix crash when destructing socket during active connect Calling BluetoothSocket.connect in Java blocks for a certain amount of time. Previously, QtConcurrent::run() was used to separate the Java connect() call out into a different thread. Since the function executed by QtConcurrent and the user facing class shared data fields, a crash occurred if the user deleted QBluetoothSocket while QtConcurrent hadn't executed its service connect call yet. The problem is solved by using QThread and Standard signal/slots which separates the shared data members. The only remaining shared data member is Java's BluetoothSocket instance which is shared via QAndroidJniObject references. This is no problem as deleting one reference retains the other reference. Calling close() on an Android BluetoothSocket while a connect() is ongoing seems to be buggy. Sometimes the close() returns, the pending connect() throws an exception but the physical connection still gets established. To avoid this the patch queues the close() call up until after the connect() statement has returned. It is accepted behavior that the connection might still get enabled for a very brief moment despite a close() being issues before the connect() actually finished. The SocketConnectThread cleans itself up once the thread finished(). Task-number: QTBUG-44930 Change-Id: I8324497a7395de390529ecd0b97b1a326cd78f63 Reviewed-by: Ulf Hermann --- src/bluetooth/qbluetoothsocket_android.cpp | 294 ++++++++++++++++++++++------- src/bluetooth/qbluetoothsocket_p.h | 23 ++- 2 files changed, 244 insertions(+), 73 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 73968e05..7170a301 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -36,9 +36,9 @@ #include "qbluetoothsocket_p.h" #include "qbluetoothaddress.h" #include +#include #include #include -#include #include @@ -46,6 +46,127 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) +#define FALLBACK_CHANNEL 1 +#define USE_FALLBACK true + +Q_DECLARE_METATYPE(QAndroidJniObject) + + +/* BluetoothSocket.connect() can block up to 10s. Therefore it must be + * in a separate thread. Unfortunately if BluetoothSocket.close() is + * called while connect() is still blocking the resulting behavior is not reliable. + * This may well be an Android platform bug. In any case, close() must + * be queued up until connect() has returned. + * + * The WorkerThread manages the connect() and close() calls. Interaction + * with the main thread happens via signals and slots. There is an accepted but + * undesirable side effect of this approach as the user may call connect() + * and close() and the socket would continue to successfully connect to + * the remote device just to immidiately close the physical connection again. + * + * WorkerThread and SocketConnectWorker are cleaned up via the threads + * finished() signal. + */ + +class SocketConnectWorker : public QObject +{ + Q_OBJECT +public: + SocketConnectWorker(const QAndroidJniObject& socket, + const QAndroidJniObject& targetUuid) + : QObject(), + mSocketObject(socket), + mTargetUuid(targetUuid) + { + static int t = qRegisterMetaType(); + Q_UNUSED(t); + } + +signals: + void socketConnectDone(const QAndroidJniObject &socket); + void socketConnectFailed(const QAndroidJniObject &socket, + const QAndroidJniObject &targetUuid); +public slots: + void connectSocket() + { + QAndroidJniEnvironment env; + + qCDebug(QT_BT_ANDROID) << "Connecting socket"; + mSocketObject.callMethod("connect"); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + + emit socketConnectFailed(mSocketObject, mTargetUuid); + QThread::currentThread()->quit(); + return; + } + + qCDebug(QT_BT_ANDROID) << "Socket connection established"; + emit socketConnectDone(mSocketObject); + } + + void closeSocket() + { + qCDebug(QT_BT_ANDROID) << "Executing queued closeSocket()"; + + QAndroidJniEnvironment env; + mSocketObject.callMethod("close"); + if (env->ExceptionCheck()) { + + qCWarning(QT_BT_ANDROID) << "Error during closure of abandoned socket"; + env->ExceptionDescribe(); + env->ExceptionClear(); + } + + QThread::currentThread()->quit(); + } + +private: + QAndroidJniObject mSocketObject; + QAndroidJniObject mTargetUuid; +}; + +class WorkerThread: public QThread +{ + Q_OBJECT +public: + WorkerThread() + : QThread(), workerPointer(0) + { + } + + // Runs in same thread as QBluetoothSocketPrivate + void setupWorker(QBluetoothSocketPrivate* d_ptr, const QAndroidJniObject& socketObject, + const QAndroidJniObject& uuidObject, bool useFallback) + { + SocketConnectWorker* worker = new SocketConnectWorker( + socketObject, uuidObject); + worker->moveToThread(this); + + connect(this, &QThread::finished, worker, &QObject::deleteLater); + connect(this, &QThread::finished, this, &QObject::deleteLater); + connect(d_ptr, &QBluetoothSocketPrivate::connectJavaSocket, + worker, &SocketConnectWorker::connectSocket); + connect(d_ptr, &QBluetoothSocketPrivate::closeJavaSocket, + worker, &SocketConnectWorker::closeSocket); + connect(worker, &SocketConnectWorker::socketConnectDone, + d_ptr, &QBluetoothSocketPrivate::socketConnectSuccess); + if (useFallback) { + connect(worker, &SocketConnectWorker::socketConnectFailed, + d_ptr, &QBluetoothSocketPrivate::fallbackSocketConnectFailed); + } else { + connect(worker, &SocketConnectWorker::socketConnectFailed, + d_ptr, &QBluetoothSocketPrivate::defaultSocketConnectFailed); + } + + workerPointer = worker; + } + +private: + QPointer workerPointer; +}; + QBluetoothSocketPrivate::QBluetoothSocketPrivate() : socket(-1), socketType(QBluetoothServiceInfo::UnknownProtocol), @@ -75,18 +196,6 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol return false; } -void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, - const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode, - int fallbackServiceChannel) -{ - Q_Q(QBluetoothSocket); - - q->setSocketState(QBluetoothSocket::ConnectingState); - QtConcurrent::run(this, &QBluetoothSocketPrivate::connectToServiceConc, - address, uuid, openMode, fallbackServiceChannel); -} - bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channel) { qCWarning(QT_BT_ANDROID) << "Falling back to workaround."; @@ -182,26 +291,42 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe } socketObject = QAndroidJniObject(invokeResult); - socketObject.callMethod("connect"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - qCWarning(QT_BT_ANDROID) << "Socket connect via workaround failed."; - return false; - } + WorkerThread *workerThread = new WorkerThread(); + workerThread->setupWorker(this, socketObject, uuid, USE_FALLBACK); + workerThread->start(); + emit connectJavaSocket(); - qCWarning(QT_BT_ANDROID) << "Workaround invoked."; + qCWarning(QT_BT_ANDROID) << "Workaround thread invoked."; return true; } -void QBluetoothSocketPrivate::connectToServiceConc(const QBluetoothAddress &address, - const QBluetoothUuid &uuid, QIODevice::OpenMode openMode, int fallbackServiceChannel) + +/* + * The call order during a connectToService() is as follows: + * + * 1. call connectToService() + * 2. wait for execution of SocketConnectThread::run() + * 3. if threaded connect succeeds call socketConnectSuccess() via signals + * -> done + * 4. if threaded connect fails call defaultSocketConnectFailed() via signals + * 5. call fallBackConnect() + * 6. if threaded connect on fallback channel succeeds call socketConnectSuccess() + * via signals + * -> done + * 7. if threaded connect on fallback channel fails call fallbackSocketConnectFailed() + * -> complete failure of entire connectToService() + * */ +void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, + const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); Q_UNUSED(openMode); - qCDebug(QT_BT_ANDROID) << "connectToServiceConc()" << address.toString() << uuid.toString(); + qCDebug(QT_BT_ANDROID) << "connectToService()" << address.toString() << uuid.toString(); + + q->setSocketState(QBluetoothSocket::ConnectingState); if (!adapter.isValid()) { qCWarning(QT_BT_ANDROID) << "Device does not support Bluetooth"; @@ -261,22 +386,21 @@ void QBluetoothSocketPrivate::connectToServiceConc(const QBluetoothAddress &addr return; } - socketObject.callMethod("connect"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); + WorkerThread *workerThread = new WorkerThread(); + workerThread->setupWorker(this, socketObject, uuidObject, !USE_FALLBACK); + workerThread->start(); + emit connectJavaSocket(); +} - bool success = fallBackConnect(uuidObject, fallbackServiceChannel); - if (!success) { - errorString = QBluetoothSocket::tr("Connection to service failed"); - socketObject = remoteDevice = QAndroidJniObject(); - q->setSocketError(QBluetoothSocket::ServiceNotFoundError); - q->setSocketState(QBluetoothSocket::UnconnectedState); +void QBluetoothSocketPrivate::socketConnectSuccess(const QAndroidJniObject &socket) +{ + Q_Q(QBluetoothSocket); + QAndroidJniEnvironment env; - env->ExceptionClear(); //just in case - return; - } - } + // test we didn't get a success from a previous connect + // which was cleaned up late + if (socket != socketObject) + return; if (inputThread) { inputThread->deleteLater(); @@ -290,13 +414,7 @@ void QBluetoothSocketPrivate::connectToServiceConc(const QBluetoothAddress &addr env->ExceptionDescribe(); env->ExceptionClear(); - //close socket again - socketObject.callMethod("close"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - + emit closeJavaSocket(); socketObject = inputStream = outputStream = remoteDevice = QAndroidJniObject(); @@ -314,11 +432,7 @@ void QBluetoothSocketPrivate::connectToServiceConc(const QBluetoothAddress &addr if (!inputThread->run()) { //close socket again - socketObject.callMethod("close"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } + emit closeJavaSocket(); socketObject = inputStream = outputStream = remoteDevice = QAndroidJniObject(); @@ -338,6 +452,48 @@ void QBluetoothSocketPrivate::connectToServiceConc(const QBluetoothAddress &addr emit q->connected(); } +void QBluetoothSocketPrivate::defaultSocketConnectFailed( + const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid) +{ + Q_Q(QBluetoothSocket); + + // test we didn't get a fail from a previous connect + // which was cleaned up late - should be same socket + if (socket != socketObject) + return; + + bool success = fallBackConnect(targetUuid, FALLBACK_CHANNEL); + if (!success) { + errorString = QBluetoothSocket::tr("Connection to service failed"); + socketObject = remoteDevice = QAndroidJniObject(); + q->setSocketError(QBluetoothSocket::ServiceNotFoundError); + q->setSocketState(QBluetoothSocket::UnconnectedState); + + QAndroidJniEnvironment env; + env->ExceptionClear(); // just in case + qCWarning(QT_BT_ANDROID) << "Workaround failed"; + } +} + +void QBluetoothSocketPrivate::fallbackSocketConnectFailed( + const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid) +{ + Q_UNUSED(targetUuid); + Q_Q(QBluetoothSocket); + + // test we didn't get a fail from a previous connect + // which was cleaned up late - should be same socket + if (socket != socketObject) + return; + + qCWarning(QT_BT_ANDROID) << "Socket connect via workaround failed."; + errorString = QBluetoothSocket::tr("Connection to service failed"); + socketObject = remoteDevice = QAndroidJniObject(); + + q->setSocketError(QBluetoothSocket::ServiceNotFoundError); + q->setSocketState(QBluetoothSocket::UnconnectedState); +} + void QBluetoothSocketPrivate::abort() { if (state == QBluetoothSocket::UnconnectedState) @@ -357,23 +513,26 @@ void QBluetoothSocketPrivate::abort() if (inputThread) inputThread->prepareForClosure(); - //triggers abort of input thread as well - socketObject.callMethod("close"); - if (env->ExceptionCheck()) { + emit closeJavaSocket(); - qCWarning(QT_BT_ANDROID) << "Error during closure of socket"; - env->ExceptionDescribe(); - env->ExceptionClear(); - } + inputStream = outputStream = socketObject = remoteDevice = QAndroidJniObject(); if (inputThread) { + // inputThread exists hence we had a successful connect + // which means inputThread is responsible for setting Unconnected + //don't delete here as signals caused by Java Thread are still //going to be emitted //delete occurs in inputThreadError() inputThread = 0; + } else { + // inputThread doesn't exist hence + // we abort in the middle of connect(). WorkerThread will do + // close() without further feedback. Therefore we have to set + // Unconnected (now) in advance + Q_Q(QBluetoothSocket); + q->setSocketState(QBluetoothSocket::UnconnectedState); } - - inputStream = outputStream = socketObject = remoteDevice = QAndroidJniObject(); } } @@ -487,12 +646,7 @@ void QBluetoothSocketPrivate::inputThreadError(int errorCode) //cleanup internal objects //if it was call to local close()/abort() the objects are cleaned up already - QAndroidJniEnvironment env; - socketObject.callMethod("close"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } + emit closeJavaSocket(); inputStream = outputStream = remoteDevice = socketObject = QAndroidJniObject(); } @@ -576,6 +730,14 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socke q->setSocketState(socketState); q->setOpenMode(openMode | QIODevice::Unbuffered); + // WorkerThread manages all sockets for us + // When we come through here the socket was already connected by + // server socket listener (see QBluetoothServer) + // Therefore we only use WorkerThread to potentially close it later on + WorkerThread *workerThread = new WorkerThread(); + workerThread->setupWorker(this, socketObject, QAndroidJniObject(), !USE_FALLBACK); + workerThread->start(); + if (openMode == QBluetoothSocket::ConnectedState) emit q->connected(); @@ -592,3 +754,5 @@ qint64 QBluetoothSocketPrivate::bytesAvailable() const } QT_END_NAMESPACE + +#include diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index e95af465..dc490f26 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -52,8 +52,10 @@ #endif #ifdef QT_ANDROID_BLUETOOTH #include +#include #include "android/inputstreamthread_p.h" #include +class WorkerThread; #endif #ifndef QPRIVATELINEARBUFFER_BUFFERSIZE @@ -93,18 +95,14 @@ public: ~QBluetoothSocketPrivate(); //On QNX and Android we connect using the uuid not the port -#if defined(QT_QNX_BLUETOOTH) - void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode); -#elif defined(QT_ANDROID_BLUETOOTH) +#if defined(QT_QNX_BLUETOOTH) || defined(QT_ANDROID_BLUETOOTH) void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode, int fallbackServiceChannel = 1); - bool fallBackConnect(QAndroidJniObject uuid, int channel); + QIODevice::OpenMode openMode); #else void connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); #endif #ifdef QT_ANDROID_BLUETOOTH - void connectToServiceConc(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode, int fallbackServiceChannel = 1); + bool fallBackConnect(QAndroidJniObject uuid, int channel); #endif @@ -166,9 +164,18 @@ public: QAndroidJniObject outputStream; InputStreamThread *inputThread; -private slots: +public slots: + void socketConnectSuccess(const QAndroidJniObject &socket); + void defaultSocketConnectFailed(const QAndroidJniObject & socket, + const QAndroidJniObject &targetUuid); + void fallbackSocketConnectFailed(const QAndroidJniObject &socket, + const QAndroidJniObject &targetUuid); void inputThreadError(int errorCode); +signals: + void connectJavaSocket(); + void closeJavaSocket(); + #endif #if defined(QT_QNX_BLUETOOTH) || defined(QT_BLUEZ_BLUETOOTH) -- cgit v1.2.3 From dd5054b4b448ddab9fbd3c1b496fa56424a0d3dd Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Mar 2015 08:43:32 +0100 Subject: Android: abort() QBluetoothSocket in its dtor [ChangeLog][QBluetooth][Android] Forced QBluetoothSocket to close when its dtor is called Change-Id: Ie31a6b64e4939c800983b5c497532c6fcf90c7c0 Reviewed-by: Ulf Hermann --- src/bluetooth/qbluetoothsocket_android.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 7170a301..3217a9b8 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -185,6 +185,8 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() QBluetoothSocketPrivate::~QBluetoothSocketPrivate() { + if (state != QBluetoothSocket::UnconnectedState) + emit closeJavaSocket(); } bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) -- cgit v1.2.3 From ade72484f36a5c92c381398569a7864ed4bf6ba7 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Mar 2015 12:18:22 +0100 Subject: Don't mix pixel and point size The view is rather obscured because of this. Every other font size in this example uses point size except for these two elements. This mix of point and pizel size is not permitted. There seems to be a warning and probably related change in Qt 5.5 as well. Change-Id: I36a7e9f1648d23f5bc737393ae735bbc7d04b494 Reviewed-by: Timur Pocheptsov --- examples/bluetooth/lowenergyscanner/assets/Header.qml | 2 +- examples/bluetooth/lowenergyscanner/assets/Label.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/bluetooth/lowenergyscanner/assets/Header.qml b/examples/bluetooth/lowenergyscanner/assets/Header.qml index 0c8bc2c5..721dc05c 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Header.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Header.qml @@ -54,7 +54,7 @@ Rectangle { anchors.fill: parent text: headerText font.bold: true - font.pixelSize: 30 + font.pointSize: 20 elide: Text.ElideMiddle color: "#363636" } diff --git a/examples/bluetooth/lowenergyscanner/assets/Label.qml b/examples/bluetooth/lowenergyscanner/assets/Label.qml index 5443ee6b..aafda900 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Label.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Label.qml @@ -42,7 +42,7 @@ import QtQuick 2.0 Text { property string textContent: "" - font.pixelSize: 30 + font.pointSize: 20 anchors.horizontalCenter: parent.horizontalCenter color: "#363636" horizontalAlignment: Text.AlignHCenter -- cgit v1.2.3 From ec82c463d3f83454130dccfa71988af13768c5eb Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Mar 2015 12:21:11 +0100 Subject: Don't remain on Service list page if the BTLE controller disconnected When a disconnect happened, this change ensures a more consistent UI flow. Change-Id: I0faafd79ac82b701a35d43d43c04bf211d8cd803 Reviewed-by: Timur Pocheptsov --- examples/bluetooth/lowenergyscanner/assets/Services.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml index a536152d..d593c7d5 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Services.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -76,6 +76,10 @@ Rectangle { else info.visible = false; } + + onDisconnected: { + pageLoader.source = "main.qml" + } } ListView { -- cgit v1.2.3 From 9c60bf6d13c104f512d4dc5b99056b3b6f924fe6 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Mar 2015 11:32:03 +0100 Subject: Do not assert if encryption change was requested by somebody else This can happen if the QLowEnergyController was created, connected, disconnected and last but not least a second app reconnects. Direct BTLE device interaction with bluetoothctl can cause this. Change-Id: I4a2c68a018b7eb9b866a54cc127e03f6c4bf6672 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergycontroller_bluez.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index f061dba8..1a3066df 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -392,10 +392,12 @@ void QLowEnergyControllerPrivate::l2cpReadyRead() void QLowEnergyControllerPrivate::encryptionChangedEvent( const QBluetoothAddress &address, bool wasSuccess) { + if (!encryptionChangePending) // somebody else caused change event + return; + if (remoteDevice != address) return; - Q_ASSERT(encryptionChangePending); securityLevelValue = securityLevel(); // On success continue to process ATT command queue -- cgit v1.2.3 From b4bf23453e65995bdd8827b6e146edd5cafeddc3 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Mar 2015 15:38:37 +0100 Subject: Android: Fix crash due to dangling pointer inputthread This happened when the remote device closes the socket and the local Android device tries to reconnect using connectToDevice(). Change-Id: I1d8e3bfaea5f956cd71e390f4ab6e9d39256a66d Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_android.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 3217a9b8..b4ebeb89 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -651,6 +651,10 @@ void QBluetoothSocketPrivate::inputThreadError(int errorCode) emit closeJavaSocket(); inputStream = outputStream = remoteDevice = socketObject = QAndroidJniObject(); + if (inputThread) { + // deleted already above (client->deleteLater()) + inputThread = 0; + } } q->setSocketState(QBluetoothSocket::UnconnectedState); -- cgit v1.2.3 From 9170697287050f1b8210cb2298389b4b78f9e962 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 30 Mar 2015 12:43:01 +0200 Subject: Add ability to read characteristics and descriptors This patch introduces the new API elements without any implementation. Change-Id: Ia2a4d4c588f2f2f219288967ed9cc69b13b682c6 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergycharacteristic.cpp | 4 +- src/bluetooth/qlowenergydescriptor.cpp | 4 +- src/bluetooth/qlowenergyservice.cpp | 99 +++++++++++++++++++++++++++++- src/bluetooth/qlowenergyservice.h | 8 +++ 4 files changed, 110 insertions(+), 5 deletions(-) diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp index efd54cfb..f0b78243 100644 --- a/src/bluetooth/qlowenergycharacteristic.cpp +++ b/src/bluetooth/qlowenergycharacteristic.cpp @@ -192,8 +192,8 @@ QLowEnergyCharacteristic::PropertyTypes QLowEnergyCharacteristic::properties() c The cache is updated during the associated service's \l {QLowEnergyService::discoverDetails()} {detail discovery}, a successful - \l {QLowEnergyService::writeCharacteristic()}{write operation} or when an update - notification is received. + \l {QLowEnergyService::readCharacteristic()}{read}/\l {QLowEnergyService::writeCharacteristic()}{write} + operation or when an update notification is received. The returned \l QByteArray always remains empty if the characteristic does not have the \l {QLowEnergyCharacteristic::Read}{read permission}. In such cases only diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp index df044573..16b5b02b 100644 --- a/src/bluetooth/qlowenergydescriptor.cpp +++ b/src/bluetooth/qlowenergydescriptor.cpp @@ -237,8 +237,8 @@ QLowEnergyHandle QLowEnergyDescriptor::handle() const /*! Returns the cached value of the descriptor. - A descriptor value may be updated using - \l QLowEnergyService::writeDescriptor(). + The cached descriptor value may be updated using + \l QLowEnergyService::writeDescriptor() or \l QLowEnergyService::readDescriptor(). */ QByteArray QLowEnergyDescriptor::value() const { diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 839d6690..470db8c6 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -168,9 +168,15 @@ QT_BEGIN_NAMESPACE the service while it was not yet in the \l ServiceDiscovered \l state() or the service is invalid due to a loss of connection to the peripheral device. + \value CharacteristicReadError An attempt to read a characteristic value failed. For example, + it might be triggered in response to a call to + \l readCharacteristic(). This value was introduced by Qt 5.5. \value CharacteristicWriteError An attempt to write a new value to a characteristic failed. For example, it might be triggered when attempting to write to a read-only characteristic. + \value DescriptorReadError An attempt to read a descriptor value failed. For example, + it might be triggered in response to a call to + \l readDescriptor(). This value was introduced by Qt 5.5. \value DescriptorWriteError An attempt to write a new value to a descriptor failed. For example, it might be triggered when attempting to write to a read-only descriptor. @@ -237,6 +243,18 @@ QT_BEGIN_NAMESPACE describes the error that occurred. */ +/*! + \fn void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) + + This signal is emitted when the read request for \a characteristic successfully returned + its \a value. The signal might be triggered by calling \l characteristicRead(). If + the read operation is not successful, the \l error() signal is emitted using the + \l CharacteristicReadError flag. + + \sa readCharacteristic() + \since 5.5 + */ + /*! \fn void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue); @@ -274,6 +292,18 @@ QT_BEGIN_NAMESPACE done can be found further \l{notifications}{above}. */ +/*! + \fn void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) + + This signal is emitted when the read request for \a descriptor successfully returned + its \a value. The signal might be triggered by calling \l descriptorRead(). If + the read operation is not successful, the \l error() signal is emitted using the + \l DescriptorReadError flag. + + \sa readDescriptor() + \since 5.5 + */ + /*! \fn void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) @@ -512,6 +542,41 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) return false; } + +/*! + Reads the value of \a characteristic. If the operation is successful, the + \l characteristicRead() signal is emitted; otherwise the \l CharacteristicReadError + is set. + + All descriptor and characteristic requests towards the same remote device are + serialised. A queue is employed when issuing multiple requests at the same time. + The queue does not eliminate duplicated read requests for the same characteristic. + + A characteristic can only be read if the service is in the \l ServiceDiscovered state, + belongs to the service and is readable. If \a characteristic is readable its + \l QLowEnergyCharacteristic::Read property is set. + + \sa characteristicRead() + + \since 5.5 + */ +void QLowEnergyService::readCharacteristic( + const QLowEnergyCharacteristic &characteristic) +{ + Q_D(QLowEnergyService); + + // not a characteristic of this service + if (!contains(characteristic)) + return; + + if (state() != ServiceDiscovered || !d->controller) { + d->setError(QLowEnergyService::OperationError); + return; + } + + //TODO +} + /*! Writes \a newValue as value for the \a characteristic. If the operation is successful, the \l characteristicWritten() signal is emitted; otherwise the \l CharacteristicWriteError @@ -595,12 +660,44 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const return false; } +/*! + Reads the value of \a descriptor. If the operation is successful, the + \l descriptorRead() signal is emitted; otherwise the \l DescriptorReadError + is set. + + All descriptor and characteristic requests towards the same remote device are + serialised. A queue is employed when issuing multiple requests at the same time. + The queue does not eliminate duplicated read requests for the same descriptor. + + A descriptor can only be written if the service is in the \l ServiceDiscovered state, + belongs to the service and is readable. + + \sa descriptorRead() + + \since 5.5 + */ +void QLowEnergyService::readDescriptor( + const QLowEnergyDescriptor &descriptor) +{ + Q_D(QLowEnergyService); + + if (!contains(descriptor)) + return; + + if (state() != ServiceDiscovered || !d->controller) { + d->setError(QLowEnergyService::OperationError); + return; + } + + //TODO implement QLowEnergyService::readDescriptor() +} + /*! Writes \a newValue as value for \a descriptor. If the operation is successful, the \l descriptorWritten() signal is emitted; otherwise the \l DescriptorWriteError is emitted. - All descriptor and characteristic write requests towards the same remote device are + All descriptor and characteristic requests towards the same remote device are serialised. A queue is employed when issuing multiple write requests at the same time. The queue does not eliminate duplicated write requests for the same descriptor. For example, if the same descriptor is set to the value A and immediately afterwards diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 3d9247a6..78183c05 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -55,7 +55,9 @@ public: enum ServiceError { NoError = 0, OperationError, + CharacteristicReadError, CharacteristicWriteError, + DescriptorReadError, DescriptorWriteError, UnknownError }; @@ -90,11 +92,13 @@ public: ServiceError error() const; bool contains(const QLowEnergyCharacteristic &characteristic) const; + void readCharacteristic(const QLowEnergyCharacteristic &characteristic); void writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, WriteMode mode = WriteWithResponse); bool contains(const QLowEnergyDescriptor &descriptor) const; + void readDescriptor(const QLowEnergyDescriptor &descriptor); void writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue); @@ -102,8 +106,12 @@ Q_SIGNALS: void stateChanged(QLowEnergyService::ServiceState newState); void characteristicChanged(const QLowEnergyCharacteristic &info, const QByteArray &value); + void characteristicRead(const QLowEnergyCharacteristic &info, + const QByteArray &value); void characteristicWritten(const QLowEnergyCharacteristic &info, const QByteArray &value); + void descriptorRead(const QLowEnergyDescriptor &info, + const QByteArray &value); void descriptorWritten(const QLowEnergyDescriptor &info, const QByteArray &value); void error(QLowEnergyService::ServiceError error); -- cgit v1.2.3 From 78e7a1673e4558133ae1921ee24c296a62938eea Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 30 Mar 2015 13:35:36 +0200 Subject: Prevent characteristic write if service is not discovered Previously it was possible to issue the characteristic write request while the service was not discovered. Change-Id: Id370a2ae0f15860e28d1aee0624bdf13517e1e32 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 470db8c6..194f589f 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -613,11 +613,10 @@ void QLowEnergyService::writeCharacteristic( if (!contains(characteristic)) return; - if (state() != ServiceDiscovered) + if (state() != ServiceDiscovered || !d->controller) { d->setError(QLowEnergyService::OperationError); - - if (!d->controller) return; + } // don't write if properties don't permit it if (mode == WriteWithResponse -- cgit v1.2.3 From 3a6824f137f48918a2b76b01ff634e30f3878cc2 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 30 Mar 2015 14:00:38 +0200 Subject: Minor doc fixes Change-Id: I8bf5a48b96fe27d66cd33adb0926591b2302bf8c Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 194f589f..14b9777b 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -256,7 +256,7 @@ QT_BEGIN_NAMESPACE */ /*! - \fn void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue); + \fn void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) This signal is emitted when the value of \a characteristic is successfully changed to \a newValue. The change must have been triggered @@ -279,7 +279,7 @@ QT_BEGIN_NAMESPACE */ /*! - \fn void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue); + \fn void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) This signal is emitted when the value of \a characteristic is changed by an event on the peripheral. The \a newValue parameter contains the -- cgit v1.2.3 From 3162d33d98a96e506a4d8dfc6813f1fb0fe44c18 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 30 Mar 2015 14:06:30 +0200 Subject: Make new read(Descriptor/Characteristic)() API compile on OSX and iOS Change-Id: I19a1fd15a5cdc13b28f77fff02949a7895ddb0cb Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice_osx.mm | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index 436cc086..80ab6eaa 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -177,6 +177,22 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) return false; } +void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic) +{ + // not a characteristic of this service + if (!contains(characteristic)) + return; + + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + if (state() != ServiceDiscovered || !controller) { + d_ptr->setError(OperationError); + return; + } + + //TODO implement QLowEnergyService::readCharacteristic() on iOS/OSX +} + + void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, const QByteArray &newValue, WriteMode mode) { @@ -218,6 +234,20 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const return false; } +void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor) +{ + if (!contains(descriptor)) + return; + + QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); + if (state() != ServiceDiscovered || !controller) { + d_ptr->setError(OperationError); + return; + } + + //TODO implement QLowEnergyService::readDescriptor() on iOS/OSX +} + void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) { -- cgit v1.2.3 From eceb93bda82e45dab9bb85b592533a7d7c5ccac0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 31 Mar 2015 10:08:02 +0200 Subject: Bluez: Implement QLES::readCharacteristic()/readDescriptor() Change-Id: I418db6ea375b8e29def136b28b4fc25154d4ffe8 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_android.cpp | 15 +++ src/bluetooth/qlowenergycontroller_bluez.cpp | 140 +++++++++++++++++++++++-- src/bluetooth/qlowenergycontroller_p.cpp | 13 +++ src/bluetooth/qlowenergycontroller_p.h | 6 ++ src/bluetooth/qlowenergyservice.cpp | 11 +- src/bluetooth/qlowenergyserviceprivate_p.h | 4 + 6 files changed, 178 insertions(+), 11 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 65b3964e..2794fe17 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -235,6 +235,21 @@ void QLowEnergyControllerPrivate::writeDescriptor( service->setError(QLowEnergyService::DescriptorWriteError); } +void QLowEnergyControllerPrivate::readCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/) +{ + +} + +void QLowEnergyControllerPrivate::readDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/) +{ + +} + void QLowEnergyControllerPrivate::connectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index d355b070..bb490ba9 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -704,6 +704,11 @@ void QLowEnergyControllerPrivate::processReply( const QLowEnergyHandle charHandle = (handleData & 0xffff); const QLowEnergyHandle descriptorHandle = ((handleData >> 16) & 0xffff); + QSharedPointer service = serviceForHandle(charHandle); + Q_ASSERT(!service.isNull()); + bool isServiceDiscoveryRun + = !(service->state == QLowEnergyService::ServiceDiscovered); + if (isErrorResponse) { Q_ASSERT(!encryptionChangePending); encryptionChangePending = increaseEncryptLevelfRequired(response.constData()[4]); @@ -712,6 +717,12 @@ void QLowEnergyControllerPrivate::processReply( // Retry the same command again once the change has happened openRequests.prepend(request); break; + } else if (!isServiceDiscoveryRun) { + // not encryption problem -> abort readCharacteristic()/readDescriptor() run + if (!descriptorHandle) + emit service->error(QLowEnergyService::CharacteristicReadError); + else + emit service->error(QLowEnergyService::DescriptorReadError); } } else { if (!descriptorHandle) @@ -721,18 +732,32 @@ void QLowEnergyControllerPrivate::processReply( response.mid(1), NEW_VALUE); if (response.size() == mtuSize) { + qCDebug(QT_BT_BLUEZ) << "Switching to blob reads for" + << charHandle << descriptorHandle + << service->characteristicList[charHandle].uuid.toString(); // Potentially more data -> switch to blob reads readServiceValuesByOffset(handleData, mtuSize-1, request.reference2.toBool()); break; + } else if (!isServiceDiscoveryRun) { + // readCharacteristic() or readDescriptor() ongoing + if (!descriptorHandle) { + QLowEnergyCharacteristic ch(service, charHandle); + emit service->characteristicRead(ch, response.mid(1)); + } else { + QLowEnergyDescriptor descriptor(service, charHandle, descriptorHandle); + emit service->descriptorRead(descriptor, response.mid(1)); + } + break; } } - if (request.reference2.toBool()) { + if (request.reference2.toBool() && isServiceDiscoveryRun) { + // we only run into this code path during the initial service discovery + // and not when processing readCharacteristics() after service discovery + //last characteristic -> progress to descriptor discovery //last descriptor -> service discovery is done - QSharedPointer service = serviceForHandle(charHandle); - Q_ASSERT(!service.isNull()); if (!descriptorHandle) discoverServiceDescriptors(service->uuid); else @@ -743,13 +768,16 @@ void QLowEnergyControllerPrivate::processReply( case ATT_OP_READ_BLOB_REQUEST: //error case case ATT_OP_READ_BLOB_RESPONSE: { - //Reading characteristic or descriptor with value longer than MTU + //Reading characteristic or descriptor with value longer value than MTU Q_ASSERT(request.command == ATT_OP_READ_BLOB_REQUEST); uint handleData = request.reference.toUInt(); const QLowEnergyHandle charHandle = (handleData & 0xffff); const QLowEnergyHandle descriptorHandle = ((handleData >> 16) & 0xffff); + QSharedPointer service = serviceForHandle(charHandle); + Q_ASSERT(!service.isNull()); + /* * READ_BLOB does not require encryption setup code. BLOB commands * are only issued after read request if the read request is too long @@ -763,18 +791,33 @@ void QLowEnergyControllerPrivate::processReply( else length = updateValueOfDescriptor(charHandle, descriptorHandle, response.mid(1), APPEND_VALUE); + if (response.size() == mtuSize) { readServiceValuesByOffset(handleData, length, request.reference2.toBool()); break; + } else if (service->state == QLowEnergyService::ServiceDiscovered) { + // readCharacteristic() or readDescriptor() ongoing + if (!descriptorHandle) { + QLowEnergyCharacteristic ch(service, charHandle); + emit service->characteristicRead(ch, ch.value()); + } else { + QLowEnergyDescriptor descriptor(service, charHandle, descriptorHandle); + emit service->descriptorRead(descriptor, descriptor.value()); + } + break; } + } else { + qWarning() << "READ BLOB for char:" << charHandle + << "descriptor:" << descriptorHandle << "on service" + << service->uuid.toString() << "failed (service discovery run:" + << (service->state == QLowEnergyService::ServiceDiscovered) << ")"; } if (request.reference2.toBool()) { //last overlong characteristic -> progress to descriptor discovery //last overlong descriptor -> service discovery is done - QSharedPointer service = serviceForHandle(charHandle); - Q_ASSERT(!service.isNull()); + if (!descriptorHandle) discoverServiceDescriptors(service->uuid); else @@ -1080,7 +1123,8 @@ void QLowEnergyControllerPrivate::sendReadByTypeRequest( /*! \internal - Reads the value of characteristics and descriptors. + Reads all values of specific characteristic and descriptor. This function is + used during the initial service discovery process. \a readCharacteristics determines whether we intend to read a characteristic; otherwise we read a descriptor. @@ -1091,10 +1135,10 @@ void QLowEnergyControllerPrivate::readServiceValues( quint8 packet[READ_REQUEST_HEADER_SIZE]; if (QT_BT_BLUEZ().isDebugEnabled()) { if (readCharacteristics) - qCDebug(QT_BT_BLUEZ) << "Reading characteristic values for" + qCDebug(QT_BT_BLUEZ) << "Reading all characteristic values for" << serviceUuid.toString(); else - qCDebug(QT_BT_BLUEZ) << "Reading descriptor values for" + qCDebug(QT_BT_BLUEZ) << "Reading all descriptor values for" << serviceUuid.toString(); } @@ -1582,6 +1626,84 @@ void QLowEnergyControllerPrivate::writeDescriptor( sendNextPendingRequest(); } +/*! + \internal + + Reads the value of one specific characteristic. + */ +void QLowEnergyControllerPrivate::readCharacteristic( + const QSharedPointer service, + const QLowEnergyHandle charHandle) +{ + Q_ASSERT(!service.isNull()); + if (!service->characteristicList.contains(charHandle)) + return; + + const QLowEnergyServicePrivate::CharData &charDetails + = service->characteristicList[charHandle]; + if (!(charDetails.properties & QLowEnergyCharacteristic::Read)) { + // if this succeeds the device has a bug, char is advertised as + // non-readable. We try to be permissive and let the remote + // device answer to the read attempt + qCWarning(QT_BT_BLUEZ) << "Reading non-readable char" << charHandle; + } + + quint8 packet[READ_REQUEST_HEADER_SIZE]; + packet[0] = ATT_OP_READ_REQUEST; + bt_put_unaligned(htobs(charDetails.valueHandle), (quint16 *) &packet[1]); + + QByteArray data(READ_REQUEST_HEADER_SIZE, Qt::Uninitialized); + memcpy(data.data(), packet, READ_REQUEST_HEADER_SIZE); + + qCDebug(QT_BT_BLUEZ) << "Targeted reading characteristic" << hex << charHandle; + + Request request; + request.payload = data; + request.command = ATT_OP_READ_REQUEST; + request.reference = charHandle; + // reference2 not really required but false prevents service discovery + // code from running in ATT_OP_READ_RESPONSE handler + request.reference2 = false; + openRequests.enqueue(request); + + sendNextPendingRequest(); +} + +void QLowEnergyControllerPrivate::readDescriptor( + const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle) +{ + Q_ASSERT(!service.isNull()); + if (!service->characteristicList.contains(charHandle)) + return; + + const QLowEnergyServicePrivate::CharData &charDetails + = service->characteristicList[charHandle]; + if (!charDetails.descriptorList.contains(descriptorHandle)) + return; + + quint8 packet[READ_REQUEST_HEADER_SIZE]; + packet[0] = ATT_OP_READ_REQUEST; + bt_put_unaligned(htobs(descriptorHandle), (quint16 *) &packet[1]); + + QByteArray data(READ_REQUEST_HEADER_SIZE, Qt::Uninitialized); + memcpy(data.data(), packet, READ_REQUEST_HEADER_SIZE); + + qCDebug(QT_BT_BLUEZ) << "Targeted reading descriptor" << hex << descriptorHandle; + + Request request; + request.payload = data; + request.command = ATT_OP_READ_REQUEST; + request.reference = (charHandle | (descriptorHandle << 16)); + // reference2 not really required but false prevents service discovery + // code from running in ATT_OP_READ_RESPONSE handler + request.reference2 = false; + openRequests.enqueue(request); + + sendNextPendingRequest(); +} + /*! * Returns true if the encryption change was successfully requested. * The request is triggered if we got a related ATT error. diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index 79f463ef..b3c718b5 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -74,6 +74,19 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &/ } +void QLowEnergyControllerPrivate::readCharacteristic(const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/) +{ + +} + +void QLowEnergyControllerPrivate::readDescriptor(const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/) +{ + +} + void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer /*service*/, const QLowEnergyHandle /*charHandle*/, const QByteArray &/*newValue*/, diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 408cc72a..9e2cedbc 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -112,6 +112,12 @@ public: const QByteArray &value, bool appendValue); + // read data + void readCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle); + void readDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle); // write data void writeCharacteristic(const QSharedPointer service, diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 14b9777b..0db349f1 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -339,6 +339,10 @@ QLowEnergyService::QLowEnergyService(QSharedPointer p, this, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); connect(p.data(), SIGNAL(descriptorWritten(QLowEnergyDescriptor,QByteArray)), this, SIGNAL(descriptorWritten(QLowEnergyDescriptor,QByteArray))); + connect(p.data(), SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)), + this, SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + connect(p.data(), SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray)), + this, SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray))); } /*! @@ -574,7 +578,8 @@ void QLowEnergyService::readCharacteristic( return; } - //TODO + d->controller->readCharacteristic(characteristic.d_ptr, + characteristic.attributeHandle()); } /*! @@ -688,7 +693,9 @@ void QLowEnergyService::readDescriptor( return; } - //TODO implement QLowEnergyService::readDescriptor() + d->controller->readDescriptor(descriptor.d_ptr, + descriptor.characteristicHandle(), + descriptor.handle()); } /*! diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index cc9b452f..a020341f 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -80,8 +80,12 @@ signals: void error(QLowEnergyService::ServiceError error); void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue); + void characteristicRead(const QLowEnergyCharacteristic &info, + const QByteArray &value); void characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue); + void descriptorRead(const QLowEnergyDescriptor &info, + const QByteArray &value); void descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue); -- cgit v1.2.3 From 3fd2a56de3c17badd1a359baf1b556fbfa606845 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 1 Apr 2015 10:46:34 +0200 Subject: Add tests for QLES::readCharacteristic() The following types of tests are performed: 1. reading of char value that fits into single ATT packet 2. reading of char value that is not readable 3. reading of char value that is requires two ATT packets (blob reads) 4. reading of char value that is exactly as long as one ATT packet (this is different than case 1 as it triggers blob reads where the the first blob read packaet is empty) Cases 1 & 2 are done using the TI Sensor Tag. Cases 3 & 4 require programmable CSR dev kit. Those tests are not enabled by default and require manual setup. Change-Id: I402a7369abbbde6b8309bed8bef6b9a9441cabc9 Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 148 +++++++++++++++++++-- 1 file changed, 138 insertions(+), 10 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 33417a7f..f5fdc120 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -1720,6 +1720,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic() QVERIFY(service->contains(dataChar)); QVERIFY(configChar.isValid()); QVERIFY(configChar.properties() & QLowEnergyCharacteristic::Write); + QVERIFY(configChar.properties() & QLowEnergyCharacteristic::Read); QVERIFY(service->contains(configChar)); QCOMPARE(dataChar.value(), QByteArray::fromHex("3f00")); @@ -1728,6 +1729,8 @@ void tst_QLowEnergyController::tst_writeCharacteristic() QSignalSpy writeSpy(service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy readSpy(service, + SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); // ******************************************* // test writing of characteristic @@ -1744,9 +1747,27 @@ void tst_QLowEnergyController::tst_writeCharacteristic() QVERIFY(signalChar == configChar); writeSpy.clear(); + + } + + // test direct read of configChar + QVERIFY(readSpy.isEmpty()); + service->readCharacteristic(configChar); + QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000); + QCOMPARE(configChar.value(), QByteArray::fromHex("81")); + QCOMPARE(readSpy.count(), 1); //expect one characteristicRead signal + { + //verify the readCharacteristic() + QList firstSignalData = readSpy.first(); + QLowEnergyCharacteristic signalChar = firstSignalData[0].value(); + QByteArray signalValue = firstSignalData[1].toByteArray(); + + QCOMPARE(signalValue, QByteArray::fromHex("81")); + QCOMPARE(signalValue, configChar.value()); + QVERIFY(signalChar == configChar); } - service->writeCharacteristic(configChar, QByteArray::fromHex("00")); //0x81 blink LED D1 + service->writeCharacteristic(configChar, QByteArray::fromHex("00")); //turn LED D1 off QTRY_VERIFY_WITH_TIMEOUT(!writeSpy.isEmpty(), 10000); QCOMPARE(configChar.value(), QByteArray::fromHex("00")); QList firstSignalData = writeSpy.first(); @@ -2024,10 +2045,24 @@ void tst_QLowEnergyController::tst_writeDescriptor() } /* - * Tests encrypted read/write. + * By default this test is skipped. + * + * Following tests are performed: + * - encrypted read and discovery + * - readCharacteristic() of values longer than MTU + * - readCharacteristic() if values equal to MTU + * * This test is semi manual as the test device environment is very specific. - * Adjust the various uuids and addresses at the top to cater for the current - * situation. By default this test is skipped. + * A programmable BTLE device is required. Currently, the test requires + * the CSR Dev Kit using the hr_sensor example. + * + * The following changes must be done to example to be able to fully + * utilise the test: + * 1.) gap_service_db.db -> UUID_DEVICE_NAME char - add FLAG_ENCR_R + * => tests encrypted read/discovery + * 2.) dev_info_service_db.db -> UUID_DEVICE_INFO_MANUFACTURER_NAME + * => The default name "Cambridge Silicon Radio" must be changed + * to "Cambridge Silicon Radi" (new length 22) */ void tst_QLowEnergyController::tst_encryption() { @@ -2072,16 +2107,91 @@ void tst_QLowEnergyController::tst_encryption() QLowEnergyService *service = control.createServiceObject(serviceUuid, this); QVERIFY(service); + + // 1.) discovery triggers read of device name char which is encrypted service->discoverDetails(); QTRY_VERIFY_WITH_TIMEOUT( service->state() == QLowEnergyService::ServiceDiscovered, 30000); - QLowEnergyCharacteristic characteristic = service->characteristic( + QLowEnergyCharacteristic encryptedChar = service->characteristic( characterristicUuid); + const QByteArray encryptedReference("CSR HR Sensor"); + QVERIFY(encryptedChar.isValid()); + QCOMPARE(encryptedChar.value(), encryptedReference); + + // 2.) read of encrypted characteristic + // => the discovery of the encrypted char above will have switched to + // encryption already. + QSignalSpy encryptedReadSpy(service, + SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy encryptedErrorSpy(service, + SIGNAL(error(QLowEnergyService::ServiceError))); + service->readCharacteristic(encryptedChar); + QTRY_VERIFY_WITH_TIMEOUT(!encryptedReadSpy.isEmpty(), 10000); + QVERIFY(encryptedErrorSpy.isEmpty()); + QCOMPARE(encryptedReadSpy.count(), 1); + QList entry = encryptedReadSpy[0]; + QVERIFY(entry[0].value() == encryptedChar); + QCOMPARE(entry[1].toByteArray(), encryptedReference); + QCOMPARE(encryptedChar.value(), encryptedReference); + + delete service; - QVERIFY(characteristic.isValid()); - qDebug() << "Encrypted char value:" << characteristic.value().toHex() << characteristic.value(); - QVERIFY(!characteristic.value().isEmpty()); + //change to Device Information service + QVERIFY(uuids.contains(QBluetoothUuid::DeviceInformation)); + service = control.createServiceObject(QBluetoothUuid::DeviceInformation); + QVERIFY(service); + + service->discoverDetails(); + QTRY_VERIFY_WITH_TIMEOUT( + service->state() == QLowEnergyService::ServiceDiscovered, 30000); + + // 3.) read of software revision string which is longer than mtu + // tests readCharacteristic() including blob reads + QSignalSpy readSpy(service, + SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy errorSpy(service, + SIGNAL(error(QLowEnergyService::ServiceError))); + + const QByteArray expectedSoftRev("Application version 2.3.0.0"); + QLowEnergyCharacteristic softwareRevChar + = service->characteristic(QBluetoothUuid::SoftwareRevisionString); + QVERIFY(softwareRevChar.isValid()); + QCOMPARE(softwareRevChar.value(), expectedSoftRev); + + service->readCharacteristic(softwareRevChar); + QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000); + QVERIFY(errorSpy.isEmpty()); + QCOMPARE(readSpy.count(), 1); + entry = readSpy[0]; + QVERIFY(entry[0].value() == softwareRevChar); + QCOMPARE(entry[1].toByteArray(), expectedSoftRev); + QCOMPARE(softwareRevChar.value(), expectedSoftRev); + + + // 4.) read of manufacturer string which is exactly as long as single + // MTU size (assuming negotiated MTU is 23) + // => blob read test without blob being required + // => the read blob answer will have zero length + + readSpy.clear(); + + // This assumes the manufacturer string was mondified via CSR SDK + // see function description above + const QByteArray expectedManufacturer("Cambridge Silicon Radi"); + QLowEnergyCharacteristic manufacturerChar = service->characteristic( + QBluetoothUuid::ManufacturerNameString); + QVERIFY(manufacturerChar.isValid()); + QCOMPARE(manufacturerChar.value(), expectedManufacturer); + + service->readCharacteristic(manufacturerChar); + QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000); + QVERIFY(errorSpy.isEmpty()); + QCOMPARE(readSpy.count(), 1); + entry = readSpy[0]; + QVERIFY(entry[0].value() == manufacturerChar); + QCOMPARE(entry[1].toByteArray(), expectedManufacturer); + QCOMPARE(manufacturerChar.value(), expectedManufacturer); delete service; control.disconnectFromDevice(); @@ -2150,6 +2260,7 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QVERIFY(imageIdentityChar.isValid()); QVERIFY(imageIdentityChar.properties() & QLowEnergyCharacteristic::Write); QVERIFY(imageIdentityChar.properties() & QLowEnergyCharacteristic::WriteNoResponse); + QVERIFY(!(imageIdentityChar.properties() & QLowEnergyCharacteristic::Read)); //not readable QVERIFY(imageBlockChar.isValid()); // 2. Get "Image Identity" notification descriptor @@ -2169,8 +2280,13 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray))); QSignalSpy charWrittenSpy(service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy charReadSpy(service, + SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy errorSpy(service, + SIGNAL(error(QLowEnergyService::ServiceError))); - // by default the defvice enables the notificatioin bit already + + // by default the device enables the notification bit already // no need to enable it. If notifications fail to arrive the // platform must check default enabled notifications. if (notification.value() != QByteArray::fromHex("0100")) { @@ -2185,8 +2301,20 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() descWrittenSpy.clear(); } - // 4. Trigger image identity announcement (using traditional write) QList entry; + + // Test direct read of non-readable characteristic + QVERIFY(errorSpy.isEmpty()); + QVERIFY(charReadSpy.isEmpty()); + service->readCharacteristic(imageIdentityChar); + QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000); + QCOMPARE(errorSpy.count(), 1); // should throw CharacteristicReadError + QVERIFY(charReadSpy.isEmpty()); + entry = errorSpy[0]; + QCOMPARE(entry[0].value(), + QLowEnergyService::CharacteristicReadError); + + // 4. Trigger image identity announcement (using traditional write) bool foundOneImage = false; // Image A -- cgit v1.2.3 From 32c851da4f41e51d0d50b6af5b8e7bf225edb01b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 1 Apr 2015 11:29:24 +0200 Subject: Add writeCharacteristic() test to encrypted characteristic The test is not automatic and the right hardware setup is required. Change-Id: I6ad9115e21cbd826cfe647a66f5b58f56a380a6f Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index f5fdc120..7e96c204 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -85,7 +85,7 @@ private slots: void tst_writeCharacteristic(); void tst_writeCharacteristicNoResponse(); void tst_writeDescriptor(); - void tst_encryption(); + void tst_customProgrammableDevice(); private: void verifyServiceProperties(const QLowEnergyService *info); @@ -2063,8 +2063,14 @@ void tst_QLowEnergyController::tst_writeDescriptor() * 2.) dev_info_service_db.db -> UUID_DEVICE_INFO_MANUFACTURER_NAME * => The default name "Cambridge Silicon Radio" must be changed * to "Cambridge Silicon Radi" (new length 22) + * 3.) revert change 1 above and redo test. This attempts to write a + * char that is readable w/o encryption but writeable with encryption + * => tests encryption code lines in writeCharacteristic() + * => otherwise the read encryption would have increased security level already + * => programmable CSR device must be reset before each run of this test + * (to undo the previous write) */ -void tst_QLowEnergyController::tst_encryption() +void tst_QLowEnergyController::tst_customProgrammableDevice() { QSKIP("Skipping encryption"); @@ -2135,6 +2141,22 @@ void tst_QLowEnergyController::tst_encryption() QCOMPARE(entry[1].toByteArray(), encryptedReference); QCOMPARE(encryptedChar.value(), encryptedReference); + // 3.) write to encrypted characteristic + QSignalSpy encryptedWriteSpy(service, + SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); + encryptedReadSpy.clear(); + encryptedErrorSpy.clear(); + const QByteArray newValue("ZZZ HR Sensor"); + service->writeCharacteristic(encryptedChar, newValue); + QTRY_VERIFY_WITH_TIMEOUT(!encryptedWriteSpy.isEmpty(), 10000); + QVERIFY(encryptedErrorSpy.isEmpty()); + QVERIFY(encryptedReadSpy.isEmpty()); + QCOMPARE(encryptedWriteSpy.count(), 1); + entry = encryptedWriteSpy[0]; + QVERIFY(entry[0].value() == encryptedChar); + QCOMPARE(entry[1].toByteArray(), newValue); + QCOMPARE(encryptedChar.value(), newValue); + delete service; //change to Device Information service @@ -2146,7 +2168,7 @@ void tst_QLowEnergyController::tst_encryption() QTRY_VERIFY_WITH_TIMEOUT( service->state() == QLowEnergyService::ServiceDiscovered, 30000); - // 3.) read of software revision string which is longer than mtu + // 4.) read of software revision string which is longer than mtu // tests readCharacteristic() including blob reads QSignalSpy readSpy(service, SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); @@ -2169,7 +2191,7 @@ void tst_QLowEnergyController::tst_encryption() QCOMPARE(softwareRevChar.value(), expectedSoftRev); - // 4.) read of manufacturer string which is exactly as long as single + // 5.) read of manufacturer string which is exactly as long as single // MTU size (assuming negotiated MTU is 23) // => blob read test without blob being required // => the read blob answer will have zero length -- cgit v1.2.3 From 99d62bcce229ab2807f0ea5b8a0f618b4e93c665 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 1 Apr 2015 13:43:42 +0200 Subject: Emit OperationError if char or desc is not part of current service So far, the OperationError was not set. This improves the error feedback to the user. Change-Id: I37eccb2419d6ede3b9bd4e94b9e0538182d1db7e Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 42 ++++++++++++++++------------------ src/bluetooth/qlowenergyservice_osx.mm | 22 ++++-------------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 0db349f1..21090c77 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -558,7 +558,8 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) A characteristic can only be read if the service is in the \l ServiceDiscovered state, belongs to the service and is readable. If \a characteristic is readable its - \l QLowEnergyCharacteristic::Read property is set. + \l QLowEnergyCharacteristic::Read property is set. If one of those conditions is + not true the \l QLowEnergyService::OperationError is set. \sa characteristicRead() @@ -569,11 +570,9 @@ void QLowEnergyService::readCharacteristic( { Q_D(QLowEnergyService); - // not a characteristic of this service - if (!contains(characteristic)) - return; - - if (state() != ServiceDiscovered || !d->controller) { + if (!contains(characteristic) + || state() != ServiceDiscovered + || !d->controller) { d->setError(QLowEnergyService::OperationError); return; } @@ -603,7 +602,8 @@ void QLowEnergyService::readCharacteristic( Bluetooth specification. A characteristic can only be written if this service is in the \l ServiceDiscovered state, - belongs to the service and is writable. + belongs to the service and is writable. If one of those conditions is + not true the \l QLowEnergyService::OperationError is set. \sa QLowEnergyCharacteristic::properties() */ @@ -614,11 +614,9 @@ void QLowEnergyService::writeCharacteristic( //TODO check behavior when writing to WriteSigned characteristic Q_D(QLowEnergyService); - // not a characteristic of this service - if (!contains(characteristic)) - return; - - if (state() != ServiceDiscovered || !d->controller) { + if (!contains(characteristic) + || state() != ServiceDiscovered + || !d->controller) { d->setError(QLowEnergyService::OperationError); return; } @@ -674,7 +672,8 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const The queue does not eliminate duplicated read requests for the same descriptor. A descriptor can only be written if the service is in the \l ServiceDiscovered state, - belongs to the service and is readable. + belongs to the service and is readable. If one of those conditions is + not true the \l QLowEnergyService::OperationError is set. \sa descriptorRead() @@ -685,10 +684,9 @@ void QLowEnergyService::readDescriptor( { Q_D(QLowEnergyService); - if (!contains(descriptor)) - return; - - if (state() != ServiceDiscovered || !d->controller) { + if (!contains(descriptor) + || state() != ServiceDiscovered + || !d->controller) { d->setError(QLowEnergyService::OperationError); return; } @@ -710,17 +708,17 @@ void QLowEnergyService::readDescriptor( to B, the two write request are executed in the given order. A descriptor can only be written if this service is in the \l ServiceDiscovered state, - belongs to the service and is writable. + belongs to the service and is writable. If one of those conditions is + not true the \l QLowEnergyService::OperationError is set. */ void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) { Q_D(QLowEnergyService); - if (!contains(descriptor)) - return; - - if (state() != ServiceDiscovered || !d->controller) { + if (!contains(descriptor) + || state() != ServiceDiscovered + || !d->controller) { d->setError(QLowEnergyService::OperationError); return; } diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index 80ab6eaa..51b0f53d 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -179,12 +179,8 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic) { - // not a characteristic of this service - if (!contains(characteristic)) - return; - QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (state() != ServiceDiscovered || !controller) { + if (!contains(characteristic) || state() != ServiceDiscovered || !controller) { d_ptr->setError(OperationError); return; } @@ -196,13 +192,9 @@ void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &chara void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, const QByteArray &newValue, WriteMode mode) { - // Not a characteristic of this service - if (!contains(ch)) - return; - QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (state() != ServiceDiscovered || !controller) { + if (!contains(ch) || state() != ServiceDiscovered || !controller) { d_ptr->setError(QLowEnergyService::OperationError); return; } @@ -236,11 +228,8 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor) { - if (!contains(descriptor)) - return; - QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (state() != ServiceDiscovered || !controller) { + if (!contains(descriptor) || state() != ServiceDiscovered || !controller) { d_ptr->setError(OperationError); return; } @@ -251,11 +240,8 @@ void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor) void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) { - if (!contains(descriptor)) - return; - QLowEnergyControllerPrivateOSX *const controller = qt_mac_le_controller(d_ptr); - if (state() != ServiceDiscovered || !controller) { + if (!contains(descriptor) || state() != ServiceDiscovered || !controller) { d_ptr->setError(OperationError); return; } -- cgit v1.2.3 From 5be8b3d9273afcd41c6c60e6f6d2dfd5cd8b30e3 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 1 Apr 2015 17:17:22 +0200 Subject: Always read/write the GATT hardware even if meta data reports otherwise It is possible that a ATT attribute is not readable or writable. Usually this is reported via descriptors or other types of meta data. However it is possible that the meta data is reporting the wrong information. Therefore we always ensure that every read and write request is forwarded to the hardware. It is up to the hardware to respond to such requests. This change keeps the device usable in cases of buggy device meta data. This only affected writeCharacteristic() calls. Change-Id: Ieb2b95f47aa51c86a8ae7c4bebed4043d7478874 Reviewed-by: Alex Blasche Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 30 ++++++++++++++-------- src/bluetooth/qlowenergyservice_osx.mm | 4 +-- .../tst_qlowenergycontroller.cpp | 4 +-- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 21090c77..8530c8b8 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -550,17 +550,21 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) /*! Reads the value of \a characteristic. If the operation is successful, the \l characteristicRead() signal is emitted; otherwise the \l CharacteristicReadError - is set. + is set. In general, a \a characteristic is readable, if its + \l QLowEnergyCharacteristic::Read property is set. All descriptor and characteristic requests towards the same remote device are serialised. A queue is employed when issuing multiple requests at the same time. The queue does not eliminate duplicated read requests for the same characteristic. A characteristic can only be read if the service is in the \l ServiceDiscovered state, - belongs to the service and is readable. If \a characteristic is readable its - \l QLowEnergyCharacteristic::Read property is set. If one of those conditions is + belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. + \note Calling this function despite \l properties() reporting a non-readable property + always attempts to read the characteristic's value on the hardware. If the hardware + returns with an error the \l CharacteristicWriteError is set. + \sa characteristicRead() \since 5.5 @@ -602,9 +606,15 @@ void QLowEnergyService::readCharacteristic( Bluetooth specification. A characteristic can only be written if this service is in the \l ServiceDiscovered state, - belongs to the service and is writable. If one of those conditions is + and belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. + \note Calling this function despite \l properties() reporting a non-writable property + always attempts to write to the hardware. Similarly, a \l WriteWithoutResponse + is sent to the hardware too although the characteristic may only support + \l WriteWithResponse. If the hardware returns with an error the + \l CharacteristicWriteError is set. + \sa QLowEnergyCharacteristic::properties() */ void QLowEnergyService::writeCharacteristic( @@ -622,15 +632,13 @@ void QLowEnergyService::writeCharacteristic( } // don't write if properties don't permit it - if (mode == WriteWithResponse - && (characteristic.properties() & QLowEnergyCharacteristic::Write)) + if (mode == WriteWithResponse) { d->controller->writeCharacteristic(characteristic.d_ptr, characteristic.attributeHandle(), newValue, true); - } else if (mode == WriteWithoutResponse - && (characteristic.properties() & QLowEnergyCharacteristic::WriteNoResponse)) { + } else if (mode == WriteWithoutResponse) { d->controller->writeCharacteristic(characteristic.d_ptr, characteristic.attributeHandle(), newValue, @@ -671,8 +679,8 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const serialised. A queue is employed when issuing multiple requests at the same time. The queue does not eliminate duplicated read requests for the same descriptor. - A descriptor can only be written if the service is in the \l ServiceDiscovered state, - belongs to the service and is readable. If one of those conditions is + A descriptor can only be written if the service is in the \l ServiceDiscovered state + and belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. \sa descriptorRead() @@ -708,7 +716,7 @@ void QLowEnergyService::readDescriptor( to B, the two write request are executed in the given order. A descriptor can only be written if this service is in the \l ServiceDiscovered state, - belongs to the service and is writable. If one of those conditions is + belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. */ void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index 51b0f53d..b5d89dd7 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -200,9 +200,9 @@ void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &ch, } // Don't write if properties don't permit it - if (mode == WriteWithResponse && (ch.properties() & QLowEnergyCharacteristic::Write)) + if (mode == WriteWithResponse) controller->writeCharacteristic(ch.d_ptr, ch.attributeHandle(), newValue, true); - else if (mode == WriteWithoutResponse && (ch.properties() & QLowEnergyCharacteristic::WriteNoResponse)) + else if (mode == WriteWithoutResponse) controller->writeCharacteristic(ch.d_ptr, ch.attributeHandle(), newValue, false); else d_ptr->setError(QLowEnergyService::OperationError); diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 7e96c204..5d7339a7 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -1801,8 +1801,8 @@ void tst_QLowEnergyController::tst_writeCharacteristic() QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000); QCOMPARE(errorSpy[0].at(0).value(), - QLowEnergyService::OperationError); - QCOMPARE(service->error(), QLowEnergyService::OperationError); + QLowEnergyService::CharacteristicWriteError); + QCOMPARE(service->error(), QLowEnergyService::CharacteristicWriteError); QCOMPARE(writeSpy.count(), 0); QCOMPARE(dataChar.value(), QByteArray::fromHex("3f00")); -- cgit v1.2.3 From e2e00f89b1ef52fcd18cf89e1205c761ec538393 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Apr 2015 08:49:46 +0200 Subject: Add QLEService tests dealing with read and write error cases Change-Id: If3ea946371583b0011e6fb9533d4d5789db3739b Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 230 +++++++++++++++++++++ 1 file changed, 230 insertions(+) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 5d7339a7..495af83c 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -86,6 +86,7 @@ private slots: void tst_writeCharacteristicNoResponse(); void tst_writeDescriptor(); void tst_customProgrammableDevice(); + void tst_errorCases(); private: void verifyServiceProperties(const QLowEnergyService *info); @@ -2219,6 +2220,235 @@ void tst_QLowEnergyController::tst_customProgrammableDevice() control.disconnectFromDevice(); } + +/* 1.) Test with undiscovered devices + - read and write invalid char + 2.) Test with discovered devices + - read non-readable char + - write non-writable char + */ +void tst_QLowEnergyController::tst_errorCases() +{ +#ifndef Q_OS_MAC + QList localAdapters = QBluetoothLocalDevice::allDevices(); + if (localAdapters.isEmpty() || remoteDevice.isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + + // quick setup - more elaborate test is done by connect() + QLowEnergyController control(remoteDevice); +#else + if (remoteDeviceInfo.deviceUuid().isNull()) + QSKIP("No local Bluetooth or remote BTLE device found. Skipping test."); + + QLowEnergyController control(remoteDeviceInfo); +#endif + QCOMPARE(control.error(), QLowEnergyController::NoError); + + control.connectToDevice(); + { + QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState, + 30000); + } + + if (control.state() == QLowEnergyController::ConnectingState + || control.error() != QLowEnergyController::NoError) { + // default BTLE backend forever hangs in ConnectingState + QSKIP("Cannot connect to remote device"); + } + + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); + QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); + control.discoverServices(); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(stateSpy.at(0).at(0).value(), + QLowEnergyController::DiscoveringState); + QCOMPARE(stateSpy.at(1).at(0).value(), + QLowEnergyController::DiscoveredState); + + + // Setup required uuids + const QBluetoothUuid irTemperaturServiceUuid(QStringLiteral("f000aa00-0451-4000-b000-000000000000")); + const QBluetoothUuid irCharUuid(QString("f000aa01-0451-4000-b000-000000000000")); + const QBluetoothUuid oadServiceUuid(QStringLiteral("f000ffc0-0451-4000-b000-000000000000")); + const QBluetoothUuid oadCharUuid(QString("f000ffc1-0451-4000-b000-000000000000")); + + QVERIFY(control.services().contains(irTemperaturServiceUuid)); + QVERIFY(control.services().contains(oadServiceUuid)); + + // Create service objects and basic tests + QLowEnergyService *irService = control.createServiceObject(irTemperaturServiceUuid); + QVERIFY(irService); + QCOMPARE(irService->state(), QLowEnergyService::DiscoveryRequired); + QVERIFY(irService->characteristics().isEmpty()); + QLowEnergyService *oadService = control.createServiceObject(oadServiceUuid); + QVERIFY(oadService); + QCOMPARE(oadService->state(), QLowEnergyService::DiscoveryRequired); + QVERIFY(oadService->characteristics().isEmpty()); + + QLowEnergyCharacteristic invalidChar; + QLowEnergyDescriptor invalidDesc; + + QVERIFY(!irService->contains(invalidChar)); + QVERIFY(!irService->contains(invalidDesc)); + + QSignalSpy irErrorSpy(irService, SIGNAL(error(QLowEnergyService::ServiceError))); + QSignalSpy oadErrorSpy(oadService, SIGNAL(error(QLowEnergyService::ServiceError))); + + QSignalSpy irReadSpy(irService, SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy irWrittenSpy(irService, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); + QSignalSpy irDescReadSpy(irService, SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray))); + QSignalSpy irDescWrittenSpy(irService, SIGNAL(descriptorWritten(QLowEnergyDescriptor,QByteArray))); + + QSignalSpy oadCharReadSpy(oadService, SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray))); + + // ******************************************************** + // Test read/write to discovered service + // with invalid characteristic & descriptor + + // discover IR Service + irService->discoverDetails(); + QTRY_VERIFY_WITH_TIMEOUT( + irService->state() == QLowEnergyService::ServiceDiscovered, 30000); + QVERIFY(!irService->contains(invalidChar)); + QVERIFY(!irService->contains(invalidDesc)); + irErrorSpy.clear(); + + // read invalid characteristic + irService->readCharacteristic(invalidChar); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QCOMPARE(irErrorSpy.count(), 1); + QVERIFY(irWrittenSpy.isEmpty()); + QVERIFY(irReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + irErrorSpy.clear(); + + // read invalid descriptor + irService->readDescriptor(invalidDesc); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QCOMPARE(irErrorSpy.count(), 1); + QVERIFY(irDescWrittenSpy.isEmpty()); + QVERIFY(irDescReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + irErrorSpy.clear(); + + // write invalid characteristic + irService->writeCharacteristic(invalidChar, QByteArray("foo")); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QCOMPARE(irErrorSpy.count(), 1); + QVERIFY(irWrittenSpy.isEmpty()); + QVERIFY(irReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + irErrorSpy.clear(); + + // write invalid descriptor + irService->readDescriptor(invalidDesc); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QCOMPARE(irErrorSpy.count(), 1); + QVERIFY(irDescWrittenSpy.isEmpty()); + QVERIFY(irDescReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + irErrorSpy.clear(); + + // ******************************************************** + // Test read/write to undiscovered service + // with invalid characteristic & descriptor + + // read invalid characteristic + oadService->readCharacteristic(invalidChar); + QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000); + QCOMPARE(oadErrorSpy.count(), 1); + QCOMPARE(oadErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + oadErrorSpy.clear(); + + // read invalid descriptor + oadService->readDescriptor(invalidDesc); + QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000); + QCOMPARE(oadErrorSpy.count(), 1); + QCOMPARE(oadErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + oadErrorSpy.clear(); + + // write invalid characteristic + oadService->writeCharacteristic(invalidChar, QByteArray("foo")); + QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000); + QCOMPARE(oadErrorSpy.count(), 1); + QCOMPARE(oadErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + oadErrorSpy.clear(); + + // write invalid descriptor + oadService->readDescriptor(invalidDesc); + QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000); + QCOMPARE(oadErrorSpy.count(), 1); + QCOMPARE(oadErrorSpy[0].at(0).value(), + QLowEnergyService::OperationError); + oadErrorSpy.clear(); + + // ******************************************************** + // Write to non-writable char + + QLowEnergyCharacteristic nonWritableChar = irService->characteristic(irCharUuid); + QVERIFY(nonWritableChar.isValid()); + // not writeable in any form + QVERIFY(!(nonWritableChar.properties() + & (QLowEnergyCharacteristic::Write|QLowEnergyCharacteristic::WriteNoResponse + |QLowEnergyCharacteristic::WriteSigned))); + irService->writeCharacteristic(nonWritableChar, QByteArray("ABCD")); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QVERIFY(irWrittenSpy.isEmpty()); + QVERIFY(irReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::CharacteristicWriteError); + irErrorSpy.clear(); + + // ******************************************************** + // Write to non-writable desc + // CharacteristicUserDescription is not writable + + QLowEnergyDescriptor nonWritableDesc = nonWritableChar.descriptor( + QBluetoothUuid::CharacteristicUserDescription); + QVERIFY(nonWritableDesc.isValid()); + irService->writeDescriptor(nonWritableDesc, QByteArray("ABCD")); + QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000); + QVERIFY(irWrittenSpy.isEmpty()); + QVERIFY(irReadSpy.isEmpty()); + QCOMPARE(irErrorSpy[0].at(0).value(), + QLowEnergyService::DescriptorWriteError); + irErrorSpy.clear(); + + + // ******************************************************** + // Read non-readable char + + // discover OAD Service + oadService->discoverDetails(); + QTRY_VERIFY_WITH_TIMEOUT( + oadService->state() == QLowEnergyService::ServiceDiscovered, 30000); + oadErrorSpy.clear(); + + // Test reading + QLowEnergyCharacteristic oadChar = oadService->characteristic(oadCharUuid); + QVERIFY(oadChar.isValid()); + oadService->readCharacteristic(oadChar); + QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000); + QCOMPARE(oadErrorSpy.count(), 1); + QVERIFY(oadCharReadSpy.isEmpty()); + QCOMPARE(oadErrorSpy[0].at(0).value(), + QLowEnergyService::CharacteristicReadError); + oadErrorSpy.clear(); + + delete irService; + delete oadService; + control.disconnectFromDevice(); +} + /* Tests write without responses. We utilize the Over-The-Air image update service of the SensorTag. -- cgit v1.2.3 From 5c13863d16ed1d54e4d4dfe25b9684425c8c03d5 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Apr 2015 09:14:06 +0200 Subject: Add tests for QLEService::readDescriptor() Change-Id: I84f6d76e89036d29f14f8ca326f3fa26e626ff63 Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 35 +++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 495af83c..8ef475a2 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -84,7 +84,7 @@ private slots: void tst_defaultBehavior(); void tst_writeCharacteristic(); void tst_writeCharacteristicNoResponse(); - void tst_writeDescriptor(); + void tst_readWriteDescriptor(); void tst_customProgrammableDevice(); void tst_errorCases(); private: @@ -1831,7 +1831,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic() delete service; } -void tst_QLowEnergyController::tst_writeDescriptor() +void tst_QLowEnergyController::tst_readWriteDescriptor() { #ifndef Q_OS_MAC QList localAdapters = QBluetoothLocalDevice::allDevices(); @@ -1910,9 +1910,11 @@ void tst_QLowEnergyController::tst_writeDescriptor() QCOMPARE(tempConfig.value(), QByteArray::fromHex("00")); } - // 3. Test writing to descriptor -> activate notifications + // 3. Test reading and writing to descriptor -> activate notifications QSignalSpy descWrittenSpy(service, SIGNAL(descriptorWritten(QLowEnergyDescriptor,QByteArray))); + QSignalSpy descReadSpy(service, + SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray))); QSignalSpy charWrittenSpy(service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray))); QSignalSpy charChangedSpy(service, @@ -1971,7 +1973,19 @@ void tst_QLowEnergyController::tst_writeDescriptor() service->writeCharacteristic(tempConfig, QByteArray::fromHex("00")); } - // 5. Test writing to descriptor -> deactivate notifications + // 5. Test reading and writing of/to descriptor -> deactivate notifications + + service->readDescriptor(notification); + QTRY_VERIFY_WITH_TIMEOUT(!descReadSpy.isEmpty(), 3000); + QCOMPARE(descReadSpy.count(), 1); + firstSignalData = descReadSpy.first(); + signalDesc = firstSignalData[0].value(); + signalValue = firstSignalData[1].toByteArray(); + QCOMPARE(signalValue, notification.value()); + QCOMPARE(notification.value(), QByteArray::fromHex("0100")); + descReadSpy.clear(); + + service->writeDescriptor(notification, QByteArray::fromHex("0000")); // verify QTRY_VERIFY_WITH_TIMEOUT(!descWrittenSpy.isEmpty(), 3000); @@ -2003,6 +2017,19 @@ void tst_QLowEnergyController::tst_writeDescriptor() QVERIFY(notification == signalDesc); } + + // 5. Test reading and writing of/to descriptor -> deactivate notifications + + service->readDescriptor(notification); + QTRY_VERIFY_WITH_TIMEOUT(!descReadSpy.isEmpty(), 3000); + QCOMPARE(descReadSpy.count(), 1); + firstSignalData = descReadSpy.first(); + signalDesc = firstSignalData[0].value(); + signalValue = firstSignalData[1].toByteArray(); + QCOMPARE(signalValue, notification.value()); + QCOMPARE(notification.value(), QByteArray::fromHex("0000")); + descReadSpy.clear(); + descWrittenSpy.clear(); // ******************************************* -- cgit v1.2.3 From 37837004b5d9b551c575c383395579b3d3a38c1c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Apr 2015 10:01:09 +0200 Subject: Further improve QLEService class docs with regards to recent changes. Change-Id: Iba3ec93eb4ad1e6bca30f5ddffde2c80fcd25063 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 59 +++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 8530c8b8..31ae0608 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -94,13 +94,37 @@ QT_BEGIN_NAMESPACE The values of characteristics and descriptors can be retrieved via \l QLowEnergyCharacteristic and \l QLowEnergyDescriptor, respectively. - However writing those attributes requires the service object. The - \l writeCharacteristic() function attempts to write a new value to the given + However, direct reading or writing of these attributes requires the service object. + The \l readCharacteristic() function attempts to re-read the value of a characteristic. + Although the initial service discovery may have obtained a value already this call may + be required in cases where the characteristic value constantly changes without + any notifications being provided. An example might be a time characteristic + that provides a continuous value. If the read attempt is successful, the + \l characteristicRead() signal is emitted. A failure to read the value triggers + the \l CharacteristicReadError. + The \l writeCharacteristic() function attempts to write a new value to the given characteristic. If the write attempt is successful, the \l characteristicWritten() signal is emitted. A failure to write triggers the \l CharacteristicWriteError. - Writing a descriptor follows the same pattern. Write requests are serialised. - Issuing a second write request before the previous request has finished - is delayed until the first write request has finished. + Reading and writing of descriptors follows the same pattern. + + Every attempt is made to read or write the value of a descriptor + or characteristic on the hardware. This means that meta information such as + \l QLowEnergyCharacteristic::properties() is generally ignored when reading and writing. + As an example, it is possible to call \l writeCharacteristic() despite the characteristic + being read-only based on its meta data description. The resulting write request is + forwarded to the connected device and it is up to the device to respond to the + potentially invalid request. In this case the result is the emission of the + \l CharacteristicWriteError in response to the returned device error. This behavior + simplies interaction with devices which report wrong meta information. + If it was not possible to forward the request to the remote device the + \l OperationError is set. A potential reason could be that the to-be-written + characteristic object does not even belong the current service. In + summary, the two types of errors permit a quick distinction of local + and remote error cases. + + All requests are serialised based on First-In First-Out principle. + For example, issuing a second write request, before the previous + write request has finished, is delayed until the first write request has finished. \note Currently, it is not possible to send signed write or reliable write requests. @@ -130,8 +154,8 @@ QT_BEGIN_NAMESPACE \snippet doc_src_qtbluetooth.cpp data_share_qlowenergyservice - Other operations such as calls to \l writeCharacteristic(), - writeDescriptor() or the invalidation of the service due to the + Other operations such as calls to \l readCharacteristic(), \l readDescriptor(), \l writeCharacteristic(), + \l writeDescriptor() or the invalidation of the service due to the related \l QLowEnergyController disconnecting from the device are shared the same way. @@ -561,11 +585,11 @@ bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. - \note Calling this function despite \l properties() reporting a non-readable property + \note Calling this function despite \l QLowEnergyCharacteristic::properties() reporting a non-readable property always attempts to read the characteristic's value on the hardware. If the hardware returns with an error the \l CharacteristicWriteError is set. - \sa characteristicRead() + \sa characteristicRead(), writeCharacteristic() \since 5.5 */ @@ -609,13 +633,14 @@ void QLowEnergyService::readCharacteristic( and belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. - \note Calling this function despite \l properties() reporting a non-writable property - always attempts to write to the hardware. Similarly, a \l WriteWithoutResponse - is sent to the hardware too although the characteristic may only support - \l WriteWithResponse. If the hardware returns with an error the - \l CharacteristicWriteError is set. + \note Calling this function despite \l QLowEnergyCharacteristic::properties() reporting + a non-writable property always attempts to write to the hardware. + Similarly, a \l WriteWithoutResponse is sent to the hardware too although the + characteristic may only support \l WriteWithResponse. If the hardware returns + with an error the \l CharacteristicWriteError is set. + + \sa QLowEnergyService::characteristicWritten(), QLowEnergyService::readCharacteristic() - \sa QLowEnergyCharacteristic::properties() */ void QLowEnergyService::writeCharacteristic( const QLowEnergyCharacteristic &characteristic, @@ -683,7 +708,7 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const and belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. - \sa descriptorRead() + \sa descriptorRead(), writeDescriptor() \since 5.5 */ @@ -718,6 +743,8 @@ void QLowEnergyService::readDescriptor( A descriptor can only be written if this service is in the \l ServiceDiscovered state, belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. + + \sa descriptorWritten(), readDescriptor() */ void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) -- cgit v1.2.3 From cfdd43d118fbc54a3157eb0c9f7c3ab2bf8cc822 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 9 Apr 2015 17:05:27 +0200 Subject: Android: Implement QLEService:readCharacateristic & readDescriptor In general we extend the concept of the write queue. Not only do we queue up write requests but also read requests. The handling of read errors is still missing. Right now the QLEService::error() signal is not emitted when a readCharacteristic() and readDescriptor() call fails. Change-Id: I4b4f086c351c4a29d6e48e8ee9079e9f33f36539 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 262 +++++++++++++++------ src/bluetooth/qlowenergycontroller_android.cpp | 63 ++++- 2 files changed, 251 insertions(+), 74 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index ffef93dd..6a283fb0 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -174,6 +174,7 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattCharacteristic characteristic, int status) { + // TODO test error handling for read requests if (status != BluetoothGatt.GATT_SUCCESS) { Log.w(TAG, "onCharacteristicRead error: " + status); return; @@ -222,10 +223,15 @@ public class QtBluetoothLE { return; } + synchronized (readWriteQueue) { + ioJobPending = false; + } + leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), foundHandle+1, characteristic.getUuid().toString(), characteristic.getProperties(), characteristic.getValue()); + performNextIO(); return; } @@ -263,11 +269,11 @@ public class QtBluetoothLE { errorCode = 2; break; // CharacteristicWriteError } - synchronized (writeQueue) { - writeJobPending = false; + synchronized (readWriteQueue) { + ioJobPending = false; } leCharacteristicWritten(qtObject, handle+1, characteristic.getValue(), errorCode); - performNextWrite(); + performNextIO(); } public void onCharacteristicChanged(android.bluetooth.BluetoothGatt gatt, @@ -333,9 +339,15 @@ public class QtBluetoothLE { if (foundHandle == -1) Log.w(TAG, "Out-of-detail-discovery: char update failed"); + synchronized (readWriteQueue) { + ioJobPending = false; + } + leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), descriptor.getCharacteristic().getUuid().toString(), foundHandle+1, descriptor.getUuid().toString(), descriptor.getValue()); + + performNextIO(); return; } @@ -386,12 +398,12 @@ public class QtBluetoothLE { errorCode = 3; break; // DescriptorWriteError } - synchronized (writeQueue) { - writeJobPending = false; + synchronized (readWriteQueue) { + ioJobPending = false; } leDescriptorWritten(qtObject, handle+1, descriptor.getValue(), errorCode); - performNextWrite(); + performNextIO(); } //TODO Requires Android API 21 which is not available on CI yet. // public void onReliableWriteCompleted(android.bluetooth.BluetoothGatt gatt, @@ -446,11 +458,18 @@ public class QtBluetoothLE { public BluetoothGattDescriptor descriptor = null; public int endHandle; } - private class WriteJob + + private enum IoJobType + { + Read, Write + } + + private class ReadWriteJob { public GattEntry entry; public byte[] newValue; public int requestedWriteType; + public IoJobType jobType; } private final Hashtable> uuidToEntry = new Hashtable>(100); @@ -458,8 +477,8 @@ public class QtBluetoothLE { private final LinkedList servicesToBeDiscovered = new LinkedList(); - private final LinkedList writeQueue = new LinkedList(); - private boolean writeJobPending; + private final LinkedList readWriteQueue = new LinkedList(); + private boolean ioJobPending; /* Internal helper function @@ -603,8 +622,8 @@ public class QtBluetoothLE { entries.clear(); servicesToBeDiscovered.clear(); } - synchronized (writeQueue) { - writeQueue.clear(); + synchronized (readWriteQueue) { + readWriteQueue.clear(); } } @@ -820,15 +839,16 @@ public class QtBluetoothLE { return false; } - WriteJob newJob = new WriteJob(); + ReadWriteJob newJob = new ReadWriteJob(); newJob.newValue = newValue; newJob.entry = entry; + newJob.jobType = IoJobType.Write; // writeMode must be in sync with QLowEnergyService::WriteMode // For now we ignore SignedWriteType as Qt doesn't support it yet. switch (writeMode) { case 1: //WriteWithoutResponse - newJob.requestedWriteType = BluetoothGattCharacteristic. WRITE_TYPE_NO_RESPONSE; + newJob.requestedWriteType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE; break; default: newJob.requestedWriteType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT; @@ -836,8 +856,8 @@ public class QtBluetoothLE { } boolean result; - synchronized (writeQueue) { - result = writeQueue.add(newJob); + synchronized (readWriteQueue) { + result = readWriteQueue.add(newJob); } if (!result) { @@ -845,7 +865,7 @@ public class QtBluetoothLE { return false; } - performNextWrite(); + performNextIO(); return true; } @@ -866,14 +886,15 @@ public class QtBluetoothLE { return false; } - WriteJob newJob = new WriteJob(); + ReadWriteJob newJob = new ReadWriteJob(); newJob.newValue = newValue; newJob.entry = entry; newJob.requestedWriteType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT; + newJob.jobType = IoJobType.Write; boolean result; - synchronized (writeQueue) { - result = writeQueue.add(newJob); + synchronized (readWriteQueue) { + result = readWriteQueue.add(newJob); } if (!result) { @@ -881,39 +902,126 @@ public class QtBluetoothLE { return false; } - performNextWrite(); + performNextIO(); + return true; + } + + /*************************************************************/ + /* Read Characteristics */ + /*************************************************************/ + + public boolean readCharacteristic(int charHandle) + { + if (mBluetoothGatt == null) + return false; + + GattEntry entry; + try { + entry = entries.get(charHandle-1); //Qt always uses handles+1 + } catch (IndexOutOfBoundsException ex) { + ex.printStackTrace(); + return false; + } + + ReadWriteJob newJob = new ReadWriteJob(); + newJob.entry = entry; + newJob.jobType = IoJobType.Read; + + boolean result; + synchronized (readWriteQueue) { + result = readWriteQueue.add(newJob); + } + + if (!result) { + Log.w(TAG, "Cannot add characteristic read request for " + charHandle + " to queue" ); + return false; + } + + performNextIO(); + return true; + } + + public boolean readDescriptor(int descHandle) + { + if (mBluetoothGatt == null) + return false; + + GattEntry entry; + try { + entry = entries.get(descHandle-1); //Qt always uses handles+1 + } catch (IndexOutOfBoundsException ex) { + ex.printStackTrace(); + return false; + } + + ReadWriteJob newJob = new ReadWriteJob(); + newJob.entry = entry; + newJob.jobType = IoJobType.Read; + + boolean result; + synchronized (readWriteQueue) { + result = readWriteQueue.add(newJob); + } + + if (!result) { + Log.w(TAG, "Cannot add descriptor read request for " + descHandle + " to queue" ); + return false; + } + + performNextIO(); return true; } /* - The queuing is required because two writeCharacteristic/writeDescriptor calls - cannot execute at the same time. The second write must happen after the - previous write has finished with on(Characteristic|Descriptor)Write(). - */ - private void performNextWrite() + The queuing is required because two writeCharacteristic/writeDescriptor calls + cannot execute at the same time. The second write must happen after the + previous write has finished with on(Characteristic|Descriptor)Write(). + */ + private void performNextIO() { if (mBluetoothGatt == null) return; boolean skip = false; - final WriteJob nextJob; - synchronized (writeQueue) { - if (writeQueue.isEmpty() || writeJobPending) + final ReadWriteJob nextJob; + synchronized (readWriteQueue) { + if (readWriteQueue.isEmpty() || ioJobPending) return; - nextJob = writeQueue.remove(); - boolean result; - switch (nextJob.entry.type) { - case Characteristic: - if (nextJob.entry.characteristic.getWriteType() != nextJob.requestedWriteType) { - nextJob.entry.characteristic.setWriteType(nextJob.requestedWriteType); - } - result = nextJob.entry.characteristic.setValue(nextJob.newValue); - if (!result || !mBluetoothGatt.writeCharacteristic(nextJob.entry.characteristic)) - skip = true; - break; - case Descriptor: - if (nextJob.entry.descriptor.getUuid().compareTo(clientCharacteristicUuid) == 0) { + nextJob = readWriteQueue.remove(); + + Log.w(TAG, "Performing queued job " + nextJob.jobType); + if (nextJob.jobType == IoJobType.Read) + skip = executeReadJob(nextJob); + else + skip = executeWriteJob(nextJob); + + if (!skip) + ioJobPending = true; + } + + if (skip) { + Log.w(TAG, "Skipping: " + nextJob.entry.type); + performNextIO(); + } + } + + // Runs inside the Mutex on readWriteQueue. + // Returns true if nextJob should be skipped. + private boolean executeWriteJob(ReadWriteJob nextJob) + { + boolean result; + switch (nextJob.entry.type) { + case Characteristic: + if (nextJob.entry.characteristic.getWriteType() != nextJob.requestedWriteType) { + nextJob.entry.characteristic.setWriteType(nextJob.requestedWriteType); + } + result = nextJob.entry.characteristic.setValue(nextJob.newValue); + if (!result || !mBluetoothGatt.writeCharacteristic(nextJob.entry.characteristic)) + return true; + break; + case Descriptor: + if (nextJob.entry.descriptor.getUuid().compareTo(clientCharacteristicUuid) == 0) { /* For some reason, Android splits characteristic notifications into two operations. BluetoothGatt.enableCharacteristicNotification @@ -931,42 +1039,56 @@ public class QtBluetoothLE { Bluetooth spec Vol 3, Part G, 4.11 . If neither of the two bits are set we disable the signals. */ - boolean enableNotifications = false; - int value = (nextJob.newValue[0] & 0xff); - // first or second bit must be set - if (((value & 0x1) == 1) || (((value >> 1) & 0x1) == 1)) { - enableNotifications = true; - } - - result = mBluetoothGatt.setCharacteristicNotification( - nextJob.entry.descriptor.getCharacteristic(), enableNotifications); - if (!result) { - Log.w(TAG, "Cannot set characteristic notification"); - //we continue anyway to ensure that we write the requested value - //to the device - } + boolean enableNotifications = false; + int value = (nextJob.newValue[0] & 0xff); + // first or second bit must be set + if (((value & 0x1) == 1) || (((value >> 1) & 0x1) == 1)) { + enableNotifications = true; + } - Log.d(TAG, "Enable notifications: " + enableNotifications); + result = mBluetoothGatt.setCharacteristicNotification( + nextJob.entry.descriptor.getCharacteristic(), enableNotifications); + if (!result) { + Log.w(TAG, "Cannot set characteristic notification"); + //we continue anyway to ensure that we write the requested value + //to the device } - result = nextJob.entry.descriptor.setValue(nextJob.newValue); - if (!result || !mBluetoothGatt.writeDescriptor(nextJob.entry.descriptor)) - skip = true; - break; - case Service: - case CharacteristicValue: - skip = true; - break; - } + Log.d(TAG, "Enable notifications: " + enableNotifications); + } - if (!skip) - writeJobPending = true; + result = nextJob.entry.descriptor.setValue(nextJob.newValue); + if (!result || !mBluetoothGatt.writeDescriptor(nextJob.entry.descriptor)) + return true; + break; + case Service: + case CharacteristicValue: + return true; } + return false; + } - if (skip) { - Log.w(TAG, "Skipping write: " + nextJob.entry.type); - performNextWrite(); + // Runs inside the Mutex on readWriteQueue. + // Returns true if nextJob should be skipped. + private boolean executeReadJob(ReadWriteJob nextJob) + { + boolean result; + switch (nextJob.entry.type) { + case Characteristic: + result = mBluetoothGatt.readCharacteristic(nextJob.entry.characteristic); + if (!result) + return true; // skip + break; + case Descriptor: + result = mBluetoothGatt.readDescriptor(nextJob.entry.descriptor); + if (!result) + return true; // skip + break; + case Service: + case CharacteristicValue: + return true; } + return false; } public native void leConnectionStateChange(long qtObject, int wasErrorTransition, int newState); diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 2794fe17..c1fa0813 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -236,18 +236,57 @@ void QLowEnergyControllerPrivate::writeDescriptor( } void QLowEnergyControllerPrivate::readCharacteristic( - const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/) + const QSharedPointer service, + const QLowEnergyHandle charHandle) { + Q_ASSERT(!service.isNull()); + + if (!service->characteristicList.contains(charHandle)) + return; + + QAndroidJniEnvironment env; + bool result = false; + if (hub) { + qCDebug(QT_BT_ANDROID) << "Read characteristic with handle" + << charHandle << service->uuid; + result = hub->javaObject().callMethod("readCharacteristic", + "(I)Z", charHandle); + } + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + result = false; + } + + if (!result) + service->setError(QLowEnergyService::CharacteristicWriteError); } void QLowEnergyControllerPrivate::readDescriptor( - const QSharedPointer /*service*/, + const QSharedPointer service, const QLowEnergyHandle /*charHandle*/, - const QLowEnergyHandle /*descriptorHandle*/) + const QLowEnergyHandle descriptorHandle) { + Q_ASSERT(!service.isNull()); + + QAndroidJniEnvironment env; + bool result = false; + if (hub) { + qCDebug(QT_BT_ANDROID) << "Read descriptor with handle" + << descriptorHandle << service->uuid; + result = hub->javaObject().callMethod("readDescriptor", + "(I)Z", descriptorHandle); + } + + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + result = false; + } + if (!result) + service->setError(QLowEnergyService::DescriptorWriteError); } void QLowEnergyControllerPrivate::connectionUpdated( @@ -390,6 +429,15 @@ void QLowEnergyControllerPrivate::characteristicRead( charDetails.value = data; //value handle always one larger than characteristics value handle charDetails.valueHandle = charHandle + 1; + + if (service->state == QLowEnergyService::ServiceDiscovered) { + QLowEnergyCharacteristic characteristic = characteristicForHandle(charHandle); + if (!characteristic.isValid()) { + qCWarning(QT_BT_ANDROID) << "characteristicRead: Cannot find characteristic"; + return; + } + emit service->characteristicRead(characteristic, data); + } } void QLowEnergyControllerPrivate::descriptorRead( @@ -421,6 +469,13 @@ void QLowEnergyControllerPrivate::descriptorRead( if (!entryUpdated) { qCWarning(QT_BT_ANDROID) << "Cannot find/update descriptor" << descUuid << charUuid << serviceUuid; + } else if (service->state == QLowEnergyService::ServiceDiscovered){ + QLowEnergyDescriptor descriptor = descriptorForHandle(descHandle); + if (!descriptor.isValid()) { + qCWarning(QT_BT_ANDROID) << "descriptorRead: Cannot find descriptor"; + return; + } + emit service->descriptorRead(descriptor, data); } } -- cgit v1.2.3 From 2675df60727b9221d2800b6172fbc05ea5437af0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 10 Apr 2015 11:25:52 +0200 Subject: Fix enum value break The new values CharacteristicReadError & DescriptorReadError were introduced in Qt 5.5 whereas all other values of the QLEService::ServiceError enum were introduced by Qt 5.4. The new values should not have been put in between the existing enum values as it breaks binary compatibility. Although the QLEService API is tech preview in Qt 5.4, there is no reason to break the compatibility here. In fact this broke the Android implementation as the enum values are hardcoded on the Java side. Change-Id: Ic263550f281e03c90f04ae8ae55d1054c1fd7ea6 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 78183c05..f3fa076b 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -55,11 +55,11 @@ public: enum ServiceError { NoError = 0, OperationError, - CharacteristicReadError, CharacteristicWriteError, - DescriptorReadError, DescriptorWriteError, - UnknownError + UnknownError, + CharacteristicReadError, + DescriptorReadError }; enum ServiceState { -- cgit v1.2.3 From 6bb265e12c1e59078da9e9190bb11f6ac957b2cd Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 10 Apr 2015 11:24:45 +0200 Subject: Android: Implement error reporting for char & desc reading Change-Id: I5652075b4fde4d4927e86f5394baf176f263104f Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- .../qt5/android/bluetooth/QtBluetoothLE.java | 64 ++++++++++++++++------ src/bluetooth/android/jni_android.cpp | 2 + src/bluetooth/android/lowenergynotificationhub.cpp | 15 +++++ src/bluetooth/android/lowenergynotificationhub_p.h | 3 + src/bluetooth/qlowenergycontroller_android.cpp | 12 ++++ src/bluetooth/qlowenergycontroller_p.h | 1 + 6 files changed, 80 insertions(+), 17 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 6a283fb0..40286271 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -174,10 +174,16 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattCharacteristic characteristic, int status) { - // TODO test error handling for read requests + //runningHandle is only used during serviceDetailsDiscovery + //If it is -1 we got an update outside of the details discovery process + final boolean isServiceDiscoveryRun = (runningHandle != -1); + if (status != BluetoothGatt.GATT_SUCCESS) { Log.w(TAG, "onCharacteristicRead error: " + status); - return; + + // read errors during serviceDiscovery are ignored + if (isServiceDiscoveryRun) + return; } synchronized (this) { @@ -185,10 +191,12 @@ public class QtBluetoothLE { return; } - //runningHandle is only used during serviceDetailsDiscovery - //If it is -1 we got an update outside of the details discovery process - if (runningHandle == -1) { - List handles = uuidToEntry.get(characteristic.getService().getUuid()); + // once we have a service discovery run we report regular changes + if (!isServiceDiscoveryRun) { + List handles; + synchronized (this) { + handles = uuidToEntry.get(characteristic.getService().getUuid()); + } if (handles == null || handles.isEmpty()) { Log.w(TAG, "Received Characteristic read update for unknown characteristic"); return; @@ -227,9 +235,15 @@ public class QtBluetoothLE { ioJobPending = false; } - leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), - foundHandle+1, characteristic.getUuid().toString(), - characteristic.getProperties(), characteristic.getValue()); + if (status == BluetoothGatt.GATT_SUCCESS) { + leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), + foundHandle + 1, characteristic.getUuid().toString(), + characteristic.getProperties(), characteristic.getValue()); + } else { + // This must be in sync with QLowEnergyService::CharacteristicReadError + final int characteristicReadError = 5; + leServiceError(qtObject, foundHandle +1, characteristicReadError); + } performNextIO(); return; @@ -292,9 +306,16 @@ public class QtBluetoothLE { android.bluetooth.BluetoothGattDescriptor descriptor, int status) { + //runningHandle is only used during serviceDetailsDiscovery + //If it is -1 we got an update outside of the details discovery process + final boolean isServiceDiscoveryRun = (runningHandle != -1); + if (status != BluetoothGatt.GATT_SUCCESS) { Log.w(TAG, "onDescriptorRead error: " + status); - return; + + // read errors during serviceDiscovery are ignored + if (isServiceDiscoveryRun) + return; } synchronized (this) { @@ -302,10 +323,12 @@ public class QtBluetoothLE { return; } - //runningHandle is only used during serviceDetailsDiscovery - //If it is -1 we got an update outside of the details discovery process - if (runningHandle == -1) { - List handles = uuidToEntry.get(descriptor.getCharacteristic().getService().getUuid()); + + if (!isServiceDiscoveryRun) { + List handles; + synchronized (this) { + handles = uuidToEntry.get(descriptor.getCharacteristic().getService().getUuid()); + } if (handles == null || handles.isEmpty()) { Log.w(TAG, "Received Descriptor read update for unknown descriptor"); return; @@ -343,9 +366,15 @@ public class QtBluetoothLE { ioJobPending = false; } - leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), - descriptor.getCharacteristic().getUuid().toString(), foundHandle+1, - descriptor.getUuid().toString(), descriptor.getValue()); + if (status == BluetoothGatt.GATT_SUCCESS) { + leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), + descriptor.getCharacteristic().getUuid().toString(), foundHandle + 1, + descriptor.getUuid().toString(), descriptor.getValue()); + } else { + // This must be in sync with QLowEnergyService::DescriptorReadError + final int descriptorReadError = 6; + leServiceError(qtObject, foundHandle + 1, descriptorReadError); + } performNextIO(); return; @@ -1105,5 +1134,6 @@ public class QtBluetoothLE { public native void leDescriptorWritten(long qtObject, int charHandle, byte[] newData, int errorCode); public native void leCharacteristicChanged(long qtObject, int charHandle, byte[] newData); + public native void leServiceError(long qtObject, int attributeHandle, int errorCode); } diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index a91b7c88..b4209500 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -215,6 +215,8 @@ static JNINativeMethod methods_le[] = { (void *) LowEnergyNotificationHub::lowEnergy_descriptorWritten}, {"leCharacteristicChanged", "(JI[B)V", (void *) LowEnergyNotificationHub::lowEnergy_characteristicChanged}, + {"leServiceError", "(JII)V", + (void *) LowEnergyNotificationHub::lowEnergy_serviceError}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 325178b2..9e95ece6 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -281,4 +281,19 @@ void LowEnergyNotificationHub::lowEnergy_characteristicChanged( Q_ARG(int, charHandle), Q_ARG(QByteArray, payload)); } +void LowEnergyNotificationHub::lowEnergy_serviceError( + JNIEnv *, jobject, jlong qtObject, jint attributeHandle, int errorCode) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QMetaObject::invokeMethod(hub, "serviceError", Qt::QueuedConnection, + Q_ARG(int, attributeHandle), + Q_ARG(QLowEnergyService::ServiceError, + (QLowEnergyService::ServiceError)errorCode)); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index b4c67b85..0395f9db 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -76,6 +76,8 @@ public: jint errorCode); static void lowEnergy_characteristicChanged(JNIEnv *, jobject, jlong qtObject, jint charHandle, jbyteArray data); + static void lowEnergy_serviceError(JNIEnv *, jobject, jlong qtObject, + jint attributeHandle, int errorCode); QAndroidJniObject javaObject() { @@ -98,6 +100,7 @@ signals: void descriptorWritten(int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); void characteristicChanged(int charHandle, const QByteArray &data); + void serviceError(int attributeHandle, QLowEnergyService::ServiceError errorCode); public slots: private: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index c1fa0813..992427ff 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -560,4 +560,16 @@ void QLowEnergyControllerPrivate::characteristicChanged( emit service->characteristicChanged(characteristic, data); } +void QLowEnergyControllerPrivate::serviceError( + int attributeHandle, QLowEnergyService::ServiceError errorCode) +{ + QSharedPointer service = + serviceForHandle(attributeHandle); + Q_ASSERT(!service.isNull()); + + // ATM we don't really use attributeHandle but later on we might + // want to associate the error code with a char or desc + service->setError(errorCode); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 9e2cedbc..ab90ab84 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -217,6 +217,7 @@ private slots: void descriptorWritten(int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); void characteristicChanged(int charHandle, const QByteArray &data); + void serviceError(int attributeHandle, QLowEnergyService::ServiceError errorCode); #endif private: QLowEnergyController *q_ptr; -- cgit v1.2.3 From 0cf802e9dd963e5eb881a3e849beb4143d7c304c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 10 Apr 2015 15:13:25 +0200 Subject: Android: Fix read/write error reports when failure during initial call The BluetoothGatt.[read|write][Characteristic|Descriptor]() functions may immediately return under certain circumstances such as writing a read-only characteristic. So far, this "synchronous" form of error reporting was not handled. Any read error during the initial service dioscovery and its related cache population continues to surpress any read errors. Change-Id: I4987f67f4a0d2afe58cd144a577a19e0f0d43b33 Reviewed-by: Timur Pocheptsov --- .../qt5/android/bluetooth/QtBluetoothLE.java | 32 ++++++++++++++++++++++ src/bluetooth/qlowenergycontroller_android.cpp | 6 ++++ 2 files changed, 38 insertions(+) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 40286271..7118ce24 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -1031,6 +1031,38 @@ public class QtBluetoothLE { if (skip) { Log.w(TAG, "Skipping: " + nextJob.entry.type); + + /* + BluetoothGatt.[read|write][Characteristic|Descriptor]() immediately + return in cases where meta data doesn't match the intended action + (e.g. trying to write to read-only char). When this happens + we have to report an error back to Qt. This is not required during + the initial service discovery though. + */ + final boolean isServiceDiscoveryRun = (runningHandle != -1); + if (!isServiceDiscoveryRun) { + int handle = -1; + if (nextJob.entry.type == GattEntryType.Characteristic) + handle = handleForCharacteristic(nextJob.entry.characteristic); + else + handle = handleForDescriptor(nextJob.entry.descriptor); + + if (handle != -1) { + int errorCode = 0; + + // The error codes below must be in sync with QLowEnergyService::ServiceError + if (nextJob.jobType == IoJobType.Read) { + errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ? + 5 : 6; // CharacteristicReadError : DescriptorReadError + } else { + errorCode = (nextJob.entry.type == GattEntryType.Characteristic) ? + 2 : 3; // CharacteristicWriteError : DescriptorWriteError + } + + leServiceError(qtObject, handle + 1, errorCode); + } + } + performNextIO(); } } diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 992427ff..f48c0e85 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -80,6 +80,8 @@ void QLowEnergyControllerPrivate::connectToDevice() this, &QLowEnergyControllerPrivate::descriptorWritten); connect(hub, &LowEnergyNotificationHub::characteristicChanged, this, &QLowEnergyControllerPrivate::characteristicChanged); + connect(hub, &LowEnergyNotificationHub::serviceError, + this, &QLowEnergyControllerPrivate::serviceError); } if (!hub->javaObject().isValid()) { @@ -563,6 +565,10 @@ void QLowEnergyControllerPrivate::characteristicChanged( void QLowEnergyControllerPrivate::serviceError( int attributeHandle, QLowEnergyService::ServiceError errorCode) { + // ignore call if it isn't really an error + if (errorCode == QLowEnergyService::NoError) + return; + QSharedPointer service = serviceForHandle(attributeHandle); Q_ASSERT(!service.isNull()); -- cgit v1.2.3 From ad8319475f5027880ffeea7af443562e707c68c3 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 10 Apr 2015 15:26:45 +0200 Subject: Make the QLEService unit test more error tolerant The service discovery sometimes takes longer than 10s on Adroid and there is really no point in testing the value of the System ID characteristic. This value is different for every device. Change-Id: Ib418e852e8a41db7483c5b47d2d0dc61f28b05b2 Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 8ef475a2..5faf5fee 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -322,7 +322,7 @@ void tst_QLowEnergyController::tst_connect() QSignalSpy serviceFoundSpy(&control, SIGNAL(serviceDiscovered(QBluetoothUuid))); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -475,7 +475,7 @@ void tst_QLowEnergyController::tst_concurrentDiscovery() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -533,7 +533,7 @@ void tst_QLowEnergyController::tst_concurrentDiscovery() QCOMPARE(control.state(), QLowEnergyController::ConnectedState); stateSpy.clear(); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -692,8 +692,9 @@ void tst_QLowEnergyController::verifyServiceProperties( QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp)); HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x12)); QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read); - QEXPECT_FAIL("", "The value is different on different devices", Continue); - QCOMPARE(chars[0].value(), QByteArray::fromHex("6e41ab0000296abc")); +// Do not read the System ID as it is different for every device +// QEXPECT_FAIL("", "The value is different on different devices", Continue); +// QCOMPARE(chars[0].value(), QByteArray::fromHex("6e41ab0000296abc")); QVERIFY(chars[0].isValid()); QVERIFY(info->contains(chars[0])); QCOMPARE(chars[0].descriptors().count(), 0); @@ -1687,7 +1688,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -1860,7 +1861,7 @@ void tst_QLowEnergyController::tst_readWriteDescriptor() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -2129,7 +2130,7 @@ void tst_QLowEnergyController::tst_customProgrammableDevice() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -2287,7 +2288,7 @@ void tst_QLowEnergyController::tst_errorCases() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); @@ -2513,7 +2514,7 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished())); QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState))); control.discoverServices(); - QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000); QCOMPARE(stateSpy.count(), 2); QCOMPARE(stateSpy.at(0).at(0).value(), QLowEnergyController::DiscoveringState); -- cgit v1.2.3 From c404946220004148faa0c38ffc7920b40fa625a2 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 14 Apr 2015 13:22:50 +0200 Subject: Misc fixes based on code review comments - doc fixes Change-Id: I4a5f413672d30c53be0cfcb022953e8ba3da6a83 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergyservice.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 31ae0608..f7a73326 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -115,7 +115,7 @@ QT_BEGIN_NAMESPACE forwarded to the connected device and it is up to the device to respond to the potentially invalid request. In this case the result is the emission of the \l CharacteristicWriteError in response to the returned device error. This behavior - simplies interaction with devices which report wrong meta information. + simplifies interaction with devices which report wrong meta information. If it was not possible to forward the request to the remote device the \l OperationError is set. A potential reason could be that the to-be-written characteristic object does not even belong the current service. In @@ -704,8 +704,8 @@ bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const serialised. A queue is employed when issuing multiple requests at the same time. The queue does not eliminate duplicated read requests for the same descriptor. - A descriptor can only be written if the service is in the \l ServiceDiscovered state - and belongs to the service. If one of these conditions is + A descriptor can only be read if the service is in the \l ServiceDiscovered state + and the descriptor belongs to the service. If one of these conditions is not true the \l QLowEnergyService::OperationError is set. \sa descriptorRead(), writeDescriptor() -- cgit v1.2.3 From 8589703bd4e377eeb2a01c43f0c13542f54133ba Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 15 Apr 2015 08:38:36 +0200 Subject: Android: Avoid code duplication and don't break readWriteQueue handleFor(Characteristic|Descriptor)() find a handle for a given char and desc. We should reuse it inside the read notifier for chars and descs. In addition, under certain circumstances the read/write queue operation was finished although the queue was not empty yet. This happened when the last read operation failed with a certain type of error. Now we always finish with a call to performNextIO(). Change-Id: Ifdb66c0b03d25ae19db7c49bcbe70eeec2665b6e Reviewed-by: Timur Pocheptsov --- .../qt5/android/bluetooth/QtBluetoothLE.java | 117 ++++++--------------- 1 file changed, 35 insertions(+), 82 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 7118ce24..f6c41e31 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -193,56 +193,29 @@ public class QtBluetoothLE { // once we have a service discovery run we report regular changes if (!isServiceDiscoveryRun) { - List handles; - synchronized (this) { - handles = uuidToEntry.get(characteristic.getService().getUuid()); - } - if (handles == null || handles.isEmpty()) { - Log.w(TAG, "Received Characteristic read update for unknown characteristic"); - return; - } - int serviceHandle = handles.get(0); - GattEntry entry; - int foundHandle = -1; - try { - for (int i = 1; serviceHandle + i < entries.size() && foundHandle == -1; i++) { - entry = entries.get(serviceHandle + i); - if (entry == null) - continue; - - if (entry.type == GattEntryType.Service) { - Log.w(TAG, "Out-of-detail-discovery: found unknown characteristic for known service"); - break; //reached next service -> unknown characteristic in service - } - - if (entry.type != GattEntryType.Characteristic) - continue; - if (entry.characteristic == characteristic) - foundHandle = serviceHandle + i; - } - } catch (IndexOutOfBoundsException ex) { - Log.w(TAG, "Out-of-detail-discovery: cannot find handle for characteristic"); - return; - } - - if (foundHandle == -1) { - Log.w(TAG, "Out-of-detail-discovery: char update failed"); - return; + int foundHandle = -1; + synchronized (this) { + foundHandle = handleForCharacteristic(characteristic); } synchronized (readWriteQueue) { ioJobPending = false; } - if (status == BluetoothGatt.GATT_SUCCESS) { - leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), - foundHandle + 1, characteristic.getUuid().toString(), - characteristic.getProperties(), characteristic.getValue()); + if (foundHandle == -1) { + Log.w(TAG, "Out-of-detail-discovery: char update failed. " + + "Cannot find handle for characteristic"); } else { - // This must be in sync with QLowEnergyService::CharacteristicReadError - final int characteristicReadError = 5; - leServiceError(qtObject, foundHandle +1, characteristicReadError); + if (status == BluetoothGatt.GATT_SUCCESS) { + leCharacteristicRead(qtObject, characteristic.getService().getUuid().toString(), + foundHandle + 1, characteristic.getUuid().toString(), + characteristic.getProperties(), characteristic.getValue()); + } else { + // This must be in sync with QLowEnergyService::CharacteristicReadError + final int characteristicReadError = 5; + leServiceError(qtObject, foundHandle + 1, characteristicReadError); + } } performNextIO(); @@ -325,55 +298,29 @@ public class QtBluetoothLE { if (!isServiceDiscoveryRun) { - List handles; - synchronized (this) { - handles = uuidToEntry.get(descriptor.getCharacteristic().getService().getUuid()); - } - if (handles == null || handles.isEmpty()) { - Log.w(TAG, "Received Descriptor read update for unknown descriptor"); - return; - } - int serviceHandle = handles.get(0); - GattEntry entry; int foundHandle = -1; - try { - for (int i = 1; serviceHandle + i < entries.size() && foundHandle == -1; i++) { - entry = entries.get(serviceHandle + i); - if (entry == null) - continue; - - if (entry.type == GattEntryType.Service) { - Log.w(TAG, "Out-of-detail-discovery: found unknown descriptor for known service"); - break; //reached next service -> unknown descriptor in service - } - - if (entry.type != GattEntryType.Descriptor) - continue; - - if (entry.descriptor == descriptor) - foundHandle = serviceHandle + i; - } - } catch (IndexOutOfBoundsException ex) { - Log.w(TAG, "Out-of-detail-discovery: cannot find handle for descriptor"); - return; + synchronized (this) { + foundHandle = handleForDescriptor(descriptor); } - if (foundHandle == -1) - Log.w(TAG, "Out-of-detail-discovery: char update failed"); - synchronized (readWriteQueue) { ioJobPending = false; } - if (status == BluetoothGatt.GATT_SUCCESS) { - leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), - descriptor.getCharacteristic().getUuid().toString(), foundHandle + 1, - descriptor.getUuid().toString(), descriptor.getValue()); + if (foundHandle == -1) { + Log.w(TAG, "Out-of-detail-discovery: char update failed. " + + "Cannot find handle for descriptor."); } else { - // This must be in sync with QLowEnergyService::DescriptorReadError - final int descriptorReadError = 6; - leServiceError(qtObject, foundHandle + 1, descriptorReadError); + if (status == BluetoothGatt.GATT_SUCCESS) { + leDescriptorRead(qtObject, descriptor.getCharacteristic().getService().getUuid().toString(), + descriptor.getCharacteristic().getUuid().toString(), foundHandle + 1, + descriptor.getUuid().toString(), descriptor.getValue()); + } else { + // This must be in sync with QLowEnergyService::DescriptorReadError + final int descriptorReadError = 6; + leServiceError(qtObject, foundHandle + 1, descriptorReadError); + } } performNextIO(); @@ -531,6 +478,9 @@ public class QtBluetoothLE { GattEntry entry; for (int i = serviceHandle+1; i < entries.size(); i++) { entry = entries.get(i); + if (entry == null) + continue; + switch (entry.type) { case Descriptor: case CharacteristicValue: @@ -569,6 +519,9 @@ public class QtBluetoothLE { GattEntry entry; for (int i = serviceHandle+1; i < entries.size(); i++) { entry = entries.get(i); + if (entry == null) + continue; + switch (entry.type) { case Characteristic: case CharacteristicValue: -- cgit v1.2.3 From 88ac6911d6f4f7ab7a7d8e02e0e9b8ede9b499a1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 17 Apr 2015 13:15:15 +0200 Subject: Fix trailing commas in enums This was caused by the new headersclean enforcing warnings as errors Change-Id: Idd595fc4cf78411a80ff3dbb46477d5130a04c3e Reviewed-by: Christian Stenger --- src/bluetooth/qbluetoothuuid.h | 5 ++--- src/bluetooth/qlowenergycontroller.h | 2 +- src/bluetooth/qlowenergyservice.h | 2 +- src/nfc/qnearfieldtarget.h | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index c4e7fb81..4646531c 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -77,7 +77,7 @@ public: UdiCPlain = 0x001D, McapControlChannel = 0x001E, McapDataChannel = 0x001F, - L2cap = 0x0100, + L2cap = 0x0100 }; enum ServiceClassUuid { @@ -171,8 +171,7 @@ public: UserData = 0x181c, WeightScale = 0x181d, BondManagement = 0x181e, - ContinuousGlucoseMonitoring = 0x181f, - + ContinuousGlucoseMonitoring = 0x181f }; enum CharacteristicType { diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h index 7906d257..1d29502b 100644 --- a/src/bluetooth/qlowenergycontroller.h +++ b/src/bluetooth/qlowenergycontroller.h @@ -62,7 +62,7 @@ public: ConnectedState, DiscoveringState, DiscoveredState, - ClosingState, + ClosingState }; enum RemoteAddressType { diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index f3fa076b..9b6e73f4 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -67,7 +67,7 @@ public: DiscoveryRequired, // we know start/end handle but nothing more //TODO Rename DiscoveringServices -> DiscoveringDetails or DiscoveringService DiscoveringServices,// discoverDetails() called and running - ServiceDiscovered, // all details have been synchronized + ServiceDiscovered // all details have been synchronized }; enum WriteMode { diff --git a/src/nfc/qnearfieldtarget.h b/src/nfc/qnearfieldtarget.h index 10c89a87..fef74946 100644 --- a/src/nfc/qnearfieldtarget.h +++ b/src/nfc/qnearfieldtarget.h @@ -63,7 +63,7 @@ public: NfcTagType2, NfcTagType3, NfcTagType4, - MifareTag, + MifareTag }; enum AccessMethod { -- cgit v1.2.3 From 2d4f7fd1f8d29175c8dab88a6d6cc72162511e1a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 17 Apr 2015 09:51:50 +0200 Subject: qndefnfcsmartposterrecord.h: Fix build with headersclean check. Skip check, required for qtbase/ 6668f5becfb8fcb6d10e42495c6ea5cdba2d15c5. Change-Id: Ie14c1f6201e60f71ce694323bf209422c7dba779 Reviewed-by: Alex Blasche --- src/nfc/qndefnfcsmartposterrecord.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/nfc/qndefnfcsmartposterrecord.h b/src/nfc/qndefnfcsmartposterrecord.h index d02cdabb..f390f730 100644 --- a/src/nfc/qndefnfcsmartposterrecord.h +++ b/src/nfc/qndefnfcsmartposterrecord.h @@ -40,6 +40,10 @@ #include #include +#if 0 +#pragma qt_sync_skip_header_check +#endif + QT_FORWARD_DECLARE_CLASS(QUrl) QT_BEGIN_NAMESPACE -- cgit v1.2.3 From b08fc0c605aa4e2f77d716f2e039af29dde9e243 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Fri, 10 Apr 2015 13:42:06 +0200 Subject: Bluetooth LE - add readCharacteristic/readDescriptor (OS X/iOS) Add read descriptor/characteristic support for iOS and OS X. Change-Id: If7547f3756dc37930052c9cefd243d6063bcab1c Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 243 +++++++++++++++++++++++------ src/bluetooth/osx/osxbtcentralmanager_p.h | 40 +++-- src/bluetooth/qlowenergycontroller_osx.mm | 74 +++++++++ src/bluetooth/qlowenergycontroller_osx_p.h | 11 ++ src/bluetooth/qlowenergyservice_osx.mm | 9 +- 5 files changed, 311 insertions(+), 66 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index bacea96b..08905da8 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -92,6 +92,8 @@ using namespace QT_NAMESPACE; - (void)discoverIncludedServices; - (void)readCharacteristics:(CBService *)service; - (void)serviceDetailsDiscoveryFinished:(CBService *)service; +- (void)performNextRequest; +- (void)performNextReadRequest; - (void)performNextWriteRequest; // Aux. functions. @@ -124,7 +126,8 @@ using namespace QT_NAMESPACE; delegate = aDelegate; currentService = 0; lastValidHandle = 0; - writePending = false; + requestPending = false; + currentReadHandle = 0; } return self; @@ -540,22 +543,81 @@ using namespace QT_NAMESPACE; delegate->serviceDetailsDiscoveryFinished(qtService); } -- (void)performNextWriteRequest +- (void)performNextRequest +{ + using namespace OSXBluetooth; + + if (requestPending || !requests.size()) + return; + + switch (requests.head().type) { + case LERequest::CharRead: + case LERequest::DescRead: + return [self performNextReadRequest]; + case LERequest::CharWrite: + case LERequest::DescWrite: + case LERequest::ClientConfiguration: + return [self performNextWriteRequest]; + default: + // Should never happen. + Q_ASSERT(0); + } +} + +- (void)performNextReadRequest { using namespace OSXBluetooth; Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); + Q_ASSERT_X(!requestPending, Q_FUNC_INFO, "processing another request"); + Q_ASSERT_X(requests.size(), Q_FUNC_INFO, "no requests to handle"); + Q_ASSERT_X(requests.head().type == LERequest::CharRead + || requests.head().type == LERequest::DescRead, + Q_FUNC_INFO, "not a read request"); + + const LERequest request(requests.dequeue()); + if (request.type == LERequest::CharRead) { + if (!charMap.contains(request.handle)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "characteristic with handle" + << request.handle << "not found"; + return [self performNextRequest]; + } - if (writePending || !writeQueue.size()) - return; + requestPending = true; + currentReadHandle = request.handle; + [peripheral readValueForCharacteristic:charMap[request.handle]]; + } else { + if (!descMap.contains(request.handle)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "descriptor with handle" + << request.handle << "not found"; + return [self performNextRequest]; + } + + requestPending = true; + currentReadHandle = request.handle; + [peripheral readValueForDescriptor:descMap[request.handle]]; + } +} - LEWriteRequest request(writeQueue.dequeue()); +- (void)performNextWriteRequest +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); + Q_ASSERT_X(!requestPending, Q_FUNC_INFO, "processing another request"); + Q_ASSERT_X(requests.size(), Q_FUNC_INFO, "no requests to handle"); + Q_ASSERT_X(requests.head().type == LERequest::CharWrite + || requests.head().type == LERequest::DescWrite + || requests.head().type == LERequest::ClientConfiguration, + Q_FUNC_INFO, "not a write request"); - if (request.isDescriptor) { + const LERequest request(requests.dequeue()); + + if (request.type == LERequest::DescWrite) { if (!descMap.contains(request.handle)) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "handle: " << request.handle << " not found"; - return [self performNextWriteRequest]; + return [self performNextRequest]; } CBDescriptor *const descriptor = descMap[request.handle]; @@ -564,58 +626,58 @@ using namespace QT_NAMESPACE; // Even if qtData.size() == 0, we still need NSData object. qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed " "to allocate an NSData object"; - return [self performNextWriteRequest]; + return [self performNextRequest]; } if (![self cacheWriteValue:request.value for:descriptor]) - return [self performNextWriteRequest]; + return [self performNextRequest]; - writePending = true; + requestPending = true; return [peripheral writeValue:data.data() forDescriptor:descriptor]; } else { if (!charMap.contains(request.handle)) { qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "characteristic with " "handle: " << request.handle << " not found"; - return [self performNextWriteRequest]; + return [self performNextRequest]; } CBCharacteristic *const characteristic = charMap[request.handle]; - if (request.isClientConfiguration) { + if (request.type == LERequest::ClientConfiguration) { const QBluetoothUuid qtUuid(QBluetoothUuid::ClientCharacteristicConfiguration); CBDescriptor *const descriptor = [self descriptor:qtUuid forCharacteristic:characteristic]; Q_ASSERT_X(descriptor, Q_FUNC_INFO, "no client characteristic " "configuration descriptor found"); if (![self cacheWriteValue:request.value for:descriptor]) - return [self performNextWriteRequest]; + return [self performNextRequest]; bool enable = false; if (request.value.size()) enable = request.value[0] & 3; - writePending = true; + requestPending = true; [peripheral setNotifyValue:enable forCharacteristic:characteristic]; } else { ObjCStrongReference data(data_from_bytearray(request.value)); if (!data) { // Even if qtData.size() == 0, we still need NSData object. qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "failed to allocate NSData object"; - return [self performNextWriteRequest]; + return [self performNextRequest]; } // TODO: check what happens if I'm using NSData with length 0. if (request.withResponse) { if (![self cacheWriteValue:request.value for:characteristic]) - return [self performNextWriteRequest]; + return [self performNextRequest]; - writePending = true; + requestPending = true; [peripheral writeValue:data.data() forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; } else { [peripheral writeValue:data.data() forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse]; - [self performNextWriteRequest]; + [self performNextRequest]; } } } @@ -624,6 +686,8 @@ using namespace QT_NAMESPACE; - (bool)setNotifyValue:(const QByteArray &)value forCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle { + using namespace OSXBluetooth; + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle (0)"); Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); @@ -643,17 +707,37 @@ using namespace QT_NAMESPACE; return false; } - OSXBluetooth::LEWriteRequest request; - request.isDescriptor = false; - request.isClientConfiguration = true; + LERequest request; + request.type = LERequest::ClientConfiguration; request.handle = charHandle; request.value = value; - writeQueue.enqueue(request); - [self performNextWriteRequest]; - // TODO: check if I need a special map - to reset notify to NO - // before disconnect/dealloc later! Also, this can be needed if notify was set - // to YES from another application - to be tested. + requests.enqueue(request); + [self performNextRequest]; + + return true; +} + +- (bool)readCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle (0)"); + + QT_BT_MAC_AUTORELEASEPOOL; + + if (!charMap.contains(charHandle)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "characteristic: " << charHandle << " not found"; + return false; + } + + LERequest request; + request.type = LERequest::CharRead; + request.handle = charHandle; + + requests.enqueue(request); + [self performNextRequest]; + return true; } @@ -672,14 +756,36 @@ using namespace QT_NAMESPACE; return false; } - LEWriteRequest request; - request.isDescriptor = false; + LERequest request; + request.type = LERequest::CharWrite; request.withResponse = withResponse; request.handle = charHandle; request.value = value; - writeQueue.enqueue(request); - [self performNextWriteRequest]; + requests.enqueue(request); + [self performNextRequest]; + + return true; +} + +- (bool)readDescriptor:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))descHandle +{ + using namespace OSXBluetooth; + + Q_ASSERT_X(descHandle, Q_FUNC_INFO, "invalid descriptor handle (0)"); + + if (!descMap.contains(descHandle)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "handle:" + << descHandle << "not found"; + return false; + } + + LERequest request; + request.type = LERequest::DescRead; + request.handle = descHandle; + + requests.enqueue(request); + [self performNextRequest]; return true; } @@ -696,13 +802,13 @@ using namespace QT_NAMESPACE; return false; } - LEWriteRequest request; - request.isDescriptor = true; + LERequest request; + request.type = LERequest::DescWrite; request.handle = descHandle; request.value = value; - writeQueue.enqueue(request); - [self performNextWriteRequest]; + requests.enqueue(request); + [self performNextRequest]; return true; } @@ -906,15 +1012,15 @@ using namespace QT_NAMESPACE; - (void)reset { - writePending = false; + requestPending = false; valuesToWrite.clear(); - writeQueue.clear(); + requests.clear(); servicesToDiscoverDetails.clear(); lastValidHandle = 0; serviceMap.clear(); charMap.clear(); descMap.clear(); - + currentReadHandle = 0; // TODO: also serviceToVisit/VisitNext and visitedServices ? } @@ -1193,7 +1299,8 @@ using namespace QT_NAMESPACE; } } -- (void)peripheral:(CBPeripheral *)aPeripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic +- (void)peripheral:(CBPeripheral *)aPeripheral + didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { Q_UNUSED(aPeripheral) @@ -1202,18 +1309,25 @@ using namespace QT_NAMESPACE; Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); + Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); QT_BT_MAC_AUTORELEASEPOOL; // First, let's check if we're discovering a service details now. CBService *const service = characteristic.service; const QBluetoothUuid qtUuid(qt_uuid(service.UUID)); const bool isDetailsDiscovery = servicesToDiscoverDetails.contains(qtUuid); + const QLowEnergyHandle chHandle = charMap.key(characteristic); if (error) { // Use NSLog, not qCDebug/qCWarning to log the actual error. NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); if (!isDetailsDiscovery) { - // TODO: this can be something else in a future (if needed at all). + if (chHandle && chHandle == currentReadHandle) { + currentReadHandle = 0; + requestPending = false; + delegate->error(qtUuid, QLowEnergyService::CharacteristicReadError); + [self performNextRequest]; + } return; } } @@ -1228,7 +1342,6 @@ using namespace QT_NAMESPACE; [self discoverDescriptors:characteristic.service]; } else { // This is (probably) the result of update notification. - const QLowEnergyHandle chHandle = charMap.key(characteristic); // It's very possible we can have an invalid handle here (0) - // if something esle is wrong (we subscribed for a notification), // disconnected (but other application is connected) and still receiveing @@ -1240,9 +1353,17 @@ using namespace QT_NAMESPACE; return; } - Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); - delegate->characteristicUpdateNotification(chHandle, - qt_bytearray(characteristic.value)); + if (currentReadHandle == chHandle) { + // Even if it was not a reply to our read request (no way to test it) + // report it. + requestPending = false; + currentReadHandle = 0; + // + delegate->characteristicReadNotification(chHandle, qt_bytearray(characteristic.value)); + [self performNextRequest]; + } else { + delegate->characteristicUpdateNotification(chHandle, qt_bytearray(characteristic.value)); + } } } @@ -1261,7 +1382,7 @@ using namespace QT_NAMESPACE; if (error) { // Log the error using NSLog: NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); - // Probably, we can continue though ... + // We can continue though ... } // Do we have more characteristics on this service to discover descriptors? @@ -1288,12 +1409,19 @@ using namespace QT_NAMESPACE; CBService *const service = descriptor.characteristic.service; const QBluetoothUuid qtUuid(qt_uuid(service.UUID)); const bool isDetailsDiscovery = servicesToDiscoverDetails.contains(qtUuid); + const QLowEnergyHandle dHandle = descMap.key(descriptor); if (error) { // NSLog to log the actual error ... NSLog(@"%s failed with error %@", Q_FUNC_INFO, error); + if (!isDetailsDiscovery) { - // TODO: probably will be required in a future. + if (dHandle && dHandle == currentReadHandle) { + currentReadHandle = 0; + requestPending = false; + delegate->error(qtUuid, QLowEnergyService::DescriptorReadError); + [self performNextRequest]; + } return; } } @@ -1322,7 +1450,18 @@ using namespace QT_NAMESPACE; [self serviceDetailsDiscoveryFinished:service]; } } else { - // TODO: this can be something else in a future (if needed at all). + if (!dHandle) { + qCCritical(QT_BT_OSX) << Q_FUNC_INFO << "unexpected value update notification, " + "no descriptor handle found"; + return; + } + + if (dHandle == currentReadHandle) { + currentReadHandle = 0; + requestPending = false; + delegate->descriptorReadNotification(dHandle, qt_bytearray(static_cast(descriptor.value))); + [self performNextRequest]; + } } } @@ -1344,7 +1483,7 @@ using namespace QT_NAMESPACE; QT_BT_MAC_AUTORELEASEPOOL; - writePending = false; + requestPending = false; Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (null)"); @@ -1368,7 +1507,7 @@ using namespace QT_NAMESPACE; delegate->characteristicWriteNotification(cHandle, valueToReport); } - [self performNextWriteRequest]; + [self performNextRequest]; } - (void)peripheral:(CBPeripheral *)aPeripheral @@ -1383,7 +1522,7 @@ using namespace QT_NAMESPACE; QT_BT_MAC_AUTORELEASEPOOL; - writePending = false; + requestPending = false; using namespace OSXBluetooth; @@ -1404,7 +1543,7 @@ using namespace QT_NAMESPACE; delegate->descriptorWriteNotification(dHandle, valueToReport); } - [self performNextWriteRequest]; + [self performNextRequest]; } - (void)peripheral:(CBPeripheral *)aPeripheral @@ -1417,7 +1556,7 @@ using namespace QT_NAMESPACE; QT_BT_MAC_AUTORELEASEPOOL; - writePending = false; + requestPending = false; Q_ASSERT_X(delegate, Q_FUNC_INFO, "invalid delegate (nil)"); @@ -1446,7 +1585,7 @@ using namespace QT_NAMESPACE; } } - [self performNextWriteRequest]; + [self performNextRequest]; } @end diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index b1908a48..e8d7d234 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -72,10 +72,14 @@ public: virtual void connectSuccess() = 0; virtual void serviceDiscoveryFinished(LEServices services) = 0; virtual void serviceDetailsDiscoveryFinished(LEService service) = 0; + virtual void characteristicReadNotification(QLowEnergyHandle charHandle, + const QByteArray &value) = 0; virtual void characteristicWriteNotification(QLowEnergyHandle charHandle, const QByteArray &value) = 0; virtual void characteristicUpdateNotification(QLowEnergyHandle charHandle, const QByteArray &value) = 0; + virtual void descriptorReadNotification(QLowEnergyHandle descHandle, + const QByteArray &value) = 0; virtual void descriptorWriteNotification(QLowEnergyHandle descHandle, const QByteArray &value) = 0; virtual void disconnected() = 0; @@ -111,23 +115,30 @@ typedef QHash ServiceHash; typedef QHash CharHash; typedef QHash DescHash; -// Descriptor write request - we have to serialize 'concurrent' write requests. -struct LEWriteRequest -{ - LEWriteRequest() : isDescriptor(false), - isClientConfiguration(false), - withResponse(false), - handle(0) +// Descriptor/charactesirsti read/write requests +// - we have to serialize 'concurrent' write requests. +struct LERequest { + enum RequestType { + CharRead, + CharWrite, + DescRead, + DescWrite, + ClientConfiguration, + Invalid + }; + + LERequest() : type(Invalid), + withResponse(false), + handle(0) {} - bool isDescriptor; - bool isClientConfiguration; + RequestType type; bool withResponse; QLowEnergyHandle handle; QByteArray value; }; -typedef QQueue WriteQueue; +typedef QQueue RequestQueue; // Core Bluetooth's write confirmation does not provide // the updated value (characteristic or descriptor). @@ -170,8 +181,9 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(QLowEnergyHandle) lastValidHandle; - bool writePending; - QT_PREPEND_NAMESPACE(OSXBluetooth)::WriteQueue writeQueue; + bool requestPending; + QT_PREPEND_NAMESPACE(OSXBluetooth)::RequestQueue requests; + QT_PREPEND_NAMESPACE(QLowEnergyHandle) currentReadHandle; QT_PREPEND_NAMESPACE(OSXBluetooth)::ValueHash valuesToWrite; } @@ -190,10 +202,14 @@ QT_END_NAMESPACE - (bool)setNotifyValue:(const QT_PREPEND_NAMESPACE(QByteArray) &)value forCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle; +- (bool)readCharacteristic:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle; + - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value charHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))charHandle withResponse:(bool)writeWithResponse; +- (bool)readDescriptor:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))descHandle; + - (bool)write:(const QT_PREPEND_NAMESPACE(QByteArray) &)value descHandle:(QT_PREPEND_NAMESPACE(QLowEnergyHandle))descHandle; @end diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 80a94d64..e3cf57b1 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -308,6 +308,27 @@ void QLowEnergyControllerPrivateOSX::serviceDetailsDiscoveryFinished(LEService s qtService->setState(QLowEnergyService::ServiceDiscovered); } +void QLowEnergyControllerPrivateOSX::characteristicReadNotification(QLowEnergyHandle charHandle, + const QByteArray &value) +{ + Q_ASSERT_X(charHandle, Q_FUNC_INFO, "invalid characteristic handle(0)"); + + ServicePrivate service(serviceForHandle(charHandle)); + if (service.isNull()) + return; + + QLowEnergyCharacteristic characteristic(characteristicForHandle(charHandle)); + if (!characteristic.isValid()) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown characteristic"; + return; + } + + if (characteristic.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, value, false); + + emit service->characteristicRead(characteristic, value); +} + void QLowEnergyControllerPrivateOSX::characteristicWriteNotification(QLowEnergyHandle charHandle, const QByteArray &value) { @@ -361,6 +382,21 @@ void QLowEnergyControllerPrivateOSX::characteristicUpdateNotification(QLowEnergy emit service->characteristicChanged(characteristic, value); } +void QLowEnergyControllerPrivateOSX::descriptorReadNotification(QLowEnergyHandle dHandle, const QByteArray &value) +{ + Q_ASSERT_X(dHandle, Q_FUNC_INFO, "invalid descriptor handle (0)"); + + const QLowEnergyDescriptor qtDescriptor(descriptorForHandle(dHandle)); + if (!qtDescriptor.isValid()) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "unknown descriptor " << dHandle; + return; + } + + ServicePrivate service(serviceForHandle(qtDescriptor.characteristicHandle())); + updateValueOfDescriptor(qtDescriptor.characteristicHandle(), dHandle, value, false); + emit service->descriptorRead(qtDescriptor, value); +} + void QLowEnergyControllerPrivateOSX::descriptorWriteNotification(QLowEnergyHandle dHandle, const QByteArray &value) { Q_ASSERT_X(dHandle, Q_FUNC_INFO, "invalid descriptor handle (0)"); @@ -549,6 +585,28 @@ void QLowEnergyControllerPrivateOSX::setNotifyValue(QSharedPointersetError(QLowEnergyService::DescriptorWriteError); } +void QLowEnergyControllerPrivateOSX::readCharacteristic(QSharedPointer service, + QLowEnergyHandle charHandle) +{ + Q_ASSERT_X(!service.isNull(), Q_FUNC_INFO, "invalid service (null)"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid controller"); + + if (!discoveredServices.contains(service->uuid)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no service with uuid:" + << service->uuid << "found"; + return; + } + + if (!service->characteristicList.contains(charHandle)) { + qCDebug(QT_BT_OSX) << Q_FUNC_INFO << "no characteristic with handle:" + << charHandle << "found"; + return; + } + + if (![centralManager readCharacteristic:charHandle]) + service->setError(QLowEnergyService::CharacteristicReadError); +} + void QLowEnergyControllerPrivateOSX::writeCharacteristic(QSharedPointer service, QLowEnergyHandle charHandle, const QByteArray &newValue, bool writeWithResponse) @@ -595,6 +653,22 @@ quint16 QLowEnergyControllerPrivateOSX::updateValueOfCharacteristic(QLowEnergyHa return 0; } +void QLowEnergyControllerPrivateOSX::readDescriptor(QSharedPointer service, + QLowEnergyHandle descriptorHandle) +{ + Q_ASSERT_X(!service.isNull(), Q_FUNC_INFO, "invalid service (null)"); + Q_ASSERT_X(isValid(), Q_FUNC_INFO, "invalid controller"); + + if (!discoveredServices.contains(service->uuid)) { + qCWarning(QT_BT_OSX) << Q_FUNC_INFO << "no service with uuid:" + << service->uuid << "found"; + return; + } + + if (![centralManager readDescriptor:descriptorHandle]) + service->setError(QLowEnergyService::DescriptorReadError); +} + void QLowEnergyControllerPrivateOSX::writeDescriptor(QSharedPointer service, QLowEnergyHandle descriptorHandle, const QByteArray &newValue) diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index d9457217..96af6db0 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -72,10 +72,14 @@ private: void serviceDiscoveryFinished(LEServices services) Q_DECL_OVERRIDE; void serviceDetailsDiscoveryFinished(LEService service) Q_DECL_OVERRIDE; + void characteristicReadNotification(QLowEnergyHandle charHandle, + const QByteArray &value) Q_DECL_OVERRIDE; void characteristicWriteNotification(QLowEnergyHandle charHandle, const QByteArray &newValue) Q_DECL_OVERRIDE; void characteristicUpdateNotification(QLowEnergyHandle charHandle, const QByteArray &value) Q_DECL_OVERRIDE; + void descriptorReadNotification(QLowEnergyHandle descHandle, + const QByteArray &value) Q_DECL_OVERRIDE; void descriptorWriteNotification(QLowEnergyHandle descHandle, const QByteArray &newValue) Q_DECL_OVERRIDE; void disconnected() Q_DECL_OVERRIDE; @@ -89,9 +93,14 @@ private: void discoverServices(); void discoverServiceDetails(const QBluetoothUuid &serviceUuid); + // TODO: all these read/write /setNotify can be simplified - + // by just passing either characteristic or descriptor (that + // has all needed information - service, handle, etc.). void setNotifyValue(QSharedPointer service, QLowEnergyHandle charHandle, const QByteArray &newValue); + void readCharacteristic(QSharedPointer service, + QLowEnergyHandle charHandle); void writeCharacteristic(QSharedPointer service, QLowEnergyHandle charHandle, const QByteArray &newValue, bool writeWithResponse); @@ -100,6 +109,8 @@ private: const QByteArray &value, bool appendValue); + void readDescriptor(QSharedPointer service, + QLowEnergyHandle charHandle); void writeDescriptor(QSharedPointer service, QLowEnergyHandle descriptorHandle, const QByteArray &newValue); diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm index b5d89dd7..b424dc96 100644 --- a/src/bluetooth/qlowenergyservice_osx.mm +++ b/src/bluetooth/qlowenergyservice_osx.mm @@ -76,6 +76,11 @@ QLowEnergyService::QLowEnergyService(QSharedPointer d, this, SIGNAL(characteristicWritten(QLowEnergyCharacteristic, QByteArray))); connect(d.data(), SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray)), this, SIGNAL(descriptorWritten(QLowEnergyDescriptor, QByteArray))); + connect(d.data(), SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)), + this, SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray))); + connect(d.data(), SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray)), + this, SIGNAL(descriptorRead(QLowEnergyDescriptor,QByteArray))); + } QLowEnergyService::~QLowEnergyService() @@ -185,7 +190,7 @@ void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &chara return; } - //TODO implement QLowEnergyService::readCharacteristic() on iOS/OSX + controller->readCharacteristic(characteristic.d_ptr, characteristic.attributeHandle()); } @@ -234,7 +239,7 @@ void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor) return; } - //TODO implement QLowEnergyService::readDescriptor() on iOS/OSX + controller->readDescriptor(descriptor.d_ptr, descriptor.handle()); } void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, -- cgit v1.2.3